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

    <title>Something or other, whatever!</title>
    <subtitle>Christian Lawson-Perfect's homepage</subtitle>
    <link href="https://somethingorotherwhatever.com/"/>
    <link href="https://somethingorotherwhatever.com/atom.xml" rel="self" type="application/atom+xml" />
    <updated>2026-04-26T07:57:33.656933Z</updated>
    <author>
        <name>Christian Lawson-Perfect</name>
    </author>
    <id>https://somethingorotherwhatever.com/atom.xml</id>

    
    <entry>
        <title>Easter bunny surveillance</title>
        <link href="https://somethingorotherwhatever.com/items/easter-bunny-surveillance"/>
        <id>https://somethingorotherwhatever.com/items/easter-bunny-surveillance</id>
        <updated>2026-04-04T16:53:07.532000Z</updated>
        <summary type="html"><![CDATA[<p>A pretend 'app' I made to give the kids clues for their Easter egg hunt. Each sample is a short sound recording of something in the house.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/easter-bunny-surveillance/main.png" />
                
                
                    <p>A pretend 'app' I made to give the kids clues for their Easter egg hunt. Each sample is a short sound recording of something in the house.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Lawsolar-panelfect</title>
        <link href="https://somethingorotherwhatever.com/items/lawsolar-panelfect"/>
        <id>https://somethingorotherwhatever.com/items/lawsolar-panelfect</id>
        <updated>2026-03-29T14:47:40.865000Z</updated>
        <summary type="html"><![CDATA[<p>A chart showing the status of our FoxESS solar panel and battery system. Needs an API token and device ID to work.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/lawsolar-panelfect/main.png" />
                
                
                    <p>A chart showing the status of our FoxESS solar panel and battery system. Needs an API token and device ID to work.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>DIG display screen</title>
        <link href="https://somethingorotherwhatever.com/items/dig-display-screen"/>
        <id>https://somethingorotherwhatever.com/items/dig-display-screen</id>
        <updated>2026-03-24T10:05:28.121000Z</updated>
        <summary type="html"><![CDATA[<p>A display screen for a Disability Interest Group conference stand.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/dig-display-screen/main.png" />
                
                
                    <p>A display screen for a Disability Interest Group conference stand.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Word domino maker</title>
        <link href="https://somethingorotherwhatever.com/items/word-domino-maker"/>
        <id>https://somethingorotherwhatever.com/items/word-domino-maker</id>
        <updated>2026-02-23T10:49:12.927000Z</updated>
        <summary type="html"><![CDATA[<p>A tool to make sets of dominoes with words on. My mum asked me to make a set of dominoes with words in French and English, which prompted a lot of maths thinking about whether you could make it work the same way as a standard set of dominoes.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/word-domino-maker/main.png" />
                
                
                    <p>A tool to make sets of dominoes with words on. My mum asked me to make a set of dominoes with words in French and English, which prompted a lot of maths thinking about whether you could make it work the same way as a standard set of dominoes.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Prime power factor graph</title>
        <link href="https://somethingorotherwhatever.com/items/prime-power-factor-graph"/>
        <id>https://somethingorotherwhatever.com/items/prime-power-factor-graph</id>
        <updated>2026-02-07T14:11:01.859000Z</updated>
        <summary type="html"><![CDATA[<p>An attempt to draw the graph of natural numbers, where each number is linked to the result of dividing by its greatest prime power factor.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <video autoplay src="https://somethingorotherwhatever.com/items/prime-power-factor-graph/main.mp4"></video>
                
                
                    <p>An attempt to draw the graph of natural numbers, where each number is linked to the result of dividing by its greatest prime power factor.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Number builder</title>
        <link href="https://somethingorotherwhatever.com/items/number-builder"/>
        <id>https://somethingorotherwhatever.com/items/number-builder</id>
        <updated>2026-02-06T07:51:57.546000Z</updated>
        <summary type="html"><![CDATA[<p>How quickly can you get to the target number by building up from 1, using only arithmetic operations?</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/number-builder/main.png" />
                
                
                    <p>How quickly can you get to the target number by building up from 1, using only arithmetic operations?</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Marking sets</title>
        <link href="https://somethingorotherwhatever.com/items/marking-sets"/>
        <id>https://somethingorotherwhatever.com/items/marking-sets</id>
        <updated>2026-01-16T10:16:15.195000Z</updated>
        <summary type="html"><![CDATA[<p>How should we mark (multi-)sets of objects given by the student?</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/marking-sets/main.png" />
                
                
                    <p>How should we mark (multi-)sets of objects given by the student?</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Random emoji</title>
        <link href="https://somethingorotherwhatever.com/items/random-emoji"/>
        <id>https://somethingorotherwhatever.com/items/random-emoji</id>
        <updated>2026-01-15T12:23:23.118000Z</updated>
        <summary type="html"><![CDATA[<p>A page which shows a randomly picked emoji.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/random-emoji/main.png" />
                
                
                    <p>From https://github.com/samhenrigold/emoji-metadata</p>
<p>Search for emoji</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>2026 memory</title>
        <link href="https://somethingorotherwhatever.com/items/2026-memory"/>
        <id>https://somethingorotherwhatever.com/items/2026-memory</id>
        <updated>2026-01-01T08:43:19.824000Z</updated>
        <summary type="html"><![CDATA[<p>A big matching pairs game with 2026 cards.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/2026-memory/main.png" />
                
                
                    <p>A big matching pairs game with 2026 cards.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Christmas clock</title>
        <link href="https://somethingorotherwhatever.com/items/christmas-clock"/>
        <id>https://somethingorotherwhatever.com/items/christmas-clock</id>
        <updated>2025-12-17T09:08:12.642000Z</updated>
        <summary type="html"><![CDATA[<p>A clock for Christmas</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <video autoplay src="https://somethingorotherwhatever.com/items/christmas-clock/main.mp4"></video>
                
                
                    <p>A clock for Christmas</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Proportional text</title>
        <link href="https://somethingorotherwhatever.com/items/proportional-text"/>
        <id>https://somethingorotherwhatever.com/items/proportional-text</id>
        <updated>2025-12-12T14:55:54.061000Z</updated>
        <summary type="html"><![CDATA[<p>Each character's size is proportional to its ASCII code.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/proportional-text/main.png" />
                
                
                    <p>Each character's size is proportional to its ASCII code.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Railway clock</title>
        <link href="https://somethingorotherwhatever.com/items/railway-clock"/>
        <id>https://somethingorotherwhatever.com/items/railway-clock</id>
        <updated>2025-12-10T08:20:09.554000Z</updated>
        <summary type="html"><![CDATA[<p>A pure CSS copy of the new Network Rail clock design.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <video autoplay src="https://somethingorotherwhatever.com/items/railway-clock/main.mp4"></video>
                
                
                    <p>A pure CSS copy of the new Network Rail clock design.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Triangulate π</title>
        <link href="https://somethingorotherwhatever.com/items/triangulate"/>
        <id>https://somethingorotherwhatever.com/items/triangulate</id>
        <updated>2025-12-04T14:09:39.117000Z</updated>
        <summary type="html"><![CDATA[<p>Try your best to cover a unit circle with triangles and it'll show you how close you got to π.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <video autoplay src="https://somethingorotherwhatever.com/items/triangulate/main.mp4"></video>
                
                
                    <p>Try your best to cover a unit circle with triangles and it'll show you how close you got to π.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>beachspectres.com</title>
        <link href="https://somethingorotherwhatever.com/items/beachspectres-com"/>
        <id>https://somethingorotherwhatever.com/items/beachspectres-com</id>
        <updated>2025-11-23T00:00:00Z</updated>
        <summary type="html"><![CDATA[<p>Information about the Beach Spectres project.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/beachspectres-com/main.png" />
                
                
                    <p>Information about the Beach Spectres project.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>MathsJam 5 minute timer</title>
        <link href="https://somethingorotherwhatever.com/items/mathsjam-5-minute-timer"/>
        <id>https://somethingorotherwhatever.com/items/mathsjam-5-minute-timer</id>
        <updated>2025-11-19T17:47:47.330000Z</updated>
        <summary type="html"><![CDATA[<p>A 5 minute timer for talks at Big MathsJam.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <video autoplay src="https://somethingorotherwhatever.com/items/mathsjam-5-minute-timer/main.mp4"></video>
                
                
                    <p>A 5 minute timer for talks at Big MathsJam.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Fuzzy graph shader</title>
        <link href="https://somethingorotherwhatever.com/items/fuzzy-graph-shader"/>
        <id>https://somethingorotherwhatever.com/items/fuzzy-graph-shader</id>
        <updated>2025-11-14T08:14:15.603000Z</updated>
        <summary type="html"><![CDATA[<p>A shader which shows points 'close' to a function. Made as a proof of concept to show that a shader can be much faster than plain JavaScript.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/fuzzy-graph-shader/main.png" />
                
                
                    <p>A shader which shows points 'close' to a function. Made as a proof of concept to show that a shader can be much faster than plain JavaScript.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Colour shuffle</title>
        <link href="https://somethingorotherwhatever.com/items/colour-shuffle"/>
        <id>https://somethingorotherwhatever.com/items/colour-shuffle</id>
        <updated>2025-11-06T07:35:28.399000Z</updated>
        <summary type="html"><![CDATA[<p>Rotates the hues in the webcam image to help me see differences between colours.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/colour-shuffle/main.png" />
                
                
                    <p>Rotates the hues in the webcam image to help me see differences between colours.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Beach Spectre practise</title>
        <link href="https://somethingorotherwhatever.com/items/beach-spectre-practise"/>
        <id>https://somethingorotherwhatever.com/items/beach-spectre-practise</id>
        <updated>2025-10-13T08:57:41.724000Z</updated>
        <summary type="html"><![CDATA[<p>A tool to practise laying out the spectre tiling on a beach.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/beach-spectre-practise/main.png" />
                
                
                    <p>A tool to practise laying out the spectre tiling on a beach.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Payton Asch&#39;s Herschel enneahedron construction </title>
        <link href="https://somethingorotherwhatever.com/items/payton-asch-s-herschel-enneahedron-construction"/>
        <id>https://somethingorotherwhatever.com/items/payton-asch-s-herschel-enneahedron-construction</id>
        <updated>2025-10-02T05:36:41.404000Z</updated>
        <summary type="html"><![CDATA[<p>Shows how to construct the Herschel enneahedron by truncating the middle of a triangular bipyramid.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <video autoplay src="https://somethingorotherwhatever.com/items/payton-asch-s-herschel-enneahedron-construction/main.mp4"></video>
                
                
                    <p>Shows how to construct the Herschel enneahedron by truncating the middle of a triangular bipyramid.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Accessible conferences and events</title>
        <link href="https://somethingorotherwhatever.com/items/accessible-conferences-and-events"/>
        <id>https://somethingorotherwhatever.com/items/accessible-conferences-and-events</id>
        <updated>2025-09-15T23:00:00Z</updated>
        <summary type="html"><![CDATA[<p>Guidance and case studies on running academic events that are accessible and inclusive.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/accessible-conferences-and-events/main.png" />
                
                
                    <p>Guidance and case studies on running academic events that are accessible and inclusive.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Pixel counting fixed point finder</title>
        <link href="https://somethingorotherwhatever.com/items/pixel-counting-fixed-point-finder"/>
        <id>https://somethingorotherwhatever.com/items/pixel-counting-fixed-point-finder</id>
        <updated>2025-07-30T23:00:00Z</updated>
        <summary type="html"><![CDATA[<p>Tools to find images which describe how many black pixels they contain. Made for Matt Parker to accompany a video.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/pixel-counting-fixed-point-finder/main.png" />
                
                
                    <p>Tools to find images which describe how many black pixels they contain. Made for Matt Parker to accompany a video.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Talks about Numbas</title>
        <link href="https://somethingorotherwhatever.com/items/talks-about-numbas"/>
        <id>https://somethingorotherwhatever.com/items/talks-about-numbas</id>
        <updated>2025-07-22T14:19:42Z</updated>
        <summary type="html"><![CDATA[<p>Talks and presentations about Numbas</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                
                    <h1>reveal.js <a href="https://travis-ci.org/hakimel/reveal.js"><img alt="Build Status" src="https://travis-ci.org/hakimel/reveal.js.svg?branch=master" /></a> <a href="https://slides.com?ref=github"><img src="https://s3.amazonaws.com/static.slid.es/images/slides-github-banner-320x40.png?1" alt="Slides" width="160" height="20"></a></h1>
<p>A framework for easily creating beautiful presentations using HTML. <a href="http://revealjs.com/">Check out the live demo</a>.</p>
<p>reveal.js comes with a broad range of features including <a href="https://github.com/hakimel/reveal.js#markup">nested slides</a>, <a href="https://github.com/hakimel/reveal.js#markdown">Markdown contents</a>, <a href="https://github.com/hakimel/reveal.js#pdf-export">PDF export</a>, <a href="https://github.com/hakimel/reveal.js#speaker-notes">speaker notes</a> and a <a href="https://github.com/hakimel/reveal.js#api">JavaScript API</a>. There's also a fully featured visual editor and platform for sharing reveal.js presentations at <a href="https://slides.com?ref=github">slides.com</a>.</p>
<h2>Table of contents</h2>
<ul>
<li><a href="#online-editor">Online Editor</a></li>
<li><a href="#instructions">Instructions</a></li>
<li><a href="#markup">Markup</a></li>
<li><a href="#markdown">Markdown</a></li>
<li><a href="#element-attributes">Element Attributes</a></li>
<li><a href="#slide-attributes">Slide Attributes</a></li>
<li><a href="#configuration">Configuration</a></li>
<li><a href="#presentation-size">Presentation Size</a></li>
<li><a href="#dependencies">Dependencies</a></li>
<li><a href="#ready-event">Ready Event</a></li>
<li><a href="#auto-sliding">Auto-sliding</a></li>
<li><a href="#keyboard-bindings">Keyboard Bindings</a></li>
<li><a href="#touch-navigation">Touch Navigation</a></li>
<li><a href="#lazy-loading">Lazy Loading</a></li>
<li><a href="#api">API</a></li>
<li><a href="#slide-changed-event">Slide Changed Event</a></li>
<li><a href="#presentation-state">Presentation State</a></li>
<li><a href="#slide-states">Slide States</a></li>
<li><a href="#slide-backgrounds">Slide Backgrounds</a></li>
<li><a href="#parallax-background">Parallax Background</a></li>
<li><a href="#slide-transitions">Slide Transitions</a></li>
<li><a href="#internal-links">Internal links</a></li>
<li><a href="#fragments">Fragments</a></li>
<li><a href="#fragment-events">Fragment events</a></li>
<li><a href="#code-syntax-highlighting">Code syntax highlighting</a></li>
<li><a href="#slide-number">Slide number</a></li>
<li><a href="#overview-mode">Overview mode</a></li>
<li><a href="#fullscreen-mode">Fullscreen mode</a></li>
<li><a href="#embedded-media">Embedded media</a></li>
<li><a href="#stretching-elements">Stretching elements</a></li>
<li><a href="#postmessage-api">postMessage API</a></li>
<li><a href="#pdf-export">PDF Export</a></li>
<li><a href="#theming">Theming</a></li>
<li><a href="#speaker-notes">Speaker Notes</a></li>
<li><a href="#share-and-print-speaker-notes">Share and Print Speaker Notes</a></li>
<li><a href="#server-side-speaker-notes">Server Side Speaker Notes</a></li>
<li><a href="#multiplexing">Multiplexing</a></li>
<li><a href="#master-presentation">Master presentation</a></li>
<li><a href="#client-presentation">Client presentation</a></li>
<li><a href="#socketio-server">Socket.io server</a></li>
<li><a href="#mathjax">MathJax</a></li>
<li><a href="#installation">Installation</a></li>
<li><a href="#basic-setup">Basic setup</a></li>
<li><a href="#full-setup">Full setup</a></li>
<li><a href="#folder-structure">Folder Structure</a></li>
<li><a href="#license">License</a></li>
</ul>
<h4>More reading</h4>
<ul>
<li><a href="https://github.com/hakimel/reveal.js/releases">Changelog</a>: Up-to-date version history.</li>
<li><a href="https://github.com/hakimel/reveal.js/wiki/Example-Presentations">Examples</a>: Presentations created with reveal.js, add your own!</li>
<li><a href="https://github.com/hakimel/reveal.js/wiki/Browser-Support">Browser Support</a>: Explanation of browser support and fallbacks.</li>
<li><a href="https://github.com/hakimel/reveal.js/wiki/Plugins,-Tools-and-Hardware">Plugins</a>: A list of plugins that can be used to extend reveal.js.</li>
</ul>
<h2>Online Editor</h2>
<p>Presentations are written using HTML or Markdown but there's also an online editor for those of you who prefer a graphical interface. Give it a try at <a href="https://slides.com?ref=github">https://slides.com</a>.</p>
<h2>Instructions</h2>
<h3>Markup</h3>
<p>Here's a barebones example of a fully working reveal.js presentation:
```html</p>
<html>
    <head>
        <link rel="stylesheet" href="css/reveal.css">
        <link rel="stylesheet" href="css/theme/white.css">
    </head>
    <body>
        <div class="reveal">
            <div class="slides">
                <section>Slide 1</section>
                <section>Slide 2</section>
            </div>
        </div>
        <script src="js/reveal.js"></script>
        <script>
            Reveal.initialize();
        </script>
    </body>
</html>
<p>```</p>
<p>The presentation markup hierarchy needs to be <code>.reveal &gt; .slides &gt; section</code> where the <code>section</code> represents one slide and can be repeated indefinitely. If you place multiple <code>section</code> elements inside of another <code>section</code> they will be shown as vertical slides. The first of the vertical slides is the "root" of the others (at the top), and will be included in the horizontal sequence. For example:</p>
<p>```html</p>
<div class="reveal">
    <div class="slides">
        <section>Single Horizontal Slide</section>
        <section>
            <section>Vertical Slide 1</section>
            <section>Vertical Slide 2</section>
        </section>
    </div>
</div>
<p>```</p>
<h3>Markdown</h3>
<p>It's possible to write your slides using Markdown. To enable Markdown, add the <code>data-markdown</code> attribute to your <code>&lt;section&gt;</code> elements and wrap the contents in a <code>&lt;textarea data-template&gt;</code> like the example below. You'll also need to add the <code>plugin/markdown/marked.js</code> and <code>plugin/markdown/markdown.js</code> scripts (in that order) to your HTML file.</p>
<p>This is based on <a href="https://gist.github.com/1343518">data-markdown</a> from <a href="https://github.com/paulirish">Paul Irish</a> modified to use <a href="https://github.com/chjj/marked">marked</a> to support <a href="https://help.github.com/articles/github-flavored-markdown">GitHub Flavored Markdown</a>. Sensitive to indentation (avoid mixing tabs and spaces) and line breaks (avoid consecutive breaks).</p>
<p>```html</p>
<section data-markdown>
    <textarea data-template>
        ## Page title

        A paragraph with some text and a [link](http://hakim.se).
    </textarea>
</section>
<p>```</p>
<h4>External Markdown</h4>
<p>You can write your content as a separate file and have reveal.js load it at runtime. Note the separator arguments which determine how slides are delimited in the external file: the <code>data-separator</code> attribute defines a regular expression for horizontal slides (defaults to <code>^\r?\n---\r?\n$</code>, a newline-bounded horizontal rule)  and <code>data-separator-vertical</code> defines vertical slides (disabled by default). The <code>data-separator-notes</code> attribute is a regular expression for specifying the beginning of the current slide's speaker notes (defaults to <code>notes?:</code>, so it will match both "note:" and "notes:"). The <code>data-charset</code> attribute is optional and specifies which charset to use when loading the external file.</p>
<p>When used locally, this feature requires that reveal.js <a href="#full-setup">runs from a local web server</a>.  The following example customises all available options:</p>
<p>```html</p>
<section data-markdown="example.md"
         data-separator="^\n\n\n"
         data-separator-vertical="^\n\n"
         data-separator-notes="^Note:"
         data-charset="iso-8859-15">
    <!--
        Note that Windows uses `\r\n` instead of `\n` as its linefeed character.
        For a regex that supports all operating systems, use `\r?\n` instead of `\n`.
    -->
</section>
<p>```</p>
<h4>Element Attributes</h4>
<p>Special syntax (through HTML comments) is available for adding attributes to Markdown elements. This is useful for fragments, amongst other things.</p>
<p>```html</p>
<section data-markdown>
    <script type="text/template">
        - Item 1 <!-- .element: class="fragment" data-fragment-index="2" -->
        - Item 2 <!-- .element: class="fragment" data-fragment-index="1" -->
    </script>
</section>
<p>```</p>
<h4>Slide Attributes</h4>
<p>Special syntax (through HTML comments) is available for adding attributes to the slide <code>&lt;section&gt;</code> elements generated by your Markdown.</p>
<p>```html</p>
<section data-markdown>
    <script type="text/template">
    <!-- .slide: data-background="#ff0000" -->
        Markdown content
    </script>
</section>
<p>```</p>
<h4>Configuring <em>marked</em></h4>
<p>We use <a href="https://github.com/chjj/marked">marked</a> to parse Markdown. To customise marked's rendering, you can pass in options when <a href="#configuration">configuring Reveal</a>:</p>
<p><code>javascript
Reveal.initialize({
    // Options which are passed into marked
    // See https://github.com/chjj/marked#options-1
    markdown: {
        smartypants: true
    }
});</code></p>
<h3>Configuration</h3>
<p>At the end of your page you need to initialize reveal by running the following code. Note that all configuration values are optional and will default to the values specified below.</p>
<p>```javascript
Reveal.initialize({</p>
<pre><code>// Display presentation control arrows
controls: true,

// Help the user learn the controls by providing hints, for example by
// bouncing the down arrow when they first encounter a vertical slide
controlsTutorial: true,

// Determines where controls appear, "edges" or "bottom-right"
controlsLayout: 'bottom-right',

// Visibility rule for backwards navigation arrows; "faded", "hidden"
// or "visible"
controlsBackArrows: 'faded',

// Display a presentation progress bar
progress: true,

// Display the page number of the current slide
slideNumber: false,

// Push each slide change to the browser history
history: false,

// Enable keyboard shortcuts for navigation
keyboard: true,

// Enable the slide overview mode
overview: true,

// Vertical centering of slides
center: true,

// Enables touch navigation on devices with touch input
touch: true,

// Loop the presentation
loop: false,

// Change the presentation direction to be RTL
rtl: false,

// Randomizes the order of slides each time the presentation loads
shuffle: false,

// Turns fragments on and off globally
fragments: true,

// Flags whether to include the current fragment in the URL,
// so that reloading brings you to the same fragment position
fragmentInURL: false,

// Flags if the presentation is running in an embedded mode,
// i.e. contained within a limited portion of the screen
embedded: false,

// Flags if we should show a help overlay when the questionmark
// key is pressed
help: true,

// Flags if speaker notes should be visible to all viewers
showNotes: false,

// Global override for autoplaying embedded media (video/audio/iframe)
// - null: Media will only autoplay if data-autoplay is present
// - true: All media will autoplay, regardless of individual setting
// - false: No media will autoplay, regardless of individual setting
autoPlayMedia: null,

// Number of milliseconds between automatically proceeding to the
// next slide, disabled when set to 0, this value can be overwritten
// by using a data-autoslide attribute on your slides
autoSlide: 0,

// Stop auto-sliding after user input
autoSlideStoppable: true,

// Use this method for navigation when auto-sliding
autoSlideMethod: Reveal.navigateNext,

// Specify the average time in seconds that you think you will spend
// presenting each slide. This is used to show a pacing timer in the
// speaker view
defaultTiming: 120,

// Enable slide navigation via mouse wheel
mouseWheel: false,

// Hides the address bar on mobile devices
hideAddressBar: true,

// Opens links in an iframe preview overlay
// Add `data-preview-link` and `data-preview-link="false"` to customise each link
// individually
previewLinks: false,

// Transition style
transition: 'slide', // none/fade/slide/convex/concave/zoom

// Transition speed
transitionSpeed: 'default', // default/fast/slow

// Transition style for full page slide backgrounds
backgroundTransition: 'fade', // none/fade/slide/convex/concave/zoom

// Number of slides away from the current that are visible
viewDistance: 3,

// Parallax background image
parallaxBackgroundImage: '', // e.g. "'https://s3.amazonaws.com/hakim-static/reveal-js/reveal-parallax-1.jpg'"

// Parallax background size
parallaxBackgroundSize: '', // CSS syntax, e.g. "2100px 900px"

// Number of pixels to move the parallax background per slide
// - Calculated automatically unless specified
// - Set to 0 to disable movement along an axis
parallaxBackgroundHorizontal: null,
parallaxBackgroundVertical: null,

// The display mode that will be used to show slides
display: 'block'
</code></pre>
<p>});
```</p>
<p>The configuration can be updated after initialization using the <code>configure</code> method:</p>
<p>```javascript
// Turn autoSlide off
Reveal.configure({ autoSlide: 0 });</p>
<p>// Start auto-sliding every 5s
Reveal.configure({ autoSlide: 5000 });
```</p>
<h3>Presentation Size</h3>
<p>All presentations have a normal size, that is, the resolution at which they are authored. The framework will automatically scale presentations uniformly based on this size to ensure that everything fits on any given display or viewport.</p>
<p>See below for a list of configuration options related to sizing, including default values:</p>
<p>```javascript
Reveal.initialize({</p>
<pre><code>// ...

// The "normal" size of the presentation, aspect ratio will be preserved
// when the presentation is scaled to fit different resolutions. Can be
// specified using percentage units.
width: 960,
height: 700,

// Factor of the display size that should remain empty around the content
margin: 0.1,

// Bounds for smallest/largest possible scale to apply to content
minScale: 0.2,
maxScale: 1.5
</code></pre>
<p>});
```</p>
<p>If you wish to disable this behavior and do your own scaling (e.g. using media queries), try these settings:</p>
<p>```javascript
Reveal.initialize({</p>
<pre><code>// ...

width: "100%",
height: "100%",
margin: 0,
minScale: 1,
maxScale: 1
</code></pre>
<p>});
```</p>
<h3>Dependencies</h3>
<p>Reveal.js doesn't <em>rely</em> on any third party scripts to work but a few optional libraries are included by default. These libraries are loaded as dependencies in the order they appear, for example:</p>
<p>```javascript
Reveal.initialize({
    dependencies: [
        // Cross-browser shim that fully implements classList - https://github.com/eligrey/classList.js/
        { src: 'lib/js/classList.js', condition: function() { return !document.body.classList; } },</p>
<pre><code>    // Interpret Markdown in &lt;section&gt; elements
    { src: 'plugin/markdown/marked.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
    { src: 'plugin/markdown/markdown.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },

    // Syntax highlight for &lt;code&gt; elements
    { src: 'plugin/highlight/highlight.js', async: true, callback: function() { hljs.initHighlightingOnLoad(); } },

    // Zoom in and out with Alt+click
    { src: 'plugin/zoom-js/zoom.js', async: true },

    // Speaker notes
    { src: 'plugin/notes/notes.js', async: true },

    // MathJax
    { src: 'plugin/math/math.js', async: true }
]
</code></pre>
<p>});
```</p>
<p>You can add your own extensions using the same syntax. The following properties are available for each dependency object:
- <strong>src</strong>: Path to the script to load
- <strong>async</strong>: [optional] Flags if the script should load after reveal.js has started, defaults to false
- <strong>callback</strong>: [optional] Function to execute when the script has loaded
- <strong>condition</strong>: [optional] Function which must return true for the script to be loaded</p>
<p>To load these dependencies, reveal.js requires <a href="http://headjs.com/">head.js</a> <em>(a script loading library)</em> to be loaded before reveal.js.</p>
<h3>Ready Event</h3>
<p>A <code>ready</code> event is fired when reveal.js has loaded all non-async dependencies and is ready to start navigating. To check if reveal.js is already 'ready' you can call <code>Reveal.isReady()</code>.</p>
<p><code>javascript
Reveal.addEventListener( 'ready', function( event ) {
    // event.currentSlide, event.indexh, event.indexv
} );</code></p>
<p>Note that we also add a <code>.ready</code> class to the <code>.reveal</code> element so that you can hook into this with CSS.</p>
<h3>Auto-sliding</h3>
<p>Presentations can be configured to progress through slides automatically, without any user input. To enable this you will need to tell the framework how many milliseconds it should wait between slides:</p>
<p><code>javascript
// Slide every five seconds
Reveal.configure({
  autoSlide: 5000
});</code></p>
<p>When this is turned on a control element will appear that enables users to pause and resume auto-sliding. Alternatively, sliding can be paused or resumed by pressing »A« on the keyboard. Sliding is paused automatically as soon as the user starts navigating. You can disable these controls by specifying <code>autoSlideStoppable: false</code> in your reveal.js config.</p>
<p>You can also override the slide duration for individual slides and fragments by using the <code>data-autoslide</code> attribute:</p>
<p>```html</p>
<section data-autoslide="2000">
    <p>After 2 seconds the first fragment will be shown.</p>
    <p class="fragment" data-autoslide="10000">After 10 seconds the next fragment will be shown.</p>
    <p class="fragment">Now, the fragment is displayed for 2 seconds before the next slide is shown.</p>
</section>
<p>```</p>
<p>To override the method used for navigation when auto-sliding, you can specify the <code>autoSlideMethod</code> setting. To only navigate along the top layer and ignore vertical slides, set this to <code>Reveal.navigateRight</code>.</p>
<p>Whenever the auto-slide mode is resumed or paused the <code>autoslideresumed</code> and <code>autoslidepaused</code> events are fired.</p>
<h3>Keyboard Bindings</h3>
<p>If you're unhappy with any of the default keyboard bindings you can override them using the <code>keyboard</code> config option:</p>
<p><code>javascript
Reveal.configure({
  keyboard: {
    13: 'next', // go to the next slide when the ENTER key is pressed
    27: function() {}, // do something custom when ESC is pressed
    32: null // don't do anything when SPACE is pressed (i.e. disable a reveal.js default binding)
  }
});</code></p>
<h3>Touch Navigation</h3>
<p>You can swipe to navigate through a presentation on any touch-enabled device. Horizontal swipes change between horizontal slides, vertical swipes change between vertical slides. If you wish to disable this you can set the <code>touch</code> config option to false when initializing reveal.js.</p>
<p>If there's some part of your content that needs to remain accessible to touch events you'll need to highlight this by adding a <code>data-prevent-swipe</code> attribute to the element. One common example where this is useful is elements that need to be scrolled.</p>
<h3>Lazy Loading</h3>
<p>When working on presentation with a lot of media or iframe content it's important to load lazily. Lazy loading means that reveal.js will only load content for the few slides nearest to the current slide. The number of slides that are preloaded is determined by the <code>viewDistance</code> configuration option.</p>
<p>To enable lazy loading all you need to do is change your <code>src</code> attributes to <code>data-src</code> as shown below. This is supported for image, video, audio and iframe elements. Lazy loaded iframes will also unload when the containing slide is no longer visible.</p>
<p>```html</p>
<section>
  <img data-src="image.png">
  <iframe data-src="http://hakim.se"></iframe>
  <video>
    <source data-src="video.webm" type="video/webm" />
    <source data-src="video.mp4" type="video/mp4" />
  </video>
</section>
<p>```</p>
<h3>API</h3>
<p>The <code>Reveal</code> object exposes a JavaScript API for controlling navigation and reading state:</p>
<p>```javascript
// Navigation
Reveal.slide( indexh, indexv, indexf );
Reveal.left();
Reveal.right();
Reveal.up();
Reveal.down();
Reveal.prev();
Reveal.next();
Reveal.prevFragment();
Reveal.nextFragment();</p>
<p>// Randomize the order of slides
Reveal.shuffle();</p>
<p>// Toggle presentation states, optionally pass true/false to force on/off
Reveal.toggleOverview();
Reveal.togglePause();
Reveal.toggleAutoSlide();</p>
<p>// Shows a help overlay with keyboard shortcuts, optionally pass true/false
// to force on/off
Reveal.toggleHelp();</p>
<p>// Change a config value at runtime
Reveal.configure({ controls: true });</p>
<p>// Returns the present configuration options
Reveal.getConfig();</p>
<p>// Fetch the current scale of the presentation
Reveal.getScale();</p>
<p>// Retrieves the previous and current slide elements
Reveal.getPreviousSlide();
Reveal.getCurrentSlide();</p>
<p>Reveal.getIndices();        // { h: 0, v: 0, f: 0 }
Reveal.getSlidePastCount();
Reveal.getProgress();       // (0 == first slide, 1 == last slide)
Reveal.getSlides();         // Array of all slides
Reveal.getTotalSlides();    // Total number of slides</p>
<p>// Returns the speaker notes for the current slide
Reveal.getSlideNotes();</p>
<p>// State checks
Reveal.isFirstSlide();
Reveal.isLastSlide();
Reveal.isOverview();
Reveal.isPaused();
Reveal.isAutoSliding();
```</p>
<h3>Custom Key Bindings</h3>
<p>Custom key bindings can be added and removed using the following Javascript API. Custom key bindings will override the default keyboard bindings, but will in turn be overridden by the user defined bindings in the <code>keyboard</code> config option.</p>
<p><code>javascript
Reveal.addKeyBinding( binding, callback );
Reveal.removeKeyBinding( keyCode );</code></p>
<p>For example</p>
<p>```javascript
// The binding parameter provides the following properties
//      keyCode: the keycode for binding to the callback
//          key: the key label to show in the help overlay
//  description: the description of the action to show in the help overlay
Reveal.addKeyBinding( { keyCode: 84, key: 'T', description: 'Start timer' }, function() {
    // start timer
} )</p>
<p>// The binding parameter can also be a direct keycode without providing the help description
Reveal.addKeyBinding( 82, function() {
    // reset timer
} )
```</p>
<p>This allows plugins to add key bindings directly to Reveal so they can</p>
<ul>
<li>make use of Reveal's pre-processing logic for key handling (for example, ignoring key presses when paused); and</li>
<li>be included in the help overlay (optional)</li>
</ul>
<h3>Slide Changed Event</h3>
<p>A <code>slidechanged</code> event is fired each time the slide is changed (regardless of state). The event object holds the index values of the current slide as well as a reference to the previous and current slide HTML nodes.</p>
<p>Some libraries, like MathJax (see <a href="https://github.com/hakimel/reveal.js/issues/226#issuecomment-10261609">#226</a>), get confused by the transforms and display states of slides. Often times, this can be fixed by calling their update or render function from this callback.</p>
<p><code>javascript
Reveal.addEventListener( 'slidechanged', function( event ) {
    // event.previousSlide, event.currentSlide, event.indexh, event.indexv
} );</code></p>
<h3>Presentation State</h3>
<p>The presentation's current state can be fetched by using the <code>getState</code> method. A state object contains all of the information required to put the presentation back as it was when <code>getState</code> was first called. Sort of like a snapshot. It's a simple object that can easily be stringified and persisted or sent over the wire.</p>
<p>```javascript
Reveal.slide( 1 );
// we're on slide 1</p>
<p>var state = Reveal.getState();</p>
<p>Reveal.slide( 3 );
// we're on slide 3</p>
<p>Reveal.setState( state );
// we're back on slide 1
```</p>
<h3>Slide States</h3>
<p>If you set <code>data-state="somestate"</code> on a slide <code>&lt;section&gt;</code>, "somestate" will be applied as a class on the document element when that slide is opened. This allows you to apply broad style changes to the page based on the active slide.</p>
<p>Furthermore you can also listen to these changes in state via JavaScript:</p>
<p><code>javascript
Reveal.addEventListener( 'somestate', function() {
    // TODO: Sprinkle magic
}, false );</code></p>
<h3>Slide Backgrounds</h3>
<p>Slides are contained within a limited portion of the screen by default to allow them to fit any display and scale uniformly. You can apply full page backgrounds outside of the slide area by adding a <code>data-background</code> attribute to your <code>&lt;section&gt;</code> elements. Four different types of backgrounds are supported: color, image, video and iframe.</p>
<h4>Color Backgrounds</h4>
<p>All CSS color formats are supported, including hex values, keywords, <code>rgba()</code> or <code>hsl()</code>.</p>
<p>```html</p>
<section data-background-color="#ff0000">
    <h2>Color</h2>
</section>
<p>```</p>
<h4>Image Backgrounds</h4>
<p>By default, background images are resized to cover the full page. Available options:</p>
<p>| Attribute                        | Default    | Description |
| :------------------------------- | :--------- | :---------- |
| data-background-image            |            | URL of the image to show. GIFs restart when the slide opens. |
| data-background-size             | cover      | See <a href="https://developer.mozilla.org/docs/Web/CSS/background-size">background-size</a> on MDN.  |
| data-background-position         | center     | See <a href="https://developer.mozilla.org/docs/Web/CSS/background-position">background-position</a> on MDN. |
| data-background-repeat           | no-repeat  | See <a href="https://developer.mozilla.org/docs/Web/CSS/background-repeat">background-repeat</a> on MDN. |
| data-background-opacity          | 1          | Opacity of the background image on a 0-1 scale. 0 is transparent and 1 is fully opaque. |</p>
<p>```html</p>
<section data-background-image="http://example.com/image.png">
    <h2>Image</h2>
</section>
<section data-background-image="http://example.com/image.png" data-background-size="100px" data-background-repeat="repeat">
    <h2>This background image will be sized to 100px and repeated</h2>
</section>
<p>```</p>
<h4>Video Backgrounds</h4>
<p>Automatically plays a full size video behind the slide.</p>
<p>| Attribute                        | Default | Description |
| :---------------------------     | :------ | :---------- |
| data-background-video            |         | A single video source, or a comma separated list of video sources. |
| data-background-video-loop       | false   | Flags if the video should play repeatedly. |
| data-background-video-muted      | false   | Flags if the audio should be muted. |
| data-background-size             | cover   | Use <code>cover</code> for full screen and some cropping or <code>contain</code> for letterboxing. |
| data-background-opacity          | 1       | Opacity of the background video on a 0-1 scale. 0 is transparent and 1 is fully opaque. |</p>
<p>```html</p>
<section data-background-video="https://s3.amazonaws.com/static.slid.es/site/homepage/v1/homepage-video-editor.mp4,https://s3.amazonaws.com/static.slid.es/site/homepage/v1/homepage-video-editor.webm" data-background-video-loop data-background-video-muted>
    <h2>Video</h2>
</section>
<p>```</p>
<h4>Iframe Backgrounds</h4>
<p>Embeds a web page as a slide background that covers 100% of the reveal.js width and height. The iframe is in the background layer, behind your slides, and as such it's not possible to interact with it by default. To make your background interactive, you can add the <code>data-background-interactive</code> attribute.</p>
<p>```html</p>
<section data-background-iframe="https://slides.com" data-background-interactive>
    <h2>Iframe</h2>
</section>
<p>```</p>
<h4>Background Transitions</h4>
<p>Backgrounds transition using a fade animation by default. This can be changed to a linear sliding transition by passing <code>backgroundTransition: 'slide'</code> to the <code>Reveal.initialize()</code> call. Alternatively you can set <code>data-background-transition</code> on any section with a background to override that specific transition.</p>
<h3>Parallax Background</h3>
<p>If you want to use a parallax scrolling background, set the first two properties below when initializing reveal.js (the other two are optional).</p>
<p>```javascript
Reveal.initialize({</p>
<pre><code>// Parallax background image
parallaxBackgroundImage: '', // e.g. "https://s3.amazonaws.com/hakim-static/reveal-js/reveal-parallax-1.jpg"

// Parallax background size
parallaxBackgroundSize: '', // CSS syntax, e.g. "2100px 900px" - currently only pixels are supported (don't use % or auto)

// Number of pixels to move the parallax background per slide
// - Calculated automatically unless specified
// - Set to 0 to disable movement along an axis
parallaxBackgroundHorizontal: 200,
parallaxBackgroundVertical: 50
</code></pre>
<p>});
```</p>
<p>Make sure that the background size is much bigger than screen size to allow for some scrolling. <a href="http://revealjs.com/?parallaxBackgroundImage=https%3A%2F%2Fs3.amazonaws.com%2Fhakim-static%2Freveal-js%2Freveal-parallax-1.jpg&amp;parallaxBackgroundSize=2100px%20900px">View example</a>.</p>
<h3>Slide Transitions</h3>
<p>The global presentation transition is set using the <code>transition</code> config value. You can override the global transition for a specific slide by using the <code>data-transition</code> attribute:</p>
<p>```html</p>
<section data-transition="zoom">
    <h2>This slide will override the presentation transition and zoom!</h2>
</section>

<section data-transition-speed="fast">
    <h2>Choose from three transition speeds: default, fast or slow!</h2>
</section>
<p>```</p>
<p>You can also use different in and out transitions for the same slide:</p>
<p>```html</p>
<section data-transition="slide">
    The train goes on …
</section>
<section data-transition="slide">
    and on …
</section>
<section data-transition="slide-in fade-out">
    and stops.
</section>
<section data-transition="fade-in slide-out">
    (Passengers entering and leaving)
</section>
<section data-transition="slide">
    And it starts again.
</section>
<p><code>``
You can choose from</code>none<code>,</code>fade<code>,</code>slide<code>,</code>convex<code>,</code>concave<code>and</code>zoom`.</p>
<h3>Internal links</h3>
<p>It's easy to link between slides. The first example below targets the index of another slide whereas the second targets a slide with an ID attribute (<code>&lt;section id="some-slide"&gt;</code>):</p>
<p><code>html
&lt;a href="#/2/2"&gt;Link&lt;/a&gt;
&lt;a href="#/some-slide"&gt;Link&lt;/a&gt;</code></p>
<p>You can also add relative navigation links, similar to the built in reveal.js controls, by appending one of the following classes on any element. Note that each element is automatically given an <code>enabled</code> class when it's a valid navigation route based on the current slide.</p>
<p><code>html
&lt;a href="#" class="navigate-left"&gt;
&lt;a href="#" class="navigate-right"&gt;
&lt;a href="#" class="navigate-up"&gt;
&lt;a href="#" class="navigate-down"&gt;
&lt;a href="#" class="navigate-prev"&gt; &lt;!-- Previous vertical or horizontal slide --&gt;
&lt;a href="#" class="navigate-next"&gt; &lt;!-- Next vertical or horizontal slide --&gt;</code></p>
<h3>Fragments</h3>
<p>Fragments are used to highlight individual elements on a slide. Every element with the class <code>fragment</code> will be stepped through before moving on to the next slide. Here's an example: http://revealjs.com/#/fragments</p>
<p>The default fragment style is to start out invisible and fade in. This style can be changed by appending a different class to the fragment:</p>
<p>```html</p>
<section>
    <p class="fragment grow">grow</p>
    <p class="fragment shrink">shrink</p>
    <p class="fragment fade-out">fade-out</p>
    <p class="fragment fade-up">fade-up (also down, left and right!)</p>
    <p class="fragment fade-in-then-out">fades in, then out when we move to the next step</p>
    <p class="fragment fade-in-then-semi-out">fades in, then obfuscate when we move to the next step</p>
    <p class="fragment highlight-current-blue">blue only once</p>
    <p class="fragment highlight-red">highlight-red</p>
    <p class="fragment highlight-green">highlight-green</p>
    <p class="fragment highlight-blue">highlight-blue</p>
</section>
<p>```</p>
<p>Multiple fragments can be applied to the same element sequentially by wrapping it, this will fade in the text on the first step and fade it back out on the second.</p>
<p>```html</p>
<section>
    <span class="fragment fade-in">
        <span class="fragment fade-out">I'll fade in, then out</span>
    </span>
</section>
<p>```</p>
<p>The display order of fragments can be controlled using the <code>data-fragment-index</code> attribute.</p>
<p>```html</p>
<section>
    <p class="fragment" data-fragment-index="3">Appears last</p>
    <p class="fragment" data-fragment-index="1">Appears first</p>
    <p class="fragment" data-fragment-index="2">Appears second</p>
</section>
<p>```</p>
<h3>Fragment events</h3>
<p>When a slide fragment is either shown or hidden reveal.js will dispatch an event.</p>
<p>Some libraries, like MathJax (see #505), get confused by the initially hidden fragment elements. Often times this can be fixed by calling their update or render function from this callback.</p>
<p><code>javascript
Reveal.addEventListener( 'fragmentshown', function( event ) {
    // event.fragment = the fragment DOM element
} );
Reveal.addEventListener( 'fragmenthidden', function( event ) {
    // event.fragment = the fragment DOM element
} );</code></p>
<h3>Code syntax highlighting</h3>
<p>By default, Reveal is configured with <a href="https://highlightjs.org/">highlight.js</a> for code syntax highlighting. To enable syntax highlighting, you'll have to load the highlight plugin (<a href="plugin/highlight/highlight.js">plugin/highlight/highlight.js</a>) and a highlight.js CSS theme (Reveal comes packaged with the zenburn theme: <a href="lib/css/zenburn.css">lib/css/zenburn.css</a>).</p>
<p><code>javascript
Reveal.initialize({
    // More info https://github.com/hakimel/reveal.js#dependencies
    dependencies: [
        { src: 'plugin/highlight/highlight.js', async: true, callback: function() { hljs.initHighlightingOnLoad(); } },
    ]
});</code></p>
<p>Below is an example with clojure code that will be syntax highlighted. When the <code>data-trim</code> attribute is present, surrounding whitespace is automatically removed.  HTML will be escaped by default. To avoid this, for example if you are using <code>&lt;mark&gt;</code> to call out a line of code, add the <code>data-noescape</code> attribute to the <code>&lt;code&gt;</code> element.</p>
<p>```html</p>
<section>
    <pre><code data-trim data-noescape>
(def lazy-fib
  (concat
   [0 1]
   <mark>((fn rfib [a b]</mark>
        (lazy-cons (+ a b) (rfib b (+ a b)))) 0 1)))
    </code></pre>
</section>
<p>```</p>
<h3>Slide number</h3>
<p>If you would like to display the page number of the current slide you can do so using the <code>slideNumber</code> and <code>showSlideNumber</code> configuration values.</p>
<p>```javascript
// Shows the slide number using default formatting
Reveal.configure({ slideNumber: true });</p>
<p>// Slide number formatting can be configured using these variables:
//  "h.v":  horizontal . vertical slide number (default)
//  "h/v":  horizontal / vertical slide number
//    "c":  flattened slide number
//  "c/t":  flattened slide number / total slides
Reveal.configure({ slideNumber: 'c/t' });</p>
<p>// Control which views the slide number displays on using the "showSlideNumber" value:
//     "all": show on all views (default)
// "speaker": only show slide numbers on speaker notes view
//   "print": only show slide numbers when printing to PDF
Reveal.configure({ showSlideNumber: 'speaker' });
```</p>
<h3>Overview mode</h3>
<p>Press »ESC« or »O« keys to toggle the overview mode on and off. While you're in this mode, you can still navigate between slides,
as if you were at 1,000 feet above your presentation. The overview mode comes with a few API hooks:</p>
<p>```javascript
Reveal.addEventListener( 'overviewshown', function( event ) { /<em> ... </em>/ } );
Reveal.addEventListener( 'overviewhidden', function( event ) { /<em> ... </em>/ } );</p>
<p>// Toggle the overview mode programmatically
Reveal.toggleOverview();
```</p>
<h3>Fullscreen mode</h3>
<p>Just press »F« on your keyboard to show your presentation in fullscreen mode. Press the »ESC« key to exit fullscreen mode.</p>
<h3>Embedded media</h3>
<p>Add <code>data-autoplay</code> to your media element if you want it to automatically start playing when the slide is shown:</p>
<p>```html</p>
<video data-autoplay src="http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4"></video>
<p>```</p>
<p>If you want to enable or disable autoplay globally, for all embedded media, you can use the <code>autoPlayMedia</code> configuration option. If you set this to <code>true</code> ALL media will autoplay regardless of individual <code>data-autoplay</code> attributes. If you initialize with <code>autoPlayMedia: false</code> NO media will autoplay.</p>
<p>Note that embedded HTML5 <code>&lt;video&gt;</code>/<code>&lt;audio&gt;</code> and YouTube/Vimeo iframes are automatically paused when you navigate away from a slide. This can be disabled by decorating your element with a <code>data-ignore</code> attribute.</p>
<h3>Embedded iframes</h3>
<p>reveal.js automatically pushes two <a href="https://developer.mozilla.org/en-US/docs/Web/API/Window.postMessage">post messages</a> to embedded iframes. <code>slide:start</code> when the slide containing the iframe is made visible and <code>slide:stop</code> when it is hidden.</p>
<h3>Stretching elements</h3>
<p>Sometimes it's desirable to have an element, like an image or video, stretch to consume as much space as possible within a given slide. This can be done by adding the <code>.stretch</code> class to an element as seen below:</p>
<p>```html</p>
<section>
    <h2>This video will use up the remaining space on the slide</h2>
    <video class="stretch" src="http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4"></video>
</section>
<p>```</p>
<p>Limitations:
- Only direct descendants of a slide section can be stretched
- Only one descendant per slide section can be stretched</p>
<h3>postMessage API</h3>
<p>The framework has a built-in postMessage API that can be used when communicating with a presentation inside of another window. Here's an example showing how you'd make a reveal.js instance in the given window proceed to slide 2:</p>
<p><code>javascript
&lt;window&gt;.postMessage( JSON.stringify({ method: 'slide', args: [ 2 ] }), '*' );</code></p>
<p>When reveal.js runs inside of an iframe it can optionally bubble all of its events to the parent. Bubbled events are stringified JSON with three fields: namespace, eventName and state. Here's how you subscribe to them from the parent window:</p>
<p><code>javascript
window.addEventListener( 'message', function( event ) {
    var data = JSON.parse( event.data );
    if( data.namespace === 'reveal' &amp;&amp; data.eventName ==='slidechanged' ) {
        // Slide changed, see data.state for slide number
    }
} );</code></p>
<p>This cross-window messaging can be toggled on or off using configuration flags.</p>
<p>```javascript
Reveal.initialize({
    // ...</p>
<pre><code>// Exposes the reveal.js API through window.postMessage
postMessage: true,

// Dispatches all reveal.js events to the parent window through postMessage
postMessageEvents: false
</code></pre>
<p>});
```</p>
<h2>PDF Export</h2>
<p>Presentations can be exported to PDF via a special print stylesheet. This feature requires that you use <a href="http://google.com/chrome">Google Chrome</a> or <a href="https://www.chromium.org/Home">Chromium</a> and to be serving the presentation from a webserver.
Here's an example of an exported presentation that's been uploaded to SlideShare: http://www.slideshare.net/hakimel/revealjs-300.</p>
<h3>Separate pages for fragments</h3>
<p><a href="#fragments">Fragments</a> are printed on separate slides by default. Meaning if you have a slide with three fragment steps, it will generate three separate slides where the fragments appear incrementally.</p>
<p>If you prefer printing all fragments in their visible states on the same slide you can set the <code>pdfSeparateFragments</code> config option to false.</p>
<h3>Page size</h3>
<p>Export dimensions are inferred from the configured <a href="#presentation-size">presentation size</a>. Slides that are too tall to fit within a single page will expand onto multiple pages. You can limit how many pages a slide may expand onto using the <code>pdfMaxPagesPerSlide</code> config option, for example <code>Reveal.configure({ pdfMaxPagesPerSlide: 1 })</code> ensures that no slide ever grows to more than one printed page.</p>
<h3>Print stylesheet</h3>
<p>To enable the PDF print capability in your presentation, the special print stylesheet at <a href="https://github.com/hakimel/reveal.js/blob/master/css/print/pdf.css">/css/print/pdf.css</a> must be loaded. The default index.html file handles this for you when <code>print-pdf</code> is included in the query string. If you're using a different HTML template, you can add this to your HEAD:</p>
<p>```html</p>
<script>
    var link = document.createElement( 'link' );
    link.rel = 'stylesheet';
    link.type = 'text/css';
    link.href = window.location.search.match( /print-pdf/gi ) ? 'css/print/pdf.css' : 'css/print/paper.css';
    document.getElementsByTagName( 'head' )[0].appendChild( link );
</script>
<p>```</p>
<h3>Instructions</h3>
<ol>
<li>Open your presentation with <code>print-pdf</code> included in the query string i.e. http://localhost:8000/?print-pdf. You can test this with <a href="http://revealjs.com?print-pdf">revealjs.com?print-pdf</a>.</li>
<li>If you want to include <a href="#speaker-notes">speaker notes</a> in your export, you can append <code>showNotes=true</code> to the query string: http://localhost:8000/?print-pdf&amp;showNotes=true</li>
<li>Open the in-browser print dialog (CTRL/CMD+P).</li>
<li>Change the <strong>Destination</strong> setting to <strong>Save as PDF</strong>.</li>
<li>Change the <strong>Layout</strong> to <strong>Landscape</strong>.</li>
<li>Change the <strong>Margins</strong> to <strong>None</strong>.</li>
<li>Enable the <strong>Background graphics</strong> option.</li>
<li>Click <strong>Save</strong>.</li>
</ol>
<p><img alt="Chrome Print Settings" src="https://s3.amazonaws.com/hakim-static/reveal-js/pdf-print-settings-2.png" /></p>
<p>Alternatively you can use the <a href="https://github.com/astefanutti/decktape">decktape</a> project.</p>
<h2>Theming</h2>
<p>The framework comes with a few different themes included:</p>
<ul>
<li>black: Black background, white text, blue links (default theme)</li>
<li>white: White background, black text, blue links</li>
<li>league: Gray background, white text, blue links (default theme for reveal.js &lt; 3.0.0)</li>
<li>beige: Beige background, dark text, brown links</li>
<li>sky: Blue background, thin dark text, blue links</li>
<li>night: Black background, thick white text, orange links</li>
<li>serif: Cappuccino background, gray text, brown links</li>
<li>simple: White background, black text, blue links</li>
<li>solarized: Cream-colored background, dark green text, blue links</li>
</ul>
<p>Each theme is available as a separate stylesheet. To change theme you will need to replace <strong>black</strong> below with your desired theme name in index.html:</p>
<p><code>html
&lt;link rel="stylesheet" href="css/theme/black.css" id="theme"&gt;</code></p>
<p>If you want to add a theme of your own see the instructions here: <a href="https://github.com/hakimel/reveal.js/blob/master/css/theme/README.md">/css/theme/README.md</a>.</p>
<h2>Speaker Notes</h2>
<p>reveal.js comes with a speaker notes plugin which can be used to present per-slide notes in a separate browser window. The notes window also gives you a preview of the next upcoming slide so it may be helpful even if you haven't written any notes. Press the »S« key on your keyboard to open the notes window.</p>
<p>A speaker timer starts as soon as the speaker view is opened. You can reset it to 00:00:00 at any time by simply clicking/tapping on it.</p>
<p>Notes are defined by appending an <code>&lt;aside&gt;</code> element to a slide as seen below. You can add the <code>data-markdown</code> attribute to the aside element if you prefer writing notes using Markdown.</p>
<p>Alternatively you can add your notes in a <code>data-notes</code> attribute on the slide. Like <code>&lt;section data-notes="Something important"&gt;&lt;/section&gt;</code>.</p>
<p>When used locally, this feature requires that reveal.js <a href="#full-setup">runs from a local web server</a>.</p>
<p>```html</p>
<section>
    <h2>Some Slide</h2>

    <aside class="notes">
        Oh hey, these are some notes. They'll be hidden in your presentation, but you can see them if you open the speaker notes window (hit »S« on your keyboard).
    </aside>
</section>
<p>```</p>
<p>If you're using the external Markdown plugin, you can add notes with the help of a special delimiter:</p>
<p>```html</p>
<section data-markdown="example.md" data-separator="^\n\n\n" data-separator-vertical="^\n\n" data-separator-notes="^Note:"></section>

<h1>Title</h1>
<h2>Sub-title</h2>
<p>Here is some content...</p>
<p>Note:
This will only display in the notes window.
```</p>
<h4>Share and Print Speaker Notes</h4>
<p>Notes are only visible to the speaker inside of the speaker view. If you wish to share your notes with others you can initialize reveal.js with the <code>showNotes</code> configuration value set to <code>true</code>. Notes will appear along the bottom of the presentations.</p>
<p>When <code>showNotes</code> is enabled notes are also included when you <a href="https://github.com/hakimel/reveal.js#pdf-export">export to PDF</a>. By default, notes are printed in a semi-transparent box on top of the slide. If you'd rather print them on a separate page after the slide, set <code>showNotes: "separate-page"</code>.</p>
<h4>Speaker notes clock and timers</h4>
<p>The speaker notes window will also show:</p>
<ul>
<li>Time elapsed since the beginning of the presentation.  If you hover the mouse above this section, a timer reset button will appear.</li>
<li>Current wall-clock time</li>
<li>(Optionally) a pacing timer which indicates whether the current pace of the presentation is on track for the right timing (shown in green), and if not, whether the presenter should speed up (shown in red) or has the luxury of slowing down (blue).</li>
</ul>
<p>The pacing timer can be enabled by configuring by the <code>defaultTiming</code> parameter in the <code>Reveal</code> configuration block, which specifies the number of seconds per slide.  120 can be a reasonable rule of thumb.  Timings can also be given per slide <code>&lt;section&gt;</code> by setting the <code>data-timing</code> attribute.  Both values are in numbers of seconds.</p>
<h2>Server Side Speaker Notes</h2>
<p>In some cases it can be desirable to run notes on a separate device from the one you're presenting on. The Node.js-based notes plugin lets you do this using the same note definitions as its client side counterpart. Include the required scripts by adding the following dependencies:</p>
<p>```javascript
Reveal.initialize({
    // ...</p>
<pre><code>dependencies: [
    { src: 'socket.io/socket.io.js', async: true },
    { src: 'plugin/notes-server/client.js', async: true }
]
</code></pre>
<p>});
```</p>
<p>Then:</p>
<ol>
<li>Install <a href="http://nodejs.org/">Node.js</a> (4.0.0 or later)</li>
<li>Run <code>npm install</code></li>
<li>Run <code>node plugin/notes-server</code></li>
</ol>
<h2>Multiplexing</h2>
<p>The multiplex plugin allows your audience to view the slides of the presentation you are controlling on their own phone, tablet or laptop. As the master presentation navigates the slides, all client presentations will update in real time. See a demo at <a href="https://reveal-js-multiplex-ccjbegmaii.now.sh/">https://reveal-js-multiplex-ccjbegmaii.now.sh/</a>.</p>
<p>The multiplex plugin needs the following 3 things to operate:</p>
<ol>
<li>Master presentation that has control</li>
<li>Client presentations that follow the master</li>
<li>Socket.io server to broadcast events from the master to the clients</li>
</ol>
<h4>Master presentation</h4>
<p>Served from a static file server accessible (preferably) only to the presenter. This need only be on your (the presenter's) computer. (It's safer to run the master presentation from your own computer, so if the venue's Internet goes down it doesn't stop the show.) An example would be to execute the following commands in the directory of your master presentation:</p>
<ol>
<li><code>npm install node-static</code></li>
<li><code>static</code></li>
</ol>
<p>If you want to use the speaker notes plugin with your master presentation then make sure you have the speaker notes plugin configured correctly along with the configuration shown below, then execute <code>node plugin/notes-server</code> in the directory of your master presentation. The configuration below will cause it to connect to the socket.io server as a master, as well as launch your speaker-notes/static-file server.</p>
<p>You can then access your master presentation at <code>http://localhost:1947</code></p>
<p>Example configuration:</p>
<p>```javascript
Reveal.initialize({
    // other options...</p>
<pre><code>multiplex: {
    // Example values. To generate your own, see the socket.io server instructions.
    secret: '13652805320794272084', // Obtained from the socket.io server. Gives this (the master) control of the presentation
    id: '1ea875674b17ca76', // Obtained from socket.io server
    url: 'https://reveal-js-multiplex-ccjbegmaii.now.sh' // Location of socket.io server
},

// Don't forget to add the dependencies
dependencies: [
    { src: '//cdn.socket.io/socket.io-1.3.5.js', async: true },
    { src: 'plugin/multiplex/master.js', async: true },

    // and if you want speaker notes
    { src: 'plugin/notes-server/client.js', async: true }

    // other dependencies...
]
</code></pre>
<p>});
```</p>
<h4>Client presentation</h4>
<p>Served from a publicly accessible static file server. Examples include: GitHub Pages, Amazon S3, Dreamhost, Akamai, etc. The more reliable, the better. Your audience can then access the client presentation via <code>http://example.com/path/to/presentation/client/index.html</code>, with the configuration below causing them to connect to the socket.io server as clients.</p>
<p>Example configuration:</p>
<p>```javascript
Reveal.initialize({
    // other options...</p>
<pre><code>multiplex: {
    // Example values. To generate your own, see the socket.io server instructions.
    secret: null, // null so the clients do not have control of the master presentation
    id: '1ea875674b17ca76', // id, obtained from socket.io server
    url: 'https://reveal-js-multiplex-ccjbegmaii.now.sh' // Location of socket.io server
},

// Don't forget to add the dependencies
dependencies: [
    { src: '//cdn.socket.io/socket.io-1.3.5.js', async: true },
    { src: 'plugin/multiplex/client.js', async: true }

    // other dependencies...
]
</code></pre>
<p>});
```</p>
<h4>Socket.io server</h4>
<p>Server that receives the <code>slideChanged</code> events from the master presentation and broadcasts them out to the connected client presentations. This needs to be publicly accessible. You can run your own socket.io server with the commands:</p>
<ol>
<li><code>npm install</code></li>
<li><code>node plugin/multiplex</code></li>
</ol>
<p>Or you can use the socket.io server at <a href="https://reveal-js-multiplex-ccjbegmaii.now.sh/">https://reveal-js-multiplex-ccjbegmaii.now.sh/</a>.</p>
<p>You'll need to generate a unique secret and token pair for your master and client presentations. To do so, visit <code>http://example.com/token</code>, where <code>http://example.com</code> is the location of your socket.io server. Or if you're going to use the socket.io server at <a href="https://reveal-js-multiplex-ccjbegmaii.now.sh/">https://reveal-js-multiplex-ccjbegmaii.now.sh/</a>, visit <a href="https://reveal-js-multiplex-ccjbegmaii.now.sh/token">https://reveal-js-multiplex-ccjbegmaii.now.sh/token</a>.</p>
<p>You are very welcome to point your presentations at the Socket.io server running at <a href="https://reveal-js-multiplex-ccjbegmaii.now.sh/">https://reveal-js-multiplex-ccjbegmaii.now.sh/</a>, but availability and stability are not guaranteed.</p>
<p>For anything mission critical I recommend you run your own server. The easiest way to do this is by installing <a href="https://zeit.co/now">now</a>. With that installed, deploying your own Multiplex server is as easy running the following command from the reveal.js folder: <code>now plugin/multiplex</code>.</p>
<h5>socket.io server as file static server</h5>
<p>The socket.io server can play the role of static file server for your client presentation, as in the example at <a href="https://reveal-js-multiplex-ccjbegmaii.now.sh/">https://reveal-js-multiplex-ccjbegmaii.now.sh/</a>. (Open <a href="https://reveal-js-multiplex-ccjbegmaii.now.sh/">https://reveal-js-multiplex-ccjbegmaii.now.sh/</a> in two browsers. Navigate through the slides on one, and the other will update to match.)</p>
<p>Example configuration:</p>
<p>```javascript
Reveal.initialize({
    // other options...</p>
<pre><code>multiplex: {
    // Example values. To generate your own, see the socket.io server instructions.
    secret: null, // null so the clients do not have control of the master presentation
    id: '1ea875674b17ca76', // id, obtained from socket.io server
    url: 'example.com:80' // Location of your socket.io server
},

// Don't forget to add the dependencies
dependencies: [
    { src: '//cdn.socket.io/socket.io-1.3.5.js', async: true },
    { src: 'plugin/multiplex/client.js', async: true }

    // other dependencies...
]
</code></pre>
<p>```</p>
<p>It can also play the role of static file server for your master presentation and client presentations at the same time (as long as you don't want to use speaker notes). (Open <a href="https://reveal-js-multiplex-ccjbegmaii.now.sh/">https://reveal-js-multiplex-ccjbegmaii.now.sh/</a> in two browsers. Navigate through the slides on one, and the other will update to match. Navigate through the slides on the second, and the first will update to match.) This is probably not desirable, because you don't want your audience to mess with your slides while you're presenting. ;)</p>
<p>Example configuration:</p>
<p>```javascript
Reveal.initialize({
    // other options...</p>
<pre><code>multiplex: {
    // Example values. To generate your own, see the socket.io server instructions.
    secret: '13652805320794272084', // Obtained from the socket.io server. Gives this (the master) control of the presentation
    id: '1ea875674b17ca76', // Obtained from socket.io server
    url: 'example.com:80' // Location of your socket.io server
},

// Don't forget to add the dependencies
dependencies: [
    { src: '//cdn.socket.io/socket.io-1.3.5.js', async: true },
    { src: 'plugin/multiplex/master.js', async: true },
    { src: 'plugin/multiplex/client.js', async: true }

    // other dependencies...
]
</code></pre>
<p>});
```</p>
<h2>MathJax</h2>
<p>If you want to display math equations in your presentation you can easily do so by including this plugin. The plugin is a very thin wrapper around the <a href="http://www.mathjax.org/">MathJax</a> library. To use it you'll need to include it as a reveal.js dependency, <a href="#dependencies">find our more about dependencies here</a>.</p>
<p>The plugin defaults to using <a href="http://en.wikipedia.org/wiki/LaTeX">LaTeX</a> but that can be adjusted through the <code>math</code> configuration object. Note that MathJax is loaded from a remote server. If you want to use it offline you'll need to download a copy of the library and adjust the <code>mathjax</code> configuration value.</p>
<p>Below is an example of how the plugin can be configured. If you don't intend to change these values you do not need to include the <code>math</code> config object at all.</p>
<p>```js
Reveal.initialize({
    // other options ...</p>
<pre><code>math: {
    mathjax: 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js',
    config: 'TeX-AMS_HTML-full'  // See http://docs.mathjax.org/en/latest/config-files.html
},

dependencies: [
    { src: 'plugin/math/math.js', async: true }
]
</code></pre>
<p>});
```</p>
<p>Read MathJax's documentation if you need <a href="http://docs.mathjax.org/en/latest/start.html#secure-access-to-the-cdn">HTTPS delivery</a> or serving of <a href="http://docs.mathjax.org/en/latest/configuration.html#loading-mathjax-from-the-cdn">specific versions</a> for stability.</p>
<h2>Installation</h2>
<p>The <strong>basic setup</strong> is for authoring presentations only. The <strong>full setup</strong> gives you access to all reveal.js features and plugins such as speaker notes as well as the development tasks needed to make changes to the source.</p>
<h3>Basic setup</h3>
<p>The core of reveal.js is very easy to install. You'll simply need to download a copy of this repository and open the index.html file directly in your browser.</p>
<ol>
<li>Download the latest version of reveal.js from <a href="https://github.com/hakimel/reveal.js/releases">https://github.com/hakimel/reveal.js/releases</a></li>
<li>Unzip and replace the example contents in index.html with your own</li>
<li>Open index.html in a browser to view it</li>
</ol>
<h3>Full setup</h3>
<p>Some reveal.js features, like external Markdown and speaker notes, require that presentations run from a local web server. The following instructions will set up such a server as well as all of the development tasks needed to make edits to the reveal.js source code.</p>
<ol>
<li>
<p>Install <a href="http://nodejs.org/">Node.js</a> (4.0.0 or later)</p>
</li>
<li>
<p>Clone the reveal.js repository
   <code>sh
   $ git clone https://github.com/hakimel/reveal.js.git</code></p>
</li>
<li>
<p>Navigate to the reveal.js folder
   <code>sh
   $ cd reveal.js</code></p>
</li>
<li>
<p>Install dependencies
   <code>sh
   $ npm install</code></p>
</li>
<li>
<p>Serve the presentation and monitor source files for changes
   <code>sh
   $ npm start</code></p>
</li>
<li>
<p>Open <a href="http://localhost:8000">http://localhost:8000</a> to view your presentation</p>
</li>
</ol>
<p>You can change the port by using <code>npm start -- --port=8001</code>.</p>
<h3>Folder Structure</h3>
<ul>
<li><strong>css/</strong> Core styles without which the project does not function</li>
<li><strong>js/</strong> Like above but for JavaScript</li>
<li><strong>plugin/</strong> Components that have been developed as extensions to reveal.js</li>
<li><strong>lib/</strong> All other third party assets (JavaScript, CSS, fonts)</li>
</ul>
<h2>License</h2>
<p>MIT licensed</p>
<p>Copyright (C) 2018 Hakim El Hattab, http://hakim.se</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Webcam Julia fractal</title>
        <link href="https://somethingorotherwhatever.com/items/webcam-julia-fractal"/>
        <id>https://somethingorotherwhatever.com/items/webcam-julia-fractal</id>
        <updated>2025-06-29T17:47:55.476000Z</updated>
        <summary type="html"><![CDATA[<p>Apply the Julia transform to the image from your webcam. It's horrible!</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <video autoplay src="https://somethingorotherwhatever.com/items/webcam-julia-fractal/main.mp4"></video>
                
                
                    <p>Apply the Julia transform to the image from your webcam. It's horrible!</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Julia sets to Mandelbrot</title>
        <link href="https://somethingorotherwhatever.com/items/julia-sets-to-mandelbrot"/>
        <id>https://somethingorotherwhatever.com/items/julia-sets-to-mandelbrot</id>
        <updated>2025-06-27T23:00:00Z</updated>
        <summary type="html"><![CDATA[<p>Shows how the Mandelbrot set relates to the Julia set. Made for Matt Parker.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <video autoplay src="https://somethingorotherwhatever.com/items/julia-sets-to-mandelbrot/main.mp4"></video>
                
                
                    <p>Shows how the Mandelbrot set relates to the Julia set. Made for Matt Parker.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Julia and Mandelbrot side-by-side</title>
        <link href="https://somethingorotherwhatever.com/items/julia-and-mandelbrot-side-by-side"/>
        <id>https://somethingorotherwhatever.com/items/julia-and-mandelbrot-side-by-side</id>
        <updated>2025-06-18T07:30:01.058000Z</updated>
        <summary type="html"><![CDATA[<p>Shows the Mandelbrot and Julia sets side-by-side, so you can see how they relate to each other.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <video autoplay src="https://somethingorotherwhatever.com/items/julia-and-mandelbrot-side-by-side/main.mp4"></video>
                
                
                    <p>Shows the Mandelbrot and Julia sets side-by-side, so you can see how they relate to each other.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Irrational Collatz function</title>
        <link href="https://somethingorotherwhatever.com/items/irrational-collatz-function"/>
        <id>https://somethingorotherwhatever.com/items/irrational-collatz-function</id>
        <updated>2025-06-06T09:51:40.344000Z</updated>
        <summary type="html"><![CDATA[<p>A quick investigation of how the Collatz function works if you extend it to irrational numbers, rounding down to an integer before applying the test.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <video autoplay src="https://somethingorotherwhatever.com/items/irrational-collatz-function/main.mp4"></video>
                
                
                    <p>Irrational Collatz</p>
<p>Davide Rotondo asked SeqFan what happens if you apply the Collatz rule to the integer part of irrational numbers?</p>
<p>This plots the number of steps to get back to 1 for values in the chosen range.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Numberphile: The 9-sided Enneahedron</title>
        <link href="https://somethingorotherwhatever.com/items/numberphile-the-9-sided-enneahedron"/>
        <id>https://somethingorotherwhatever.com/items/numberphile-the-9-sided-enneahedron</id>
        <updated>2025-06-01T23:00:00Z</updated>
        <summary type="html"><![CDATA[<p>I told Brady Haran about the Herschel enneahedron.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/numberphile-the-9-sided-enneahedron/main.png" />
                
                
                    <p>I told Brady Haran about the Herschel enneahedron.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Integer credits sequence</title>
        <link href="https://somethingorotherwhatever.com/items/integer-credits-sequence"/>
        <id>https://somethingorotherwhatever.com/items/integer-credits-sequence</id>
        <updated>2025-06-01T14:04:44.430000Z</updated>
        <summary type="html"><![CDATA[<p>What if the factorisation of an integer was presented like the credits at the end of a movie?</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <video autoplay src="https://somethingorotherwhatever.com/items/integer-credits-sequence/main.mp4"></video>
                
                
                    <p>What if the factorisation of an integer was presented like the credits at the end of a movie?</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Knop&#39;s game</title>
        <link href="https://somethingorotherwhatever.com/items/knop-s-game"/>
        <id>https://somethingorotherwhatever.com/items/knop-s-game</id>
        <updated>2025-05-22T06:24:00.165000Z</updated>
        <summary type="html"><![CDATA[]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/knop-s-game/main.png" />
                
                
                    <p>A game discussed on SeqFans on 2025-05-21, attributed to Konstantin Knop:</p>
<p>You have an infinite row of cells numbered with the integers (open in both directions). In the starting position, you have N counters on cell 0. At each move, you pick a starting cell, and move K counters from that starting cell to the cell K steps either to the right or left. The object of the game is to finish with all N counters on cell 1 in the smallest possible number of moves.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Magic Knight&#39;s tour tool</title>
        <link href="https://somethingorotherwhatever.com/items/magic-knight-s-tour-tool"/>
        <id>https://somethingorotherwhatever.com/items/magic-knight-s-tour-tool</id>
        <updated>2025-05-15T10:57:31.335000Z</updated>
        <summary type="html"><![CDATA[<p>An interactive tool for making a magic knight's tour of a chessboard.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <video autoplay src="https://somethingorotherwhatever.com/items/magic-knight-s-tour-tool/main.mp4"></video>
                
                
                    <p>Knight's tour explorer</p>
<p>Made by Christian Lawson-Perfect in 2025 - https://somethingorotherwhatever.com</p>
<p>This is an Elm app. To rebuild this, use https://elm-lang.org/. The build command is 
    elm make src/App.elm --output=app.js</p>
<p>The necessary files for use are:</p>
<ul>
<li>index.html</li>
<li>style.css</li>
<li>app.js</li>
<li>load-app.js</li>
</ul>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Aperiodic monotile reference</title>
        <link href="https://somethingorotherwhatever.com/items/aperiodic-monotile-reference"/>
        <id>https://somethingorotherwhatever.com/items/aperiodic-monotile-reference</id>
        <updated>2025-05-07T14:53:35.848000Z</updated>
        <summary type="html"><![CDATA[<p>A thing to help me lay out the Spectre aperiodic monotile tiling.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/aperiodic-monotile-reference/main.png" />
                
                
                    <p>A thing to help me lay out the Spectre aperiodic monotile tiling.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Numeral conversion</title>
        <link href="https://somethingorotherwhatever.com/items/numeral-conversion"/>
        <id>https://somethingorotherwhatever.com/items/numeral-conversion</id>
        <updated>2025-04-11T05:45:40.256000Z</updated>
        <summary type="html"><![CDATA[<p>A page that renders your chosen number in as many numeral systems as it can.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/numeral-conversion/main.png" />
                
                
                    <p>A page that renders your chosen number in as many numeral systems as it can.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>3D Herschel enneahedron</title>
        <link href="https://somethingorotherwhatever.com/items/3d-herschel-enneahedron"/>
        <id>https://somethingorotherwhatever.com/items/3d-herschel-enneahedron</id>
        <updated>2025-04-06T07:11:56.375000Z</updated>
        <summary type="html"><![CDATA[<p>An interactive 3D rendering of the Herschel enneahedron</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/3d-herschel-enneahedron/main.png" />
                
                
                    <p>An interactive 3D rendering of the Herschel enneahedron</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Colour vision deficiency simulator</title>
        <link href="https://somethingorotherwhatever.com/items/colour-vision-deficiency-simulator"/>
        <id>https://somethingorotherwhatever.com/items/colour-vision-deficiency-simulator</id>
        <updated>2025-04-04T06:10:14.151000Z</updated>
        <summary type="html"><![CDATA[<p>A tool which shows roughly how a given image will look with different kinds of colour vision deficiency.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/colour-vision-deficiency-simulator/main.png" />
                
                
                    <p>A tool which shows roughly how a given image will look with different kinds of colour vision deficiency.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Improving accessibility of teaching and assessment material in maths, stats and physics</title>
        <link href="https://somethingorotherwhatever.com/items/improving-accessibility-of-teaching-and-assessment-material-in-maths-stats-and-physics"/>
        <id>https://somethingorotherwhatever.com/items/improving-accessibility-of-teaching-and-assessment-material-in-maths-stats-and-physics</id>
        <updated>2025-03-21T09:45:01.186000Z</updated>
        <summary type="html"><![CDATA[<p>A poster presented at Newcastle University's learning and teaching conference.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/improving-accessibility-of-teaching-and-assessment-material-in-maths-stats-and-physics/main.png" />
                
                
                    <p>A poster presented at Newcastle University's learning and teaching conference.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Hilbert clock</title>
        <link href="https://somethingorotherwhatever.com/items/hilbert-clock"/>
        <id>https://somethingorotherwhatever.com/items/hilbert-clock</id>
        <updated>2025-03-16T09:14:49.516000Z</updated>
        <summary type="html"><![CDATA[<p>A clock where the 'hands' follow the Hilbert curve</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <video autoplay src="https://somethingorotherwhatever.com/items/hilbert-clock/main.mp4"></video>
                
                
                    <p>A clock where the 'hands' follow the Hilbert curve</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Roman coin converter</title>
        <link href="https://somethingorotherwhatever.com/items/roman-coin-converter"/>
        <id>https://somethingorotherwhatever.com/items/roman-coin-converter</id>
        <updated>2025-03-13T12:56:57.638000Z</updated>
        <summary type="html"><![CDATA[<p>A tiny tool to convert between denominations of Roman coins.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/roman-coin-converter/main.png" />
                
                
                    <p>A tiny tool to convert between denominations of Roman coins.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Accessible teaching for Maths, Stats and Physics</title>
        <link href="https://somethingorotherwhatever.com/items/accessible-teaching-for-maths-stats-and-physics"/>
        <id>https://somethingorotherwhatever.com/items/accessible-teaching-for-maths-stats-and-physics</id>
        <updated>2025-02-19T14:36:13Z</updated>
        <summary type="html"><![CDATA[<p>Guidance on accessible teaching maths, stats and physics</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/accessible-teaching-for-maths-stats-and-physics/main.png" />
                
                
                    <h1>Accessible teaching for maths, stats and physics</h1>
<p>This document was made by Scarlett Spackman and Christian Lawson-Perfect as part of a Summer project in 2024.</p>
<p>Scarlett is an undergraduate MMath student leaving Stage 3.</p>
<p>Christian is a senior learning software developer in the digital learning unit.</p>
<p>The purpose of this page is to show the importance of implementing reasonable adjustments in response to student needs and to offer you practical guidance on how to implement these adjustments efficiently. We argue that adopting a more inclusive teaching style using universal design principles is a good place to start and that embracing these changes will foster a supportive and fair learning environment that empowers each student, disabled or not, to reach their maximum potential.</p>
<h2>Building</h2>
<p>This is a <a href="https://www.chirun.org.uk/">Chirun</a> package.</p>
<h2>Licence</h2>
<p>This work © 2024 by Scarlett Spackman and Christian Lawson-Perfect for Newcastle University is licensed under <a href="https://creativecommons.org/licenses/by/4.0/?ref=chooser-v1">CC BY 4.0</a> <img alt="Creative Commons" style="height:1em" src="cc-logo.svg"> <img alt="Attribution required" style="height:1em" src="cc-by.svg">.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Thomson problem</title>
        <link href="https://somethingorotherwhatever.com/items/thomson-problem"/>
        <id>https://somethingorotherwhatever.com/items/thomson-problem</id>
        <updated>2025-02-18T13:08:49.889000Z</updated>
        <summary type="html"><![CDATA[<p>Made for Matt Parker. A visualisation of the Thomson problem - distributing points on a sphere to minimise the repulsion energy.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <video autoplay src="https://somethingorotherwhatever.com/items/thomson-problem/main.mp4"></video>
                
                
                    <p>Made for Matt Parker. A visualisation of the Thomson problem - distributing points on a sphere to minimise the repulsion energy.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Sorting game</title>
        <link href="https://somethingorotherwhatever.com/items/sorting-game"/>
        <id>https://somethingorotherwhatever.com/items/sorting-game</id>
        <updated>2025-02-17T09:46:41.118000Z</updated>
        <summary type="html"><![CDATA[<p>A few variations on sorting things in space. I made this for Helen but she didn't like it.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/sorting-game/main.png" />
                
                
                    <p>A few variations on sorting things in space. I made this for Helen but she didn't like it.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Accessibility demo day</title>
        <link href="https://somethingorotherwhatever.com/items/accessibility-demo-day"/>
        <id>https://somethingorotherwhatever.com/items/accessibility-demo-day</id>
        <updated>2025-02-13T10:58:41.935000Z</updated>
        <summary type="html"><![CDATA[<p>Material made to support an event I ran at Newcastle University.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/accessibility-demo-day/main.png" />
                
                
                    <p>Material made to support an event I ran at Newcastle University.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Fontsource font picker</title>
        <link href="https://somethingorotherwhatever.com/items/fontsource-font-picker"/>
        <id>https://somethingorotherwhatever.com/items/fontsource-font-picker</id>
        <updated>2025-02-11T10:45:51.244000Z</updated>
        <summary type="html"><![CDATA[<p>A page to browse through all the fonts available on fontsource.com, and to fiddle with the variable axes.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/fontsource-font-picker/main.png" />
                
                
                    <p>A page to browse through all the fonts available on fontsource.com, and to fiddle with the variable axes.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>CLP&#39;s map</title>
        <link href="https://somethingorotherwhatever.com/items/clp-s-map"/>
        <id>https://somethingorotherwhatever.com/items/clp-s-map</id>
        <updated>2025-02-03T13:43:56.350000Z</updated>
        <summary type="html"><![CDATA[<p>A map just for me. I realised that there were things I wanted to remember about certain places, but generic map apps show too much other information. I can make markers for new places and add relevant links or text.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/clp-s-map/main.png" />
                
                
                    <p>A map just for me. I realised that there were things I wanted to remember about certain places, but generic map apps show too much other information. I can make markers for new places and add relevant links or text.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>CSS Quest</title>
        <link href="https://somethingorotherwhatever.com/items/css-quest"/>
        <id>https://somethingorotherwhatever.com/items/css-quest</id>
        <updated>2025-01-31T19:21:57.477000Z</updated>
        <summary type="html"><![CDATA[<p>I thought it might be fun to make a text adventure game where you navigate by writing CSS selectors. If you write a selector that matches exactly one element, it's shown.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                
                    <p>I thought it might be fun to make a text adventure game where you navigate by writing CSS selectors. If you write a selector that matches exactly one element, it's shown.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>QR code generator</title>
        <link href="https://somethingorotherwhatever.com/items/qr-code-generator"/>
        <id>https://somethingorotherwhatever.com/items/qr-code-generator</id>
        <updated>2025-01-30T13:04:06.722000Z</updated>
        <summary type="html"><![CDATA[]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/qr-code-generator/main.png" />
                
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Hilbert dots</title>
        <link href="https://somethingorotherwhatever.com/items/hilbert-dots"/>
        <id>https://somethingorotherwhatever.com/items/hilbert-dots</id>
        <updated>2025-01-29T06:16:33.884000Z</updated>
        <summary type="html"><![CDATA[<p>Animation of dots moving along a Hilbert curve.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <video autoplay src="https://somethingorotherwhatever.com/items/hilbert-dots/main.mp4"></video>
                
                
                    <p>Animation of dots moving along a Hilbert curve.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Train track game</title>
        <link href="https://somethingorotherwhatever.com/items/train-track-game"/>
        <id>https://somethingorotherwhatever.com/items/train-track-game</id>
        <updated>2025-01-19T11:12:54.391000Z</updated>
        <summary type="html"><![CDATA[<p>The idea was to make a puzzle out of directing tokens along a train track diagram. I got as far as trying it with arithmetic operations and didn't really like it. Something with generic symbols and some restriction on the order they go through vertices might work better, but would be work.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/train-track-game/main.png" />
                
                
                    <p>The idea was to make a puzzle out of directing tokens along a train track diagram. I got as far as trying it with arithmetic operations and didn't really like it. Something with generic symbols and some restriction on the order they go through vertices might work better, but would be work.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Monthly MathsJam dates</title>
        <link href="https://somethingorotherwhatever.com/items/monthly-mathsjam-dates"/>
        <id>https://somethingorotherwhatever.com/items/monthly-mathsjam-dates</id>
        <updated>2025-01-12T08:45:04.310000Z</updated>
        <summary type="html"><![CDATA[<p>A table showing when the monthly MathsJams are, for each month of the year.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/monthly-mathsjam-dates/main.png" />
                
                
                    <p>A table showing when the monthly MathsJams are, for each month of the year.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Tiling the plane with one of each n-gon</title>
        <link href="https://somethingorotherwhatever.com/items/tiling-the-plane-with-one-of-each-n-gon"/>
        <id>https://somethingorotherwhatever.com/items/tiling-the-plane-with-one-of-each-n-gon</id>
        <updated>2025-01-07T09:37:07.493000Z</updated>
        <summary type="html"><![CDATA[<p>An animation showing how you can cover the plane using only one of each n-gon.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <video autoplay src="https://somethingorotherwhatever.com/items/tiling-the-plane-with-one-of-each-n-gon/main.mp4"></video>
                
                
                    <p>An animation showing how you can cover the plane using only one of each n-gon.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Emoji search</title>
        <link href="https://somethingorotherwhatever.com/items/emoji-search"/>
        <id>https://somethingorotherwhatever.com/items/emoji-search</id>
        <updated>2025-01-04T08:54:56.414000Z</updated>
        <summary type="html"><![CDATA[<p>A quick page to find emoji matching a search word.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/emoji-search/main.png" />
                
                
                    <p>From https://github.com/samhenrigold/emoji-metadata</p>
<p>Search for emoji</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Draggy road game</title>
        <link href="https://somethingorotherwhatever.com/items/draggy-road-game"/>
        <id>https://somethingorotherwhatever.com/items/draggy-road-game</id>
        <updated>2025-01-01T10:20:03.882000Z</updated>
        <summary type="html"><![CDATA[<p>I thought it'd be nice to make a game out of connecting different places with roads and building things. I couldn't decide how much resource management was fun.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/draggy-road-game/main.png" />
                
                
                    <p>I thought it'd be nice to make a game out of connecting different places with roads and building things. I couldn't decide how much resource management was fun.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Wobble block</title>
        <link href="https://somethingorotherwhatever.com/items/wobble-block"/>
        <id>https://somethingorotherwhatever.com/items/wobble-block</id>
        <updated>2024-12-18T16:40:03.546000Z</updated>
        <summary type="html"><![CDATA[]]></summary>
        <content type="html">
                <![CDATA[
                
                    <video autoplay src="https://somethingorotherwhatever.com/items/wobble-block/main.mp4"></video>
                
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Aperiodic monotile hoodie designer</title>
        <link href="https://somethingorotherwhatever.com/items/aperiodic-monotile-hoodie-designer"/>
        <id>https://somethingorotherwhatever.com/items/aperiodic-monotile-hoodie-designer</id>
        <updated>2024-12-02T10:53:58.921000Z</updated>
        <summary type="html"><![CDATA[<p>A tool to design a an all-over printed hoodie using the Spectre aperiodic monotile.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/aperiodic-monotile-hoodie-designer/main.png" />
                
                
                    <p>A tool to design a an all-over printed hoodie using the Spectre aperiodic monotile.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Hex-grid wallpaper</title>
        <link href="https://somethingorotherwhatever.com/items/hex-grid-wallpaper"/>
        <id>https://somethingorotherwhatever.com/items/hex-grid-wallpaper</id>
        <updated>2024-11-22T09:56:26.434000Z</updated>
        <summary type="html"><![CDATA[<p>A pattern to print out on a big vinyl sticker, to use as a whiteboard in my office.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/hex-grid-wallpaper/main.png" />
                
                
                    <p>A pattern to print out on a big vinyl sticker, to use as a whiteboard in my office.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Wobble on a hex grid</title>
        <link href="https://somethingorotherwhatever.com/items/wobble-on-a-hex-grid"/>
        <id>https://somethingorotherwhatever.com/items/wobble-on-a-hex-grid</id>
        <updated>2024-10-18T11:35:08.876000Z</updated>
        <summary type="html"><![CDATA[<p>Recreating a design I saw made by someone else, but on a hex grid.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <video autoplay src="https://somethingorotherwhatever.com/items/wobble-on-a-hex-grid/main.mp4"></video>
                
                
                    <p>Recreating a design I saw made by someone else, but on a hex grid.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Mandelbrot fractal</title>
        <link href="https://somethingorotherwhatever.com/items/mandelbrot-fractal"/>
        <id>https://somethingorotherwhatever.com/items/mandelbrot-fractal</id>
        <updated>2024-10-10T07:01:18.926000Z</updated>
        <summary type="html"><![CDATA[<p>A Mandelbrot fractal visualiser written using WebGL.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <video autoplay src="https://somethingorotherwhatever.com/items/mandelbrot-fractal/main.mp4"></video>
                
                
                    <p>A Mandelbrot fractal visualiser written using WebGL.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Dynamic system dot plot</title>
        <link href="https://somethingorotherwhatever.com/items/dynamic-system-dot-plot"/>
        <id>https://somethingorotherwhatever.com/items/dynamic-system-dot-plot</id>
        <updated>2024-10-04T11:02:43.803000Z</updated>
        <summary type="html"><![CDATA[]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/dynamic-system-dot-plot/main.png" />
                
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Explain this grid sequence</title>
        <link href="https://somethingorotherwhatever.com/items/explain-this-grid-sequence"/>
        <id>https://somethingorotherwhatever.com/items/explain-this-grid-sequence</id>
        <updated>2024-09-11T15:05:19.858000Z</updated>
        <summary type="html"><![CDATA[<p>Made to accompany a video about an integer sequence I came up with.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/explain-this-grid-sequence/main.png" />
                
                
                    <p>Made to accompany a video about an integer sequence I came up with.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Automatic colour palette maker</title>
        <link href="https://somethingorotherwhatever.com/items/automatic-colour-palette-maker"/>
        <id>https://somethingorotherwhatever.com/items/automatic-colour-palette-maker</id>
        <updated>2024-08-30T13:59:09.588000Z</updated>
        <summary type="html"><![CDATA[<p>A tool I made to help think about how to make a customisable, accessible colour palette.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/automatic-colour-palette-maker/main.png" />
                
                
                    <p>A tool I made to help think about how to make a customisable, accessible colour palette.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Which colours are similar?</title>
        <link href="https://somethingorotherwhatever.com/items/which-colours-are-similar"/>
        <id>https://somethingorotherwhatever.com/items/which-colours-are-similar</id>
        <updated>2024-08-08T13:44:06.147000Z</updated>
        <summary type="html"><![CDATA[<p>A tool which plots a list of colours on polar coordinates, to help spot similar colours.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/which-colours-are-similar/main.png" />
                
                
                    <p>A tool which plots a list of colours on polar coordinates, to help spot similar colours.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Entropy animation</title>
        <link href="https://somethingorotherwhatever.com/items/entropy-animation"/>
        <id>https://somethingorotherwhatever.com/items/entropy-animation</id>
        <updated>2024-07-25T13:31:07.283000Z</updated>
        <summary type="html"><![CDATA[<p>An animation of text diffusing.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <video autoplay src="https://somethingorotherwhatever.com/items/entropy-animation/main.mp4"></video>
                
                
                    <p>An animation of text diffusing.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Unicode scroll</title>
        <link href="https://somethingorotherwhatever.com/items/unicode-scroll"/>
        <id>https://somethingorotherwhatever.com/items/unicode-scroll</id>
        <updated>2024-07-17T11:56:59.708000Z</updated>
        <summary type="html"><![CDATA[<p>Another iteration in my ongoing exploration of the Unicode character set.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/unicode-scroll/main.png" />
                
                
                    <p>Another iteration in my ongoing exploration of the Unicode character set.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Big Internet Math-Off vote plot</title>
        <link href="https://somethingorotherwhatever.com/items/big-internet-math-off-vote-plot"/>
        <id>https://somethingorotherwhatever.com/items/big-internet-math-off-vote-plot</id>
        <updated>2024-07-01T09:40:11.116000Z</updated>
        <summary type="html"><![CDATA[<p>A tool to plot the votes for each Big Internet Math-Off match, over time</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/big-internet-math-off-vote-plot/main.png" />
                
                
                    <p>A tool to plot the votes for each Big Internet Math-Off match, over time</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Add a TeX command to MathJax v3</title>
        <link href="https://somethingorotherwhatever.com/items/add-a-tex-command-to-mathjax-v3"/>
        <id>https://somethingorotherwhatever.com/items/add-a-tex-command-to-mathjax-v3</id>
        <updated>2024-06-17T11:06:20.692000Z</updated>
        <summary type="html"><![CDATA[<p>Shows how to add a TeX comand to MathJax 3, which parses its (non-TeX) input and returns TeX code to go be substituted for the macro.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/add-a-tex-command-to-mathjax-v3/main.png" />
                
                
                    <p>Shows how to add a TeX comand to MathJax 3, which parses its (non-TeX) input and returns TeX code to go be substituted for the macro.</p>
<p>Tooted: https://mathstodon.xyz/@christianp/112631902685965806</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Can Elm make arbitrary HTML in a custom element?</title>
        <link href="https://somethingorotherwhatever.com/items/can-elm-make-arbitrary-html-in-a-custom-element"/>
        <id>https://somethingorotherwhatever.com/items/can-elm-make-arbitrary-html-in-a-custom-element</id>
        <updated>2024-06-11T16:02:58Z</updated>
        <summary type="html"><![CDATA[<p>I worked out how to put arbitrary HTML inside an Elm app, using a custom element</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/can-elm-make-arbitrary-html-in-a-custom-element/main.png" />
                
                
                    <p>I've been wondering for a while how to put arbitrary HTML inside an Elm app.</p>
<p>I wondered if I could register a custom HTML element which takes a string of HTML code as an attribute, and sets the <code>innerHTML</code> of its shadow root to that code. The Elm app could then create an instance of that element and pass a string of HTML to it.</p>
<p>It works!</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Numbas poster</title>
        <link href="https://somethingorotherwhatever.com/items/numbas-poster"/>
        <id>https://somethingorotherwhatever.com/items/numbas-poster</id>
        <updated>2024-05-22T14:11:08Z</updated>
        <summary type="html"><![CDATA[<p>A poster about Numbas.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/numbas-poster/main.png" />
                
                
                    <p>A poster about <a href="https://numbas.org.uk">Numbas</a>, an open-source e-assessment system.</p>
<p>It's designed to be printed at A2 size.</p>
<p>The file <code>numbas-poster.svg</code> is the source file; the PDF and PNG files are created from it.</p>
<p>This work is licensed under <a href="https://creativecommons.org/licenses/by/4.0">CC BY 4.0</a>. You are free to share and adapt this poster under the terms of the CC BY 4.0 licence.</p>
<p><img alt="Numbas poster" src="numbas-poster.png" /></p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Order those numbers!</title>
        <link href="https://somethingorotherwhatever.com/items/order-those-numbers"/>
        <id>https://somethingorotherwhatever.com/items/order-those-numbers</id>
        <updated>2024-05-16T19:07:10Z</updated>
        <summary type="html"><![CDATA[<p>You'll be shown five numbers, between 100 and 999. Try to guess what order the numbers will go in, from smallest to biggest.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <video autoplay src="https://somethingorotherwhatever.com/items/order-those-numbers/main.mp4"></video>
                
                
                    <p>You'll be shown five numbers, between 100 and 999. Try to guess what order the numbers will go in, from smallest to biggest.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Eukleides editor</title>
        <link href="https://somethingorotherwhatever.com/items/eukleides-editor"/>
        <id>https://somethingorotherwhatever.com/items/eukleides-editor</id>
        <updated>2024-05-04T08:06:56.238000Z</updated>
        <summary type="html"><![CDATA[<p>An editor for Eukleides diagrams.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/eukleides-editor/main.png" />
                
                
                    <p>An editor for Eukleides diagrams.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Embedded Numbas question</title>
        <link href="https://somethingorotherwhatever.com/items/embedded-numbas-question"/>
        <id>https://somethingorotherwhatever.com/items/embedded-numbas-question</id>
        <updated>2024-04-30T07:59:03.262000Z</updated>
        <summary type="html"><![CDATA[<p>Shows how to embed a Numbas question in a page using an iframe tag</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/embedded-numbas-question/main.png" />
                
                
                    <p>Shows how to embed a Numbas question in a page using an iframe tag</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>JME calculator</title>
        <link href="https://somethingorotherwhatever.com/items/jme-calculator"/>
        <id>https://somethingorotherwhatever.com/items/jme-calculator</id>
        <updated>2024-04-19T12:03:55.832000Z</updated>
        <summary type="html"><![CDATA[<p>A calculator that uses JME expressions.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/jme-calculator/main.png" />
                
                
                    <p>A calculator which takes JME expressions.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>SVG animation</title>
        <link href="https://somethingorotherwhatever.com/items/svg-animation"/>
        <id>https://somethingorotherwhatever.com/items/svg-animation</id>
        <updated>2024-03-22T11:41:27.073000Z</updated>
        <summary type="html"><![CDATA[<p>A simple spinner using the SVG animate tag</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <video autoplay src="https://somethingorotherwhatever.com/items/svg-animation/main.mp4"></video>
                
                
                    <p>A simple spinner animation using the SVG <code>&lt;animate&gt;</code> tag.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Nudging along implicit curves</title>
        <link href="https://somethingorotherwhatever.com/items/nudging-along-implicit-curves"/>
        <id>https://somethingorotherwhatever.com/items/nudging-along-implicit-curves</id>
        <updated>2024-03-22T08:05:48.758000Z</updated>
        <summary type="html"><![CDATA[<p>Inspired by work of Elliot Vez on nudging a point along an implicitly-defined curve.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <video autoplay src="https://somethingorotherwhatever.com/items/nudging-along-implicit-curves/main.mp4"></video>
                
                
                    <p>Trying to replicate <a href="https://mathstodon.xyz/@vez/112128906003230079">Elliot's thing to nudge a point along a curve</a>.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Binary clock</title>
        <link href="https://somethingorotherwhatever.com/items/binary-clock"/>
        <id>https://somethingorotherwhatever.com/items/binary-clock</id>
        <updated>2024-03-05T09:44:37.363000Z</updated>
        <summary type="html"><![CDATA[<p>A clock with a hand for each power of two seconds.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <video autoplay src="https://somethingorotherwhatever.com/items/binary-clock/main.mp4"></video>
                
                
                    <p>A clock with a hand for each power of two seconds.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Binary letter search</title>
        <link href="https://somethingorotherwhatever.com/items/binary-letter-search"/>
        <id>https://somethingorotherwhatever.com/items/binary-letter-search</id>
        <updated>2024-03-05T09:44:37.363000Z</updated>
        <summary type="html"><![CDATA[<p>Letters are positioned on a binary tree. How quickly can you visit every letter?</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/binary-letter-search/main.png" />
                
                
                    <p>Letters are positioned on a binary tree. How quickly can you visit every letter?</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Dig a hole game</title>
        <link href="https://somethingorotherwhatever.com/items/dig-a-hole-game"/>
        <id>https://somethingorotherwhatever.com/items/dig-a-hole-game</id>
        <updated>2024-03-05T09:44:37.363000Z</updated>
        <summary type="html"><![CDATA[<p>I wanted to make a game where you have to think a bit, but not too much.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/dig-a-hole-game/main.png" />
                
                
                    <p>I wanted to make a game where you have to think a bit, but not too much.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Make numbers more exciting</title>
        <link href="https://somethingorotherwhatever.com/items/make-numbers-more-exciting"/>
        <id>https://somethingorotherwhatever.com/items/make-numbers-more-exciting</id>
        <updated>2024-03-05T09:44:37.363000Z</updated>
        <summary type="html"><![CDATA[<p>A button that takes a number and makes it more complicated by expanding it to a mathematical operation.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <video autoplay src="https://somethingorotherwhatever.com/items/make-numbers-more-exciting/main.mp4"></video>
                
                
                    <p>A button that takes a number and makes it more complicated by expanding it to a mathematical operation.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Metro info</title>
        <link href="https://somethingorotherwhatever.com/items/metro-info"/>
        <id>https://somethingorotherwhatever.com/items/metro-info</id>
        <updated>2024-03-05T09:44:37.363000Z</updated>
        <summary type="html"><![CDATA[<p>A page to show the next train times for the Tyne and Wear Metro. I made this because the official app is rubbish.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/metro-info/main.png" />
                
                
                    <p>JSON files:</p>
<p>lines.json
  Maps line names ("GREEN" or "YELLOW") to a list of stations along that line, with properties "key" (string) and "position" (list of two floats).</p>
<p>platforms.json
  From https://github.com/danielgjackson/metro-rti/blob/main/data/platforms.json
  Maps station keys to objects:</p>
<p>"platformNumber": int
  "direction": string, "IN" or "OUT"
  "helperText": string, readable description of the direction of travel</p>
<p>station-directions.json
  Maps station keys to a dictionary mapping platform numbers to the angle of that platform on the map.</p>
<p>station-positions.json
  Maps line names ("green" or "yellow") to a list of pairs of floats, giving the position on the map of each station on the line.</p>
<p>stations.json
  From https://github.com/danielgjackson/metro-rti/blob/main/data/stations.json
  Maps station keys to readable station names.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Numbas theme written in Elm</title>
        <link href="https://somethingorotherwhatever.com/items/numbas-theme-written-in-elm"/>
        <id>https://somethingorotherwhatever.com/items/numbas-theme-written-in-elm</id>
        <updated>2024-03-05T09:44:37.363000Z</updated>
        <summary type="html"><![CDATA[<p>I'm working on writing display code for Numbas in Elm. This page shows a demo exam.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                
                    <p>I'm working on writing display code for Numbas in Elm. This page shows a demo exam.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Reverse the list of integers</title>
        <link href="https://somethingorotherwhatever.com/items/reverse-the-list-of-integers"/>
        <id>https://somethingorotherwhatever.com/items/reverse-the-list-of-integers</id>
        <updated>2024-03-05T09:44:37.363000Z</updated>
        <summary type="html"><![CDATA[<p>A puzzle invented by Alexandre Muñiz where you have to reverse a list of integers with a constrained set of moves.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <video autoplay src="https://somethingorotherwhatever.com/items/reverse-the-list-of-integers/main.mp4"></video>
                
                
                    <p>A game invented by Alexandre Muñiz: https://mathstodon.xyz/@two_star/112242224494626411</p>
<blockquote>
<p>Here's a puzzle game. I call it Reverse the List of Integers. How it works is, you start with a list of positive integers, (e.g. [7, 5, 3]) and your goal is to make the same list, in reverse ([3, 5, 7]). You have two moves you can make:</p>
<p>1) Split an integer into two smaller integers. (e.g. [7, 5, 3] → [6, 1, 5, 3])
2) Combine (add) two integers into a larger one. (e.g. reverse the last e.g.)</p>
<p>There are two restrictions that seem natural for making this into an interesting game:</p>
<p>1) You can never make an integer greater than the largest integer in the original list.
2) You can never make a move that results in the same integer appearing in the list more than once.</p>
</blockquote>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Unix epoch clock</title>
        <link href="https://somethingorotherwhatever.com/items/unix-epoch-clock"/>
        <id>https://somethingorotherwhatever.com/items/unix-epoch-clock</id>
        <updated>2024-03-05T09:44:37.363000Z</updated>
        <summary type="html"><![CDATA[<p>A clock which shows the unix epoch - the number of seconds since new year, 1970. There is a hand for each power of 10 seconds.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <video autoplay src="https://somethingorotherwhatever.com/items/unix-epoch-clock/main.mp4"></video>
                
                
                    <p>A clock which shows the unix epoch - the number of seconds since new year, 1970. There is a hand for each power of 10 seconds.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Think server</title>
        <link href="https://somethingorotherwhatever.com/items/think-server"/>
        <id>https://somethingorotherwhatever.com/items/think-server</id>
        <updated>2024-03-04T15:05:19Z</updated>
        <summary type="html"><![CDATA[<p>A server for my code experiments, like glitch.com but under my own control.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                
                    <p>I've moved this repository to my code forge: https://code.lawson-perfect.uk/clp/thinkserver</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Hyperjumps knockoff</title>
        <link href="https://somethingorotherwhatever.com/items/hyperjumps-knockoff"/>
        <id>https://somethingorotherwhatever.com/items/hyperjumps-knockoff</id>
        <updated>2024-02-18T16:56:24Z</updated>
        <summary type="html"><![CDATA[<p>An implementation of Quanta Magazine's Hyperjumps game. There was some discussion on the Talking Maths in Public group about how difficult to understand Quanta's presentation is.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/hyperjumps-knockoff/main.png" />
                
                
                    <p>An implementation of Quanta Magazine's Hyperjumps game. There was some discussion on the Talking Maths in Public group about how difficult to understand Quanta's presentation is.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>How should I colour the days?</title>
        <link href="https://somethingorotherwhatever.com/items/how-should-i-colour-the-days"/>
        <id>https://somethingorotherwhatever.com/items/how-should-i-colour-the-days</id>
        <updated>2024-02-14T14:15:14.238000Z</updated>
        <summary type="html"><![CDATA[<p>I'd like to colour the days of the year by changing the hue parameter of an oklch colour with the day of the year. How do I have to shift the number so that summer is reddish and winter is blueish? </p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <video autoplay src="https://somethingorotherwhatever.com/items/how-should-i-colour-the-days/main.mp4"></video>
                
                
                    <p>I'd like to colour the days of the year by changing the hue parameter of an oklch colour with the day of the year. How do I have to shift the number so that summer is reddish and winter is blueish? </p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Tiny Elvis</title>
        <link href="https://somethingorotherwhatever.com/items/tiny-elvis"/>
        <id>https://somethingorotherwhatever.com/items/tiny-elvis</id>
        <updated>2024-01-15T13:08:15Z</updated>
        <summary type="html"><![CDATA[<p>A JavaScript port of the Tiny Elvis application, created in 1994 for Windows 3.1 by Matthew T. Smith</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <video autoplay src="https://somethingorotherwhatever.com/items/tiny-elvis/main.mp4"></video>
                
                
                    <h1>Tiny Elvis in JavaScript</h1>
<p>Christian Lawson-Perfect (https://somethingorotherwhatever.com,
christian@lawson-perfect.uk), 2024, based on the original by Matthew T. Smith
for Pegasus Development, 1994.</p>
<p>Tiny Elvis was a Windows 3.1 program written by Matthew T. Smith. It placed a
tiny pixel-art Elvis on your desktop, who would occasionally comment on the
enormity of the things around him.</p>
<p>I've recreated Tiny Elvis as a web page, using the original art and sounds.
The README says the program is in the public domain, but asks us to only
distribute the original files without disassembling the executable. There's a
vague bit saying it's OK to extract the icons.</p>
<p>I think that extracting the picture files 30 years later is probably OK,
but to be safe the git repository only includes the files from the original
zip package, along with a Makefile to extract the art and convert it to png
format, using <code>wrestool</code> and imagemagick's <code>convert</code> command.</p>
<p>I didn't do anything with the Easter Egg messages which you could activate in
the original by double-clicking the E icon in the "About Tiny Elvis" dialog.</p>
<p>To recreate the files after cloning the repository, run <code>make extract_icons</code>
and then <code>make default resources</code>.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Colourblind palette maker</title>
        <link href="https://somethingorotherwhatever.com/items/colourblind-palette-maker"/>
        <id>https://somethingorotherwhatever.com/items/colourblind-palette-maker</id>
        <updated>2024-01-12T14:39:30.668000Z</updated>
        <summary type="html"><![CDATA[<p>A tool to help me, with limited colour vision, make accessible colour palettes.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/colourblind-palette-maker/main.png" />
                
                
                    <p>A tool to help me, with limited colour vision, make accessible colour palettes.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Randomised permutation chart curves</title>
        <link href="https://somethingorotherwhatever.com/items/randomised-permutation-chart-curves"/>
        <id>https://somethingorotherwhatever.com/items/randomised-permutation-chart-curves</id>
        <updated>2024-01-10T13:06:30.199000Z</updated>
        <summary type="html"><![CDATA[<p>Experimenting with how the curves joining points in a permutation chart are chosen.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/randomised-permutation-chart-curves/main.png" />
                
                
                    <p>Experimenting with how the curves joining points in a permutation chart are chosen.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Double Back</title>
        <link href="https://somethingorotherwhatever.com/items/double-back"/>
        <id>https://somethingorotherwhatever.com/items/double-back</id>
        <updated>2023-12-12T16:01:52Z</updated>
        <summary type="html"><![CDATA[<p>A puzzle where you have to reverse the order of two lines of numbered baubles. Invented by Ed Kirkby.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/double-back/main.png" />
                
                
                    <h1>Double back</h1>
<p>This is a puzzle invented by Ed Kirkby, and shown to me at MathsJam Gathering in 2022.</p>
<p>There's a blog post about it at https://aperiodical.com/2023/12/the-double-back-puzzle-is-a-nice-mix-of-towers-of-hanoi-and-solitaire/.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Wordy Christmas cards</title>
        <link href="https://somethingorotherwhatever.com/items/wordy-christmas-cards"/>
        <id>https://somethingorotherwhatever.com/items/wordy-christmas-cards</id>
        <updated>2023-12-11T15:02:35Z</updated>
        <summary type="html"><![CDATA[<p>A tool to make art consisting of text drawn over an image, avoiding a mask drawn by hand. Heavily inspired by Litographs, made for Christmas cards in 2023.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/wordy-christmas-cards/main.png" />
                
                
                    <p>A tool to make art consisting of text drawn over an image, avoiding a mask drawn by hand. Heavily inspired by Litographs, made for Christmas cards in 2023.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Clip my face</title>
        <link href="https://somethingorotherwhatever.com/items/clip-my-face"/>
        <id>https://somethingorotherwhatever.com/items/clip-my-face</id>
        <updated>2023-11-25T13:35:59.223000Z</updated>
        <summary type="html"><![CDATA[<p>The beginnings of an idea about quickly cutting out sprites from a drawing. I used a photo of myself as a toddler as the test image.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <video autoplay src="https://somethingorotherwhatever.com/items/clip-my-face/main.mp4"></video>
                
                
                    <p>The beginnings of an idea about quickly cutting out sprites from a drawing. I used a photo of myself as a toddler as the test image.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Morse Key</title>
        <link href="https://somethingorotherwhatever.com/items/morse-key"/>
        <id>https://somethingorotherwhatever.com/items/morse-key</id>
        <updated>2023-06-19T11:46:26.325000Z</updated>
        <summary type="html"><![CDATA[<p>A Morse code key made for Ayliean MacDonald.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <video autoplay src="https://somethingorotherwhatever.com/items/morse-key/main.mp4"></video>
                
                
                    <p>A Morse code key made for Ayliean MacDonald.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>GeoGebra custom element</title>
        <link href="https://somethingorotherwhatever.com/items/geogebra-custom-element"/>
        <id>https://somethingorotherwhatever.com/items/geogebra-custom-element</id>
        <updated>2023-05-08T10:33:33Z</updated>
        <summary type="html"><![CDATA[<p>A web component to embed a GeoGebra applet</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/geogebra-custom-element/main.png" />
                
                
                    <h1>geogebra-component.js</h1>
<p>A web component to embed a GeoGebra applet.</p>
<p>It's a wrapper around <code>deployggb.js</code> provided by GeoGebra.</p>
<h2>Usage</h2>
<h3>Construct a worksheet from scratch</h3>
<p>Write GeoGebra commands inside the tag.
These commands are evaluated immediately after the applet loads.</p>
<p><code>&lt;geogebra-applet&gt;
  A = (1,2)
&lt;/geogebra-applet&gt;</code></p>
<h3>Load a worksheet from GeoGebra.org by ID</h3>
<p><code>&lt;geogebra-applet material="sA5Mb4vd" /&gt;
&lt;geogebra-applet material="https://www.geogebra.org/m/sA5Mb4vd" /&gt;</code></p>
<p>You can give just the ID, or you can give the full URL of a geogebra material, because that's easier to think about!</p>
<h3>Documentation</h3>
<p>There's <a href="https://somethingorotherwhatever.com/geogebra-component/reference.html">a full API reference</a> and <a href="https://somethingorotherwhatever.com/geogebra-component/">a page of examples</a>.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>QR code generator (Glitch)</title>
        <link href="https://somethingorotherwhatever.com/items/qr-code-generator-glitch"/>
        <id>https://somethingorotherwhatever.com/items/qr-code-generator-glitch</id>
        <updated>2023-05-03T10:38:07.401000Z</updated>
        <summary type="html"><![CDATA[<p>A really simple tool which generates a QR code containing the given text.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/qr-code-generator-glitch/main.png" />
                
                
                    <p>A really simple tool which generates a QR code containing the given text.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Keyboard bashing</title>
        <link href="https://somethingorotherwhatever.com/items/keyboard-bashing"/>
        <id>https://somethingorotherwhatever.com/items/keyboard-bashing</id>
        <updated>2023-04-10T03:53:16.982000Z</updated>
        <summary type="html"><![CDATA[<p>For my toddler to bang away at the keyboard</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/keyboard-bashing/main.png" />
                
                
                    <p>For my toddler to bang away at the keyboard</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Unicode math normalization</title>
        <link href="https://somethingorotherwhatever.com/items/unicode-math-normalization"/>
        <id>https://somethingorotherwhatever.com/items/unicode-math-normalization</id>
        <updated>2023-03-29T14:46:40Z</updated>
        <summary type="html"><![CDATA[<p>Data for normalizing mathematical expressions written in Unicode</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                
                    <h1>Data for normalizing mathematical expressions written in Unicode</h1>
<p>Unicode is the standard encoding for text.
There are thousands of glyphs, representing letters, characters, symbols and marks from a huge variety of scripts and contexts.</p>
<p>There are many repeated, variant or combined characters.
These can be normalized to a subset of characters, using standard normalization algorithms.</p>
<p>These algorithms are generic: when used in a mathematical context, they might not apply an equivalence between two characters, or omit some information that would be useful.</p>
<p>So this project aims to compile a dictionary of mappings from less-common Unicode characters to the symbols conventionally used in linear mathematical expressions.</p>
<p>The motivation is to support more characters in the JME language used by Numbas.
The JME grammar has the following kinds of token:</p>
<ul>
<li>Name (either variable name or function name)</li>
<li>Number</li>
<li>Operator (Binary or unary, prefix or postfix)</li>
<li>Punctuation (Brackets, parentheses, argument separators)</li>
</ul>
<p>Any string of letter characters is acceptable for name tokens, but there are many equivalences that should be applied:</p>
<ul>
<li>Greek letters and their Latin names, e.g. <code>α</code> and <code>alpha</code>.</li>
<li>Special symbols, such as <code>∞</code> and <code>infinity</code>.</li>
<li>Superscript/subscript symbols should be equivalent to the syntax for marking normal characters as sub/superscripts, e.g. <code>x²</code> is equivalent to <code>x^2</code>.</li>
<li>There are many Unicode symbols that correspond to named functions, e.g. <code>√</code> is equivalent to <code>sqrt</code>, or to operations that are conventionally typed in ASCII, e.g. <code>×</code> is equivalent to <code>*</code>.</li>
<li>There are lots of mathematical letter glyphs representing Latin or Greek letters with some styling applied. These should be equivalent to the corresponding unstyled letters, with an annotation recording the styling.</li>
</ul>
<p>Digit symbols should be normalized to the ASCII digits 0-9, where possible.
Non-European scripts for representing numbers would need to be dealt with individually.</p>
<p>There are lots of varieties of brackets, which should normalize to the ASCII parentheses <code>()</code>, square brackets <code>[]</code> and curly brackets <code>{}</code>.</p>
<h2>Contents of this repository</h2>
<p>There is a Jupyter notebook, <code>unicode-math-mapping.ipynb</code>, which contains code for working through subsets of Unicode and producing mapping dictionaries.</p>
<p>There are some mappings that can be produced automatically, and some that had to be written out manually - these are defined by the <code>.tsv</code> files in the root of this repository.</p>
<h2>Using the data</h2>
<p>The mapping information is stored in <code>.json</code> files in the <code>final_data</code> directory.
Each of these files contains a single dictionary mapping single Unicode characters to an equivalent string, and an array of annotations, which are themselves ASCII strings.
For example, this is the entry in <code>final_data/symbols.json</code> for <code>𝒚</code>, "MATHEMATICAL BOLD ITALIC SMALL Y":</p>
<p><code>"\ud835\udc9a": [
    "y",
    [
        "BOLD",
        "ITALIC"
    ]
],</code></p>
<p>There are five files:</p>
<ul>
<li><code>greek.json</code> - mapping Greek letters to their English names, e.g. <code>α</code> to <code>alpha</code>.</li>
<li><code>letters.json</code> - mapping mathematical letters to their standard equivalents, with annotatoins.</li>
<li><code>subscripts.json</code> - mapping superscript characters to their standard equivalents.</li>
<li><code>superscripts.json</code> - mapping subscript characters to their standard equivalents.</li>
<li><code>symbols.json</code> - mapping all sorts of mathematical symbols to common symbols, names, or sub-expressions. Some symbols are mapped to a string of the form <code>not NAME</code> - you might have to do some processing to interpret these correctly, instead of just substituting the mapped string into the expression being parsed.</li>
</ul>
<p>The mappings must be applied as part of the tokenisation step when parsing a mathematical expression.</p>
<p>It is not correct to do a global substitution of characters before parsing: for example, in the expression <code>α = "α"</code>, the second occurrence of <code>α</code> should be preserved because it's inside a string literal.</p>
<p>You will have to come up with a way of applying the produced mappings to a particular computer algebra system.</p>
<h2>Contributing to this project</h2>
<p>There were many decisions to make in producing the mapping of characters.
I omitted most symbols relating to operations that are very unlikely to be used in an undergraduate maths course.</p>
<p>The function names for mappings were sometimes chosen arbitrarily - there might be standard names for these in some computer algebra systems.</p>
<p>If you use these mappings, please tell me!</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Aperiodic monotile images</title>
        <link href="https://somethingorotherwhatever.com/items/aperiodic-monotile-images"/>
        <id>https://somethingorotherwhatever.com/items/aperiodic-monotile-images</id>
        <updated>2023-03-21T09:43:34Z</updated>
        <summary type="html"><![CDATA[<p>Smith, Myers, Kaplan and Goodman-Strauss's aperiodic monotile, in a variety of formats</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/aperiodic-monotile-images/main.png" />
                
                
                    <h1>The aperiodic monotile in a variety of formats</h1>
<p>This repository contains code and vector image files to produce <a href="https://cs.uwaterloo.ca/~csk/hat/">the aperiodic monotiles found by David Smith, Joseph Samuel Myers, Craig S. Kaplan, and Chaim Goodman-Strauss</a>.</p>
<p>There are two monotiles, which each tile the plane aperiodically.</p>
<p>A 'hat':</p>
<p><img alt="A hat-like polygon" src="hat-monotile.png" /></p>
<p>And a 'turtle':</p>
<p><img alt="A turtle-like polygon" src="turtle-monotile.png" /></p>
<p>Each file produces a single copy of the tile. Several copies of the tile, with some flipped or mirrored, fit together to tile the plane.</p>
<p>The files are:</p>
<ul>
<li><a href="hat-monotile.svg">hat-monotile.svg</a> / <a href="turtle-monotile.svg">turtle-monotile.svg</a> - A vector graphics file for use in programs such as Inkscape or Adobe Illustrator.</li>
<li><a href="hat-monotile-kites.svg">hat-monotile-kites.svg</a> / <a href="turtle-monotile-kites.svg">turtle-monotile-kites.svg</a> - A vector graphics file showing the construction of each tile from kites.</li>
<li><a href="hat-monotile.scad">hat-monotile.scad</a> / <a href="turtle-monotile.scad">turtle-monotile.scad</a> - Code to produce the tile in <a href="https://openscad.org/">OpenSCAD</a>, for 3D printing.</li>
<li><a href="hat-monotile.stl">hat-monotile.stl</a> / <a href="turtle-monotile.stl">turtle-monotile.stl</a> - An STL file produced using the OpenSCAD code, which can be sent directly to a 3D printer, or manipulated in other 3D software.</li>
<li><a href="hat-monotile.logo">hat-monotile.logo</a> / <a href="turtle-monotile.logo">turtle-monotile.logo</a> - A LOGO script to draw the outline of the title with Turtle graphics.</li>
</ul>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Django ActivityPub bot</title>
        <link href="https://somethingorotherwhatever.com/items/django-activitypub-bot"/>
        <id>https://somethingorotherwhatever.com/items/django-activitypub-bot</id>
        <updated>2023-03-17T11:37:27Z</updated>
        <summary type="html"><![CDATA[<p>A Django project for serving ActivityPub actors, designed for bot accounts</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/django-activitypub-bot/main.png" />
                
                
                    <h1>A Django ActivityPub bot server</h1>
<p>This is a <a href="https://www.djangoproject.com/">Django</a> project for serving ActivityPub actors, designed for bot accounts.</p>
<p>The aim is to provide just enough features to provide an account that other people can follow, and to manage followers and sending out new posts.</p>
<p>I'm sharing this code as-is, only because it doesn't cost me anything other than the time to write this README!</p>
<p>I hope it's useful, and you're very welcome to use it as a starting-point to build your own project.</p>
<p>If you're looking for a more extensible Python ActivityPub implementation, <a href="https://github.com/HelgeKrueger/bovine">bovine</a> is worth looking at first.</p>
<h2>Installation</h2>
<p>Assumptions:</p>
<ul>
<li>You have an existing web server serving a site under a domain name that you'd like to use for an ActivityPub actor, with root (superuser) access.</li>
<li>These instructions are for a server running Ubuntu Linux, with the nginx web server.</li>
</ul>
<p>You need Python 3.9 or later to run this.</p>
<p>Clone this repository (I cloned it into <code>/srv/activitypub</code>, so that's what these instructions will use), and install the requirements, with </p>
<p><code>pip install -r requirements.txt</code></p>
<p>It's a good idea to set up a <a href="https://docs.python.org/3/library/venv.html">virtual environment</a> to do this in.
I set up a virtual environment in <code>/srv/activitypub/venv</code>.</p>
<p>Make sure you activate the virtual environment after creating it!</p>
<p>Copy <code>activitypub_bot/settings.py.dist</code> to <code>activitypub_bot/settings.py</code>, and fill in the settings, following the instructions in that file.</p>
<p>Copy the files in <code>systemd_services</code> to <code>/etc/systemd/system</code>, and enable them:</p>
<p>Copy <code>gunicorn.conf.py.dist</code> to <code>gunicorn.conf.py</code> and change it if you used different paths for the repository or the virtual environment.</p>
<p>Run <code>python manage.py migrate</code> to set up the database.</p>
<p>Enable the services:</p>
<p><code>systemctl enable activitypub_huey.service activitypub.service activitypub.socket</code></p>
<p>For each domain you want to run ActivityPub on, the server needs to handle requests to the URL <code>/.well-known/webfinger</code> and anything under <code>/activitypub</code>.
(You can replace <code>/activitypub</code> with something else if you want).</p>
<p>Add the following rules to each nginx config that handles domains you want to run ActivityPub on:</p>
<p>```
server {
    # ... your existing config</p>
<pre><code>location ~ /activitypub/static {
    rewrite ^/activitypub/static/(.*)$ /$1 break;
    root /srv/activitypub/public/static;
}
location ~ /activitypub {
    include proxy_params;
    proxy_pass http://unix:/run/activitypub.sock;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "Upgrade";
}
location = /.well-known/webfinger {
    include proxy_params;
    proxy_pass http://unix:/run/activitypub.sock;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "Upgrade";
}
</code></pre>
<p>}
```</p>
<p>Reload nginx's config:</p>
<p><code>systemctl reload nginx</code></p>
<p>It's useful to create superuser login details for the admin interface:</p>
<p><code>python manage.py createsuperuser</code></p>
<p>If everything is set up properly, <code>https://{DOMAIN}/activitypub/admin</code> will show you the Django admin login screen.</p>
<h2>Usage</h2>
<p>You can create an actor on the command-line with the <code>create_actor</code> management command:</p>
<p><code>python manage.py create_actor</code></p>
<p>You'll be asked to choose the domain it should exist on, and to give a username. You can optionally create an API access token.</p>
<p>You can write a post through the admin interface: click on <em>Local actors</em>, then on the actor you want to create the post, and then click the <em>Create a note</em> link at the bottom of the page.</p>
<p>Alternately, if you created an API access token, you can make a POST request to <code>https://{DOMAIN}/activitypub/accounts/{USERNAME}/create_note</code>.
The request should have the header <code>Authorization: Bearer {ACCESS_TOKEN}</code>, and a POST parameter <code>content</code> with the text of the post.</p>
<h2>Inbox handlers</h2>
<p>When an ActivityPub message is received, it's handled by a series of subclasses of <code>bot.inbox.AbstractInboxHandler</code>.</p>
<p>For an activity with <code>Type: "ActivityType"</code>, the corresponding method <code>handle_ActivityType(activity)</code> on each inbox handler will be called.</p>
<p>Django apps can register a new inbox handler class with <code>bot.inbox.register_inbox_handler(cls, spec)</code>. 
<code>should_handle</code> is either a callable of the form <code>spec(actor, activity)</code> which should return a boolean dictating whether the class should handle this activity received by this actor, or it should be a dictionary with keys <code>username</code> and <code>domain</code> specifying the usernames, domains, or both, whose inboxes this class should handle.
If <code>should_handle</code> is not given, then the handler is called for every activity.</p>
<p>There is a built-in inbox handler, <code>bot.inbox.InboxHandler</code>, which manages <code>Follow</code> and <code>Like</code> activities.</p>
<p>You could define an inbox handler which sends you an email whenever a <code>Mention</code> activity is received.</p>
<h2>Help with ActivityPub</h2>
<p>The specs are good!</p>
<p>The <a href="https://www.w3.org/TR/activitypub/">ActivityPub protocol specification</a> gives a description of how interactions work.</p>
<p>The <a href="https://www.w3.org/TR/activitystreams-vocabulary/">Activity Streams Vocabulary</a> </p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Numbas spreadsheets extension</title>
        <link href="https://somethingorotherwhatever.com/items/numbas-spreadsheets-extension"/>
        <id>https://somethingorotherwhatever.com/items/numbas-spreadsheets-extension</id>
        <updated>2023-01-24T08:05:22Z</updated>
        <summary type="html"><![CDATA[<p>An extension for Numbas providing editable table or spreadsheet widgets</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <video autoplay src="https://somethingorotherwhatever.com/items/numbas-spreadsheets-extension/main.mp4"></video>
                
                
                    <h1>Numbas spreadsheets extension</h1>
<h2>About</h2>
<p>This extension adds a data type, <code>spreadsheet</code>, representing a 2D grid of text cells with styling information, similar to a spreadsheet in a program such as Microsoft Excel.</p>
<p>In the Numbas question editor, this extension adds a "Spreadsheet" variable template type which allows you to load a spreadsheet from an uploaded <code>.xlsx</code> file.</p>
<p>Internally, <a href="https://sheetjs.com/">SheetJS</a> is used to interpret spreadsheet files. Any format understood by SheetJS can be used, but style information is only loaded from <code>.xlsx</code> files.</p>
<p>When inserted into content areas, <code>spreadsheet</code> values are rendered as non-editable grids.</p>
<p>This extension adds a "Spreadsheet" answer input method for custom part types. The "expected answer" and "initial sheet" settings should be <code>spreadsheet</code> values with the same dimensions.</p>
<p>The file <code>spreadsheet.npt</code> defines a "Spreadsheet" custom part type which asks the student to enter values into a given spreadsheet and compares entries against a completed spreadsheet given by the question author.</p>
<h2>What it doesn't do</h2>
<ul>
<li>Number formats such as currency, percentage, time</li>
</ul>
<h2>JME functions</h2>
<h3><code>spreadsheet(cells)</code></h3>
<p>Construct a spreadsheet object from a 2D array of cell contents.</p>
<p><strong>Example:</strong> <code>spreadsheet([["Name","Points"], ["Alice", 1], ["Harrison", 5]])</code></p>
<h3><code>spreadsheet_from_base64_file(filename, data)</code></h3>
<p>Construct a spreadsheet from a <code>.xlsx</code> file whose contents have been encoded in base64. 
This function is used by the "spreadsheet" variable template type; it's unlikely you'll ever use it in any other context.</p>
<h3><code>update_range(spreadsheet, range, changes)</code></h3>
<p>Update the cells in the given range, following the settings in the dictionary <code>changes</code>.
The <code>changes</code> dictionary can be constructed using the styling functions below.</p>
<p><strong>Example:</strong> <code>update_range(sheet, "B2:D2", border("bottom","thick"))</code></p>
<h3><code>disable_cells(spreadsheet, ranges)</code></h3>
<p>Disable cells in the given ranges, so they can't be edited by the student.</p>
<p><strong>Example:</strong> <code>disable_cells(sheet, ["A1", "C2", "B3:D5"])</code></p>
<h3><code>fill_range(spreadsheet, range, contents)</code></h3>
<p>Fill in the text contents of the cells in the given range with the values from the 2D array <code>contents</code>.</p>
<p>If the range is a single cell or all the cells are in a single row or column, <code>contents</code> can be a sim[ple list.</p>
<p><strong>Examples:</strong> </p>
<ul>
<li><code>fill_range(sheet, "A1:D2", [["a","b","c","d"],[1,2,3,4]])</code></li>
<li><code>fill_range(sheet, "A1:C1", ["a", "b", "c"])</code></li>
</ul>
<h3><code>parse_range(range)</code></h3>
<p>Interpret a string representing a range, and return a list of the addresses of the cells it contains.</p>
<p><strong>Example:</strong> <code>parse_range("A1:B3")</code> → <code>[ "A1", "B1", "A2", "B2", "A3", "B3" ]</code></p>
<h3><code>slice(spreadsheet,range)</code></h3>
<p>Make a copy of the given spreadsheet, containing only the cells in the given range.</p>
<p><strong>Example:</strong> <code>slice(sheet, "B2:D5")</code></p>
<h3><code>spreadsheet[range]</code></h3>
<p>Return the contents of the cells in the given range, or the contents of the cell at the given address.
The contents are always returned as strings.
The empty string is used for empty cells.</p>
<p><strong>Examples:</strong></p>
<ul>
<li><code>sheet["A1:B3"]</code> → <code>[["a","b"],["1","2"],["","3"]]</code></li>
<li><code>sheet["A1"]</code> → <code>"a"</code></li>
</ul>
<h3><code>encode_range(start_column, start_row, end_column, end_row)</code></h3>
<p>Given the numerical indices of the top-left and bottom-right corners of a range, return a string representing that range.
The rows and columns are both numbered starting from 0.</p>
<p><strong>Example:</strong> <code>encode_range(0,0,3,2)</code> → <code>"A1:D3"</code></p>
<h3>Cell styling functions</h3>
<p>The following functions can be used with the <code>update_range</code> function to change the appearance of cells in a spreadsheet.</p>
<p>These functions can be chained together using the <code>|&gt;</code> pipe operator.
For example: <code>font_style("bold") |&gt; fill("lightgreen")</code></p>
<p>Functions that specify a colour can take any valid <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/color_value">CSS color value</a>.</p>
<p>You can easily cause accessibility problems when using colour. Try not to use colour as the sole means of conveying information, or to use colour combinations that can't be easily distinguished by colourblind people.</p>
<h4><code>border(sides, styles)</code></h4>
<p>Set cell border styles.</p>
<p><code>sides</code> is a space-separated string giving the sides to style. The sides are named <code>"top"</code>, <code>"left"</code>, <code>"bottom"</code> and<code>"right"</code>.</p>
<p><code>styles</code> is a space-separated string giving the style information, in the format <code>thickness color</code>. <code>thickness</code> is one of <code>thin</code>, <code>medium</code> or <code>thick</code>.</p>
<p><strong>Example:</strong> <code>border("top bottom", "thin blue")</code></p>
<h4><code>font_style(styles)</code></h4>
<p>Style the text content of cells.</p>
<p><code>styles</code> is a space-separated list of style names. The understood styles are <code>bold</code>, <code>italic</code> and <code>underline</code>.</p>
<p><strong>Example:</strong> <code>font_style("bold underline")</code></p>
<h4><code>font_size(size)</code></h4>
<p>Set the size of text in cells, as a multiple of the default size.</p>
<p>A size smaller than <code>1</code> can cause accessibility problems by making text hard to read; try to only make text the default size or bigger.</p>
<p><strong>Example:</strong> <code>font_size(1.2)</code></p>
<h4><code>font_color(color)</code></h4>
<p>Set the color of text in cells.</p>
<p><strong>Example:</strong> <code>font_color("blue")</code></p>
<h4><code>bg_color(color)</code></h4>
<p>Set the background colour of cells.</p>
<p><strong>Example:</strong> <code>bg_color("black")</code></p>
<h4><code>horizontal_alignment(alignment)</code></h4>
<p>Set the horizontal alignment of text inside cells.</p>
<p>Any value accepted by <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/text-align">the CSS <code>text-align</code> property</a> is understood.</p>
<p><strong>Example:</strong> <code>horizontal_alignment("center")</code></p>
<h4><code>vertical_alignment(alignment)</code></h4>
<p>Set the vertical alignment of text inside cells.</p>
<p>Any value accepted by <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/vertical-align">the CSS <code>vertical-align</code> property</a> is understood.</p>
<p><strong>Example:</strong> <code>vertical_alignment("middle")</code></p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Twitter archive generator</title>
        <link href="https://somethingorotherwhatever.com/items/twitter-archive-generator"/>
        <id>https://somethingorotherwhatever.com/items/twitter-archive-generator</id>
        <updated>2023-01-06T10:59:33Z</updated>
        <summary type="html"><![CDATA[<p>A Python script to convert the Twitter archive to something that can be published</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/twitter-archive-generator/main.png" />
                
                
                    <h1>CLP's Twitter archive generator</h1>
<p>This Python script takes the archive you obtain from Twitter and produces a nice static site containing all the tweets, in a form suitable for publishing online.</p>
<p>Install the required packages with <code>pip install -r requirements.txt</code>.</p>
<p>Extract the <code>.zip</code> file you get from Twitter into the same directory as this script.</p>
<p>Run <code>python twitter_archive.py</code>.</p>
<p>The output is in a directory called <code>output</code>. Copy the <code>data/tweets_media</code> folder from your Twitter archive to <code>output/media</code>.</p>
<p>I just made this for my own Twitter archive, and I'm not hugely interested in maintaining a generic tool for everybody. If it's useful to you as it is, then that's lovely!</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Birthday magic square</title>
        <link href="https://somethingorotherwhatever.com/items/birthday-magic-square"/>
        <id>https://somethingorotherwhatever.com/items/birthday-magic-square</id>
        <updated>2023-01-02T09:55:23Z</updated>
        <summary type="html"><![CDATA[<p>An interactive page to make a magic square for your birthday. Made on request for James Grime</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/birthday-magic-square/main.png" />
                
                
                    <p>An interactive page to make a magic square for your birthday. Made on request for James Grime</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Five talks about trains</title>
        <link href="https://somethingorotherwhatever.com/items/five-talks-about-trains"/>
        <id>https://somethingorotherwhatever.com/items/five-talks-about-trains</id>
        <updated>2022-11-14T19:20:08Z</updated>
        <summary type="html"><![CDATA[<p>My talk at Big MathsJam 2022: five talks about trains</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/five-talks-about-trains/main.png" />
                
                
                    <p>My talk at Big MathsJam 2022: five talks about trains</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Random trees in circles</title>
        <link href="https://somethingorotherwhatever.com/items/random-trees-in-circles"/>
        <id>https://somethingorotherwhatever.com/items/random-trees-in-circles</id>
        <updated>2022-11-09T08:35:49.175000Z</updated>
        <summary type="html"><![CDATA[<p>Generates a random tree by joining up points arranged around a circle</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/random-trees-in-circles/main.png" />
                
                
                    <p>Generates a random tree by joining up points arranged around a circle</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Can I also use?</title>
        <link href="https://somethingorotherwhatever.com/items/can-i-also-use"/>
        <id>https://somethingorotherwhatever.com/items/can-i-also-use</id>
        <updated>2022-11-01T06:22:31Z</updated>
        <summary type="html"><![CDATA[<p>A tool to work out which browsers support a combination of features</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/can-i-also-use/main.png" />
                
                
                    <p>A tool to work out which browsers support a combination of features</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Listen to a sequence</title>
        <link href="https://somethingorotherwhatever.com/items/listen-to-a-sequence"/>
        <id>https://somethingorotherwhatever.com/items/listen-to-a-sequence</id>
        <updated>2022-10-27T07:49:44.698000Z</updated>
        <summary type="html"><![CDATA[<p>Plays an OEIS sequence as a tune</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                
                    <p>Plays an OEIS sequence as a tune</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Numbas lockdown app for iOS</title>
        <link href="https://somethingorotherwhatever.com/items/numbas-lockdown-app-for-ios"/>
        <id>https://somethingorotherwhatever.com/items/numbas-lockdown-app-for-ios</id>
        <updated>2022-10-12T13:25:43Z</updated>
        <summary type="html"><![CDATA[<p>A version of the Numbas lockdown app made for iOS</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                
                    <h1>Numbas lockdown iOS</h1>
<p>This is an iOS app for loading Numbas exams which require a locked-down environment.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Written number extension for Numbas</title>
        <link href="https://somethingorotherwhatever.com/items/written-number-extension-for-numbas"/>
        <id>https://somethingorotherwhatever.com/items/written-number-extension-for-numbas</id>
        <updated>2022-09-21T07:34:28Z</updated>
        <summary type="html"><![CDATA[<p>A Numbas extension providing a function to write out a number in words</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                
                    <h1>Written number</h1>
<p>Provides a function <code>written_number</code> which converts numbers to words.</p>
<p>Based on <a href="https://yamadapc.github.io/js-written-number/">js-written-number</a> by Pedro Tacla Yamada and others, used under the terms of the MIT license.</p>
<p>The following languages are supported:</p>
<p>| Language | code |
|---------|--------|
| English | <code>en</code> |
| US English | <code>en-us</code> |
| English (Indian) | <code>en-in</code> |
| Portuguese (Brazil) | <code>pt</code> |
| Portuguese (Portugal) | <code>pt-br</code> |
| Spanish | <code>es</code> |
| French | <code>fr</code> |
| Esperanto | <code>eo</code> |
| Vietnamese | <code>vi</code> |
| Arabic | <code>ar</code> |
| Azerbaijan | <code>az</code> |
| Turkish | <code>tr</code> |
| Ukrainian | <code>uk</code> |
| Indonesian | <code>id</code> |
| Russian | <code>ru</code> |</p>
<h2>Usage</h2>
<h3><code>written_number(n)</code></h3>
<p>Converts the given number to words, in the exam's preferred language (or English by default).</p>
<h3><code>written_number(n,language_code)</code></h3>
<p>Converts the given number to words in the given language.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>watchmake</title>
        <link href="https://somethingorotherwhatever.com/items/watchmake"/>
        <id>https://somethingorotherwhatever.com/items/watchmake</id>
        <updated>2022-09-18T15:15:57Z</updated>
        <summary type="html"><![CDATA[<p>A tool which runs make when a file in the current directory is changed.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                
                    <h1>WatchMake</h1>
<p>This is a tool which runs <code>make</code> when a file in the current directory is changed.</p>
<p>You can configure it with a file called <code>.watchmakerc</code> in the directory you're running it from.</p>
<p>The file should contain some YAML in the following format:</p>
<p><code>default_make:  # A list ofmake targets to run
extensions:    # A list of file extensions that should trigger make. If not given, all files trigger make.
path:          # A list of subdirectories to watch. If not given, all subdirectories under this one are watched.</code></p>
<p>I wrote this to learn Elixir, and to replace my existing Python script which is quite fiddly.</p>
<h2>How to run it</h2>
<p>Build a release by running <code>mix release</code>.</p>
<p>Then the folder <code>_build/dev/rel/watchmake</code> contains everything needed to run the program.</p>
<p>Run <code>_build/dev/rel/watchmake/bin/watchmake start</code> to start it.</p>
<p>Press <kbd>Ctrl+C</kbd> twice to end it.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Mathematical Guess Who?</title>
        <link href="https://somethingorotherwhatever.com/items/mathematical-guess-who"/>
        <id>https://somethingorotherwhatever.com/items/mathematical-guess-who</id>
        <updated>2022-09-13T07:57:48Z</updated>
        <summary type="html"><![CDATA[<p>A multiplayer mathematical Guess Who? game. Made for the 24 hour maths game show.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/mathematical-guess-who/main.png" />
                
                
                    <p>A multiplayer mathematical Guess Who? game. Made for the 24 hour maths game show.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Numbas lockdown app</title>
        <link href="https://somethingorotherwhatever.com/items/numbas-lockdown-app"/>
        <id>https://somethingorotherwhatever.com/items/numbas-lockdown-app</id>
        <updated>2022-09-01T12:01:33Z</updated>
        <summary type="html"><![CDATA[<p>A locked-down browser for running Numbas exams in a controlled environment</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                
                    <h1>Numbas lockdown browser</h1>
<p>An Electron app which can be used to launch resources in the Numbas LTI provider, without access to developer tools or most other browser controls.</p>
<h2>To build</h2>
<p>You need <a href="https://nodejs.org/en/">NodeJS</a> and <a href="https://classic.yarnpkg.com/en/docs/install#debian-stable">yarn</a>.</p>
<p>Once you've got NodeJS installed, install yarn.</p>
<p>Copy <code>config.js.dist</code> to <code>config.js</code> and fill it in.</p>
<p>To run the browser in development mode:</p>
<p><code>yarn start open &lt;URL&gt;</code></p>
<p>To build the executables:</p>
<p><code>yarn build_windows
yarn build_linux
yarn build_max</code></p>
<p>It's technically possible to build the Windows executable on Linux, using Wine, but it seems to produce a much bigger package than building on Windows.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>The unintentionally useful consequences of playing games with maths</title>
        <link href="https://somethingorotherwhatever.com/items/the-unintentionally-useful-consequences-of-playing-games-with-maths"/>
        <id>https://somethingorotherwhatever.com/items/the-unintentionally-useful-consequences-of-playing-games-with-maths</id>
        <updated>2022-08-23T09:31:24Z</updated>
        <summary type="html"><![CDATA[<p>A talk about Hamiltonian graphs, leading to the Herschel graph.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/the-unintentionally-useful-consequences-of-playing-games-with-maths/main.png" />
                
                
                    <p>A talk about Hamiltonian graphs, leading to the Herschel graph.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>CSS binary clock</title>
        <link href="https://somethingorotherwhatever.com/items/css-binary-clock"/>
        <id>https://somethingorotherwhatever.com/items/css-binary-clock</id>
        <updated>2022-07-14T06:55:07.306000Z</updated>
        <summary type="html"><![CDATA[<p>A binary clock entirely made in CSS</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <video autoplay src="https://somethingorotherwhatever.com/items/css-binary-clock/main.mp4"></video>
                
                
                    <p>A binary clock entirely made in CSS</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Maths blockbuster</title>
        <link href="https://somethingorotherwhatever.com/items/maths-blockbuster"/>
        <id>https://somethingorotherwhatever.com/items/maths-blockbuster</id>
        <updated>2022-07-09T14:12:28.186000Z</updated>
        <summary type="html"><![CDATA[<p>The game board for Maths Blockbuster, part of the 24 Hour Maths Game Show</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/maths-blockbuster/main.png" />
                
                
                    <p>The game board for Maths Blockbuster, part of the 24 Hour Maths Game Show</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Formula calculator template</title>
        <link href="https://somethingorotherwhatever.com/items/formula-calculator-template"/>
        <id>https://somethingorotherwhatever.com/items/formula-calculator-template</id>
        <updated>2022-07-06T05:12:57.554000Z</updated>
        <summary type="html"><![CDATA[<p>A template to quickly whip up a page to calculate a formula</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/formula-calculator-template/main.png" />
                
                
                    <p>A template to quickly whip up a page to calculate a formula</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Shunting-yard algorithm animation</title>
        <link href="https://somethingorotherwhatever.com/items/shunting-yard-algorithm-animation"/>
        <id>https://somethingorotherwhatever.com/items/shunting-yard-algorithm-animation</id>
        <updated>2022-06-05T09:06:55Z</updated>
        <summary type="html"><![CDATA[<p>An animation of the shunting yard algorithm, with a little train</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <video autoplay src="https://somethingorotherwhatever.com/items/shunting-yard-algorithm-animation/main.mp4"></video>
                
                
                    <p>An animation of the shunting yard algorithm, with a little train</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Didn&#39;t Graduate Texts in Mathematics meme generator</title>
        <link href="https://somethingorotherwhatever.com/items/didn-t-graduate-texts-in-mathematics-meme-generator"/>
        <id>https://somethingorotherwhatever.com/items/didn-t-graduate-texts-in-mathematics-meme-generator</id>
        <updated>2022-05-30T09:14:49Z</updated>
        <summary type="html"><![CDATA[<p>A generator for memes, based on the Graduate Texts in Mathematics series</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/didn-t-graduate-texts-in-mathematics-meme-generator/main.png" />
                
                
                    <p>A generator for memes, based on the Graduate Texts in Mathematics series</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>OEISle</title>
        <link href="https://somethingorotherwhatever.com/items/oeisle"/>
        <id>https://somethingorotherwhatever.com/items/oeisle</id>
        <updated>2022-05-22T18:33:51Z</updated>
        <summary type="html"><![CDATA[<p>A Wordle clone where you have to guess a sequence from the Online Encyclopedia of Integer Sequences</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/oeisle/main.png" />
                
                
                    <p>A Wordle clone where you have to guess a sequence from the Online Encyclopedia of Integer Sequences</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Tractor Befunge</title>
        <link href="https://somethingorotherwhatever.com/items/tractor-befunge"/>
        <id>https://somethingorotherwhatever.com/items/tractor-befunge</id>
        <updated>2022-05-09T07:10:44Z</updated>
        <summary type="html"><![CDATA[<p>A happy image occurred to me of the Befunge instruction pointer as a tractor, driving around a field.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <video autoplay src="https://somethingorotherwhatever.com/items/tractor-befunge/main.mp4"></video>
                
                
                    <p>A happy image occurred to me of the Befunge instruction pointer as a tractor, driving around a field.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Prime Run</title>
        <link href="https://somethingorotherwhatever.com/items/prime-run"/>
        <id>https://somethingorotherwhatever.com/items/prime-run</id>
        <updated>2022-03-19T12:42:47Z</updated>
        <summary type="html"><![CDATA[<p>A game about adding and subtracting prime numbers. You start at a random number, with a random target. Try to reach the target, by adding or removing any prime factor of your current number.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <video autoplay src="https://somethingorotherwhatever.com/items/prime-run/main.mp4"></video>
                
                
                    <p>A game about adding and subtracting prime numbers. You start at a random number, with a random target. Try to reach the target, by adding or removing any prime factor of your current number.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>A Tale of log(2) Cities</title>
        <link href="https://somethingorotherwhatever.com/items/a-tale-of-log-2-cities"/>
        <id>https://somethingorotherwhatever.com/items/a-tale-of-log-2-cities</id>
        <updated>2022-03-17T07:55:43.980000Z</updated>
        <summary type="html"><![CDATA[<p>Reduce a book to log(2) of its original length by alternately adding and removing 1/N of the words.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/a-tale-of-log-2-cities/main.png" />
                
                
                    <p>Reduce a book to log(2) of its original length by alternately adding and removing 1/N of the words.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>WordPress interactive element plugin</title>
        <link href="https://somethingorotherwhatever.com/items/wordpress-interactive-element-plugin"/>
        <id>https://somethingorotherwhatever.com/items/wordpress-interactive-element-plugin</id>
        <updated>2022-03-05T13:43:37Z</updated>
        <summary type="html"><![CDATA[<p>A WordPress plugin which provides a block to embed an interactive element. I made this to make it easier to include interactive thingies in posts on The Aperiodical.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/wordpress-interactive-element-plugin/main.png" />
                
                
                    <p>A WordPress plugin which provides a block to embed an interactive element. I made this to make it easier to include interactive thingies in posts on The Aperiodical.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>CReal.js</title>
        <link href="https://somethingorotherwhatever.com/items/creal-js"/>
        <id>https://somethingorotherwhatever.com/items/creal-js</id>
        <updated>2022-02-26T13:57:07Z</updated>
        <summary type="html"><![CDATA[<p>Constructive real numbers, in JavaScript. Based on Hans-J. Boehm's Java implementation</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                
                    <h1>CReal.js</h1>
<p>Constructive real numbers for JavaScript.</p>
<p>Ported from Hans-J. Boehm's Java implementation to JavaScript by Christian Lawson-Perfect.</p>
<p>Each recursive real number is represented as an object that provides an approximation function for the real number.
The approximation function guarantees that the generated approximation is accurate to the specified precision.
Arithmetic operations on constructive reals produce new such objects; they typically do not perform any real computation.
In this sense, arithmetic computations are exact: They produce a description which describes the exact answer, and can be used to later approximate it to arbitrary precision.</p>
<p>When approximations are generated, e.g. for output, they are accurate to the requested precision; no cumulative rounding errors are visible.
In order to achieve this precision, the approximation function will often need to approximate subexpressions to greater precision than was originally demanded.
Thus the approximation of a constructive real number generated through a complex sequence of operations may eventually require evaluation to very high precision.
This usually makes such computations prohibitively expensive for large numerical problems.
But it is perfectly appropriate for use in a desk calculator, for small numerical problems, for the evaluation of expressions computated by a symbolic algebra system, for testing of accuracy claims for floating point code on small inputs, or the like.</p>
<h2>Usage</h2>
<p><code>creal.js</code> is an ECMAScript module.
It exposes an object with a <code>valueOf</code> method to create a CReal from an ES number or string, and some constants.</p>
<p>```
import CReal from 'creal.js';</p>
<p>const one_seventh = CReal.valueOf(7).inverse();
console.log(one_seventh.toString(20));
```</p>
<p>See <a href="https://christianp.github.io/creal.js/">the full documentation</a>.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Rectangle pals</title>
        <link href="https://somethingorotherwhatever.com/items/rectangle-pals"/>
        <id>https://somethingorotherwhatever.com/items/rectangle-pals</id>
        <updated>2022-02-24T11:53:05.355000Z</updated>
        <summary type="html"><![CDATA[<p>Rectangle pals are randomly added or taken away, but after each step, all the rectangles have the same area.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <video autoplay src="https://somethingorotherwhatever.com/items/rectangle-pals/main.mp4"></video>
                
                
                    <p>Rectangle pals are randomly added or taken away, but after each step, all the rectangles have the same area.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Nulac</title>
        <link href="https://somethingorotherwhatever.com/items/nulac"/>
        <id>https://somethingorotherwhatever.com/items/nulac</id>
        <updated>2022-02-18T20:01:35.837000Z</updated>
        <summary type="html"><![CDATA[<p>This is a pen-and-paper game I invented in secondary school. Twenty years later, I've made a digital version of it!</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/nulac/main.png" />
                
                
                    <p>This is a pen-and-paper game I invented in secondary school. Twenty years later, I've made a digital version of it!</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Programming extension for Numbas</title>
        <link href="https://somethingorotherwhatever.com/items/programming-extension-for-numbas"/>
        <id>https://somethingorotherwhatever.com/items/programming-extension-for-numbas</id>
        <updated>2022-02-03T14:45:29Z</updated>
        <summary type="html"><![CDATA[<p>An extension for Numbas which provides a code editor and the ability to evaluate code written in Python and R.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/programming-extension-for-numbas/main.png" />
                
                
                    <h1>Programming extension for Numbas</h1>
<p>This extension adds a code editor input method, and the ability to run code.</p>
<p>There is built-in support for running:</p>
<ul>
<li>Python code in <a href="https://pyodide.org/">Pyodide</a>.</li>
<li>R code in <a href="https://github.com/georgestagg/webR/">webR</a></li>
</ul>
<p>There is a custom part type in <code>code.npt</code>, which marks code entered by the student by evaluating unit tests.</p>
<h2>Running code</h2>
<p>The extension provides a JME function <code>run_code</code>.
Because the code might take a long time to run, it runs asynchronously; the function returns a <code>promise</code> value.</p>
<p>In order to use the results in marking, call <code>run_code</code> from the part's <code>pre_submit</code> note.
The rest of the marking algorithm will run once the code has finished running.</p>
<p>Here's an example:</p>
<p><code>pre_submit: 
    [
        run_code(
            "pyodide", 
            [
                studentAnswer,
                "'x' in locals()",
                "x==1"
            ]
        )
    ]</code></p>
<h2>The code editor input method</h2>
<p>The extension provides the <a href="https://ace.c9.io/">Ace editor</a> as an input method for custom part types.
It has three options:</p>
<ul>
<li><strong>Code language</strong> - The language to use for syntax highlighting.</li>
<li><strong>Placeholder</strong> - The initial content of the editor.</li>
<li><strong>Editor theme</strong> - The Ace theme to use. Only <code>textmate</code> is bundled with the extension.</li>
</ul>
<h2>JME functions</h2>
<h3><code>run_code(language,codes)</code></h3>
<ul>
<li><code>language</code> is a string containing the name of the code runner to use.</li>
<li><code>codes</code> is a list of strings of code.</li>
</ul>
<p>Run some blocks of code and return the results in a <code>promise</code>.</p>
<p>The blocks are run one after the other, in the same global scope, so variables assigned in one block are available in subsequent blocks.</p>
<p>When run in the <code>pre_submit</code> note, this task adds an entry <code>code_result</code>, a list containing the results of each of the code blocks.
The result of a code block is represented in a dictionary of the following form:</p>
<ul>
<li><code>result</code> - The final value produced by the block.</li>
<li><code>success</code> - <code>true</code> if the code ran without errors, otherwise <code>false</code>.</li>
<li><code>stdout</code> - The contents of the program's <code>STDOUT</code> buffer. This typically contains any text printed by the program.</li>
<li><code>stderr</code> - The contents of the program's <code>STDERR</code> buffer. This typically contains any error messages produced by the program.</li>
<li><code>error</code> - If the code threw an error, the text of the error.</li>
</ul>
<h3><code>variables_as_code(language, variables)</code></h3>
<p>Produce a block of code which assigns a series of variables in the given language.
The <code>variables</code> argument is a dictionary mapping variable names to values.</p>
<h3><code>code_block(code,options)</code></h3>
<p>Display some code in a syntax-highlighted code area.</p>
<p>The <code>options</code> argument is an optional dictionary of options, or just the name of the language to use for syntax highlighting.
The following options can be set:</p>
<ul>
<li><code>language</code> - The language to use for syntax highlighting.</li>
<li><code>theme</code> - The Ace theme to use. Only the <code>textmate</code> theme is built in to this extension.</li>
<li><code>gutter</code> - Show or hide the gutter, which shows line numbers.</li>
</ul>
<h3><code>language_synonym(runner)</code></h3>
<p>Return the name of the language corresponding to the given runner.</p>
<p><code>"pyodide"</code> returns <code>"python"</code>; <code>"webr"</code> returns <code>"r"</code>.</p>
<h3>Marking functions</h3>
<p>There are a few functions to produce common marking tests:</p>
<ul>
<li><code>py_mark_equal(name,value,[weight=1])</code> - Checks that the variable with the given name has the given value. The name should be a string, but the value can be any JME value. Example: <code>py_mark_equal('x', 1)</code></li>
</ul>
<h3>Validation functions</h3>
<p>There are a few functions to produce common validation tests:</p>
<ul>
<li><code>py_valid_defined(name)</code> - Checks that a variable with the given name has been defined - equivalent to <code>'name' in locals()</code>.</li>
<li><code>py_valid_callable(name)</code> - Checks that the object with the given name has been defined and is callable - equivalent to <code>'name' in locals() and callable(name)</code>. </li>
<li><code>py_valid_isinstance(name,type)</code> - Checks that the object with the given name has been defined and is an instance of the given type - equivalent to <code>'name' in locals() and isinstance(name, type)</code>.</li>
</ul>
<h2>Adding another language</h2>
<p>The class <code>Numbas.extensions.programming.CodeRunner</code> contains methods for running code in a particular language.
To add a new language, define a new class extending this one, implementing the <code>run_code</code> method.</p>
<p>Then call <code>Numbas.extensions.programming.register_language_runner(name, runner)</code> with the name of the runner and the class.
Only one instance of the class will ever be created.</p>
<p>See the <code>PyodideRunner</code> and <code>WebRRunner</code> classes in this extension for examples of how to implement a runner.</p>
<h2>Functions specific to R</h2>
<h3><code>r_load_files(files)</code></h3>
<p>Read the contents of the given files and return the result in a <code>promise</code>, to be used by a pre-submit task.</p>
<p>When run in the <code>pre_submit</code> note, this task adds an entry <code>r_files</code>, a list containing information about each of the files:</p>
<ul>
<li><code>exists</code> - <code>true</code> if the file was loaded successfully, <code>false</code> if not.</li>
<li><code>text</code> - if the file contains text, the contents of the file as a string.</li>
<li><code>blob</code> - if the file is binary, a blob URL representing the file's contents. You can use a blob URL as the <code>src</code> attribute for an <code>img</code> or <code>iframe</code> tag.</li>
</ul>
<p>At the moment, only PDF files are recognised as binary. You can register other file types as binary by adding an entry to the JavaScript object <code>Numbas.extensions.programming.mime_types</code>.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Find Dracula</title>
        <link href="https://somethingorotherwhatever.com/items/find-dracula"/>
        <id>https://somethingorotherwhatever.com/items/find-dracula</id>
        <updated>2022-02-02T10:06:15Z</updated>
        <summary type="html"><![CDATA[<p>Find all the Draculas in a castle.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <video autoplay src="https://somethingorotherwhatever.com/items/find-dracula/main.mp4"></video>
                
                
                    <p>A small game made in a morning, in Elm.</p>
<ul>
<li>Try to find all the Draculas in the castle.</li>
<li>You can open one door for each Dracula in the castle.</li>
<li>If there was a Dracula in that room, you kill it.</li>
<li>If there was no Dracula in that room, you wake up another Dracula!</li>
<li>After each turn, all the Draculas move to an adjacent room.</li>
<li>When two Draculas meet, the scarier Dracula puts the other to sleep.</li>
</ul>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>JIGGRAPH</title>
        <link href="https://somethingorotherwhatever.com/items/jiggraph"/>
        <id>https://somethingorotherwhatever.com/items/jiggraph</id>
        <updated>2022-01-22T15:54:26Z</updated>
        <summary type="html"><![CDATA[<p>A puzzle game about shaking hands</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <video autoplay src="https://somethingorotherwhatever.com/items/jiggraph/main.mp4"></video>
                
                
                    <p>A puzzle game about shaking hands</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Canvas LMS folder sync</title>
        <link href="https://somethingorotherwhatever.com/items/canvas-lms-folder-sync"/>
        <id>https://somethingorotherwhatever.com/items/canvas-lms-folder-sync</id>
        <updated>2022-01-13T12:49:10Z</updated>
        <summary type="html"><![CDATA[<p>A command-line tool to synchronise a local folder with one in a Canvas LMS course</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                
                    <h1>Canvas LMS folder sync</h1>
<p>This is a command-line tool and Python package to synchronise a local folder with one in a Canvas LMS course.</p>
<p>In order to use this, you need a Canvas API token linked to an account which has permission to create files in your target course's Files section.
See <a href="https://canvas.instructure.com/doc/api/file.oauth.html#manual-token-generation">the Canvas API documentation</a> for instructions on how to get a token.</p>
<h2>Installation</h2>
<p>Python 3.8 or newer is required.</p>
<p>To install the package, run:</p>
<p><code>pip install canvaslms_sync</code></p>
<p>This provides a shell command <code>canvas_sync</code>.</p>
<h2>Usage</h2>
<p><code>canvas_sync local_folder remote_url -t CANVAS_API_TOKEN</code></p>
<p>You can store your Canvas API token in a file like this:</p>
<p><code>[Canvas]
canvas_api_token = TOKEN</code></p>
<p>By default, the script looks for this file in <code>credentials.ini</code> in the current working directory, but you can specify a different path with the <code>-c</code> option.</p>
<p>Hidden files and folders (those whose names start with <code>.</code>) are ignored by default. You can include them with the <code>--include-hidden</code> option.</p>
<h2>Development</h2>
<p>I followed the <a href="https://packaging.python.org/en/latest/tutorials/packaging-projects/">Python packaging tutorial</a> to make this package.</p>
<p>To build this package, you need <code>twine</code> and <code>build</code>:</p>
<p><code>python3 -m pip install twine build</code></p>
<p>First, build the distributable files:</p>
<p><code>python3 -m build</code></p>
<p>That produces <code>.tar.gz</code> and <code>.whl</code> files in <code>./dist</code>. 
You can try installing the package in a different virtualenv with <code>pip install dist/canvaslms_sync-$VERSION-py3-none-any.whl</code>.</p>
<p>To upload to PyPI:</p>
<p><code>python3 -m twine upload --repository pypi dist/*</code></p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>This island is big enough for the both of us</title>
        <link href="https://somethingorotherwhatever.com/items/this-island-is-big-enough-for-the-both-of-us"/>
        <id>https://somethingorotherwhatever.com/items/this-island-is-big-enough-for-the-both-of-us</id>
        <updated>2022-01-10T10:46:00Z</updated>
        <summary type="html"><![CDATA[<p>A game about dividing up an island</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/this-island-is-big-enough-for-the-both-of-us/main.gif" />
                
                
                    <p>An implementation of the game <em>Imparium</em>, invented by Walter Joris.</p>
<p>Here’s a brief version of the rules: you start with a 6×6 grid of boxes. You and another player take turns removing pairs of adjacent boxes. Whenever there’s a group made up of an odd number less than 10 contiguous boxes, the last player to move can claim them. Once all boxes have been either claimed or removed, the game is over and the person who has claimed the most boxes wins.</p>
<p>Written in Elm.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Floating-point calculator</title>
        <link href="https://somethingorotherwhatever.com/items/floating-point-calculator"/>
        <id>https://somethingorotherwhatever.com/items/floating-point-calculator</id>
        <updated>2021-12-08T16:21:56Z</updated>
        <summary type="html"><![CDATA[<p>An experiment in making a calculator out of pieces that float around.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <video autoplay src="https://somethingorotherwhatever.com/items/floating-point-calculator/main.mp4"></video>
                
                
                    <p>An experiment in making a calculator out of pieces that float around.</p>
<p>I wanted something where you could easily repeat calculations with different numbers, while being easy to use on a touch-screen device.</p>
<p>It's a little bit too fiddly - it takes quite a while to enter a complicated calculation, and I think it would be easier to read if the connecting lines could be bent.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Chirun LTI in docker</title>
        <link href="https://somethingorotherwhatever.com/items/chirun-lti-in-docker"/>
        <id>https://somethingorotherwhatever.com/items/chirun-lti-in-docker</id>
        <updated>2021-11-22T10:46:10Z</updated>
        <summary type="html"><![CDATA[<p>A Docker container for running the Chirun LTI server.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                
                    <h1>Docker Compose Recipe for Chirun LTI Tool</h1>
<p>This repository contains everything needed to run the Chirun LTI tool in Docker containers.</p>
<h2>Documentation</h2>
<p>There's documentation for administrators, instructors and students at TBD.</p>
<h2>Installation</h2>
<h3>Prerequisites</h3>
<p>Install <a href="https://docs.docker.com/engine/install/">Docker</a> and <a href="https://docs.docker.com/compose/install/">Docker Compose</a> on your server.</p>
<h3>Setup</h3>
<p>Clone this repo somewhere on your server and <code>cd</code> into the directory.</p>
<p>Copy the file <code>settings.env.dist</code> to <code>settings.env</code> and write your own values each of the variables inside.</p>
<p>Obtain an SSL certificate and key for the domain you will access the CB LTI tool from.
Copy the key to <code>files/ssl/cblti.key</code> and the certificate to <code>files/ssl/cblti.pem</code>.</p>
<h3>Starting</h3>
<p>Run the following command in the directory where <code>docker-compose.yml</code> resides:</p>
<p><code>docker-compose up</code></p>
<h3>Stopping</h3>
<p>Stop the containers with
<code>docker-compose down</code></p>
<h2>LTI Setup</h2>
<p>To use the Chirun LTI tool with your VLE, an administrator will need to add the tool to your own instance of the VLE. To do this, the VLE needs to be setup beforehand as a tool consumer in the admin panel accessible on your web server at https://chirun-lti.institution.tld/lti/admin/. Login with the administrator account setup in the file <code>settings.env</code>.</p>
<p>Create a Name, Key, and Secret for your VLE using the Add New Consumer form on the admin page, and then forward that information on to your VLE administrator to be added as an external LTI tool.</p>
<p>They might also need the URL for the LTI XML configuration, https://chirun-lti.institution.tld/lti/xml/ or the LTI launch URL, https://chirun-lti.institution.tld/lti/connect.php.</p>
<h3>Landing Page</h3>
<p>A simple landing page for the root of the webserver at https://chirun-lti.institution.tld has been included in <code>files/cblti/index.html</code>. This file is bind mounted by Docker at launch and so can be directly edited by the server administrator as required.</p>
<h2>Running in the cloud</h2>
<p>Docker Compose files can also be used to deploy to the cloud. See the following documents for more information about deploying Docker to the cloud:
 - <a href="https://docs.docker.com/engine/context/ecs-integration/">Compose for Amazon ECS</a>
 - <a href="https://docs.docker.com/engine/context/aci-integration/">Compose for Microsoft ACI</a></p>
<h2>Upgrade instructions</h2>
<p>To upgrade to a new version, fetch the latest version of this repo and then,</p>
<p><code>docker-compose up --build</code></p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Chirun LTI server</title>
        <link href="https://somethingorotherwhatever.com/items/chirun-lti-server"/>
        <id>https://somethingorotherwhatever.com/items/chirun-lti-server</id>
        <updated>2021-11-22T10:21:35Z</updated>
        <summary type="html"><![CDATA[<p>A web interface to process and serve documents with Chirun.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                
                    <h1>Chirun LTI Tool</h1>
<p>The Chirun LTI tool provides a simple to use interface for instructors to upload content to a VLE to be automatically converted into accessible and flexible documents with Chirun. With this tool, the instructor does not need to have any knowledge of running Unix software or uploading content to a web-server in order to share the web-based output generated by Chirun.</p>
<h2>Installation</h2>
<h3>Prerequisites</h3>
<ul>
<li>A web server supporting PHP, such as Apache.</li>
<li>PHP must be configured to allow calling the <code>exec()</code> function and have at least the following extensions enabled:<ul>
<li>pdo</li>
<li>pdo_mysql or pdo_sqlite</li>
<li>yaml</li>
</ul>
</li>
<li>The following system packages must be installed:<ul>
<li>curl</li>
<li>rsync</li>
<li>libyaml</li>
<li>docker</li>
</ul>
</li>
<li>Write access to an empty MySQL/SQLite database</li>
</ul>
<h3>LTI Tool Setup</h3>
<p>Clone this repo and copy the software into an install directory (referred to as <code>INSTALLDIR</code>) visible to your web server. Copy the file <code>config.dist.php</code> to <code>config.php</code> and then edit the file to include your own site settings. Take particular note of the following variables,</p>
<p>Name         | Description | Example
-------------|-------------|---------
<code>WEBDIR</code>     | The intended web path for accessing the tool | <code>/lti</code>
<code>INSTALLDIR</code> | The full file system path to the tool's install directory | <code>/var/www/webroot/lti</code>
<code>PROCESSUSER</code> | The "processing user" that will run the Chirun build tools via docker  | <code>programs</code>
<code>DB_NAME</code> | A database DSN specifying a database host and name  | <code>mysql:dbname=chirun;host=database.example.com</code>
<code>DB_USERNAME</code> | Database username  |
<code>DB_PASSWORD</code> | Database password  |</p>
<h3>User Permission Setup</h3>
<p>Uploaded documents are compiled by running the Chirun software in a docker container. Since allowing access to docker is equivalent to giving root access to a user, this must be handled carefully. For separation of privileges a new Unix user must be created to be used as the Chirun processing user. This user should have access to docker via membership of the docker group.</p>
<p>Assuming your processing user will be named <code>programs</code>, the following commands creates the user and adds it to the docker group,
```</p>
<h1>adduser programs</h1>
<h1>usermod -aG docker programs</h1>
<p>```</p>
<h3>Directory Permission Setup</h3>
<p>The user running the web server process should be able to write to <code>UPLOADDIR</code>, <code>CONTENTDIR</code> and <code>PROCESSDIR/logs</code>, but not permitted to write to anything else in <code>INSTALLDIR</code>. As such, ensure directory permissions are setup as follows, where <code>programs</code> is your processing user and <code>www-data</code> is the primary unix group for the user running the web server process.</p>
<p>Directory | Mode | Owner:Group
----------|------|--------------
<code>INSTALLDIR</code> | 755 | <code>programs:programs</code>
<code>UPLOADDIR</code>  | 775 | <code>programs:www-data</code>
<code>CONTENTDIR</code>  | 775 | <code>programs:www-data</code>
<code>PROCESSDIR/logs</code> |775 | <code>programs:www-data</code></p>
<h3>Sudo Permission Setup</h3>
<p>The <code>sudo</code> command should be configured so that the user running the web server process (e.g. <code>www-data</code>) can start the Chirun processing script as the processing user with some particular environment variables populated. This can be setup by adding the following lines to the <code>/etc/sudoers</code> file,</p>
<p>```
www-data ALL = (programs) NOPASSWD: [PROCESSDIR]/process.sh
Defaults env_keep += "PROCESSDIR"
Defaults env_keep += "CONTENTDIR"
Defaults env_keep += "UPLOADDIR"
Defaults env_keep += "DOCKER_PROCESSING_VOLUME"</p>
<p>```</p>
<p>replacing <code>[PROCESSDIR]</code> with the full path to the processing directory.</p>
<h3>Docker Setup</h3>
<p>Prepare the docker daemon by pulling the Chirun image on the server. For example, log into the server as the processing user and run the command:
<code>$ docker pull chirun/chirun-docker:latest</code></p>
<h3>Admin Directory Setup</h3>
<p>The web server's rewriting engine should be used to direct all requests of the form <code>lti/content/[...]</code> to <code>lti/index.php?req_content=[...]</code>. In addition, the following directories should be made forbidden for public access:</p>
<ul>
<li><code>UPLOADIR</code></li>
<li><code>PROCESSDIR</code></li>
<li><code>INSTALLDIR/lib</code></li>
</ul>
<p>The path <code>WEBPATH/admin</code> should also be protected and allow only server administrator access. An example Apache setup using Basic Authentication is shown below.</p>
<p><code>&lt;Location /&gt;
        Require all granted
        DirectorySlash Off
        RewriteEngine on
        RewriteRule /lti/content/(.*)$ /lti/index.php?req_content=$1 [L,QSA]
    &lt;/Location&gt;
    &lt;Location /lti/upload&gt;
        Require all denied
    &lt;/Location&gt;
    &lt;Location /lti/process&gt;
        Require all denied
    &lt;/Location&gt;
    &lt;Location /lti/lib&gt;
        Require all denied
    &lt;/Location&gt;
    &lt;Location /lti/admin&gt;
        AuthType Basic
        AuthName "Restricted admin section"
        AuthUserFile /etc/apache2/.htpasswd
        Require user admin
    &lt;/Location&gt;</code></p>
<p>In this example a username and password for admin access can be setup by running the following command on the server,</p>
<p>```</p>
<h1>htpasswd /etc/apache2/.htpasswd admin</h1>
<p>```</p>
<h2>LTI Setup</h2>
<p>To use the Chirun LTI tool with your VLE, an administrator will need to add the tool to your own instance of the VLE. To do this, the VLE needs to be setup beforehand as a tool consumer in the admin panel accessible on your web server at https://chirun.example.com/lti/admin/.</p>
<p>Create a Name, Key, and Secret for your VLE using the <em>Add New Consumer</em> form on the admin page, and then forward that information on to your VLE administrator to be added as an external LTI tool. They might also need the URL for the LTI XML configuration: https://chirun.example.com/lti/xml/ or the LTI launch URL, https://chirun.example.com/lti/connect.php.</p>
<h2>Build Process Information</h2>
<p>When content is uploaded to the LTI tool for processing, the following series of steps occurs.</p>
<ul>
<li>
<p>First, a file is uploaded to the <code>UPLOADDIR</code> by the web server process. On upload a GUID is generated for the uploaded bundle of files. <code>.zip</code> files are extracted in-place.</p>
</li>
<li>
<p>The processing script is started. The script runs partially in a container, and so <code>sudo</code> is used to start the script as the processing user with permission to use to docker.</p>
</li>
<li>
<p>The source content is copied from the <code>UPLOADDIR</code> directory to the <code>PROCESSDIR</code> directory.</p>
</li>
<li>
<p>When uploading raw <code>.tex</code> or <code>.md</code> files a standalone Chirun compatible <code>course.yml</code> file is created. If a Chirun <code>config.yml</code> file already exists as part of the upload, it is modified to inject the correct content web path and GUID.</p>
</li>
<li>
<p>Chirun is run in a docker container using the newly prepared <code>course.yml</code> in the <code>PROCESSDIR</code> directory.</p>
</li>
<li>
<p>If successful, the output is copied from the <code>PROCESSDIR</code> directory into the <code>CONTENTDIR</code> directory with the required directory permissions.</p>
</li>
<li>
<p>Clean up is performed and the copy of the uploaded files in <code>PROCESSDIR</code> are deleted.</p>
</li>
<li>
<p>Finally, the output of the process script is written to a log file at <code>PROCESSDIR/logs/&lt;guid&gt;.log</code> and the log is shown to the user.</p>
</li>
</ul>
<h2>Other Information</h2>
<p>The <code>UPLOADDIR</code> directory should be emptied periodically to avoid filling the disk. For example, this can be handled by adding a cron job or systemd timer for the <code>programs</code> user.</p>
<p>An example command that clears the upload directory of all files could be,</p>
<p><code>find [INSTALLDIR]/upload/ -mindepth 1 -maxdepth 1 -exec rm -r -- {} +</code></p>
<p>replacing <code>[INSTALLDIR]</code> with the full path to the install directory. The <code>find</code> command can be tweaked with arguments such as <code>-mtime</code> to more finely tune what files are deleted.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Each Edge Peach Pear Plum</title>
        <link href="https://somethingorotherwhatever.com/items/each-edge-peach-pear-plum"/>
        <id>https://somethingorotherwhatever.com/items/each-edge-peach-pear-plum</id>
        <updated>2021-11-20T00:00:00Z</updated>
        <summary type="html"><![CDATA[<p>I've made another baby, so it's time for another talk about baby maths. Each Peach Pear Plum is a classic picture book for babies, with a beautifully simple rhyming scheme. But I've always wished it was more complete. Join me for an Eulerian tour through fantasy land!</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/each-edge-peach-pear-plum/main.png" />
                
                
                    <p>I've made another baby, so it's time for another talk about baby maths. Each Peach Pear Plum is a classic picture book for babies, with a beautifully simple rhyming scheme. But I've always wished it was more complete. Join me for an Eulerian tour through fantasy land!</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Graph theory extension for Numbas</title>
        <link href="https://somethingorotherwhatever.com/items/graph-theory-extension-for-numbas"/>
        <id>https://somethingorotherwhatever.com/items/graph-theory-extension-for-numbas</id>
        <updated>2021-11-04T14:32:15Z</updated>
        <summary type="html"><![CDATA[<p>An extension for Numbas which adds tools for generating and drawing random graphs.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/graph-theory-extension-for-numbas/main.png" />
                
                
                    <h1>Graph theory extension for Numbas</h1>
<p>This extension provides some functions for working with and drawing graphs in Numbas.</p>
<h2>JME functions</h2>
<p>Many of these functions take an adjacency matrix as an argument.
A value of 0 in position <code>[i][j]</code> means that there is no edge from vertex <code>i</code> to <code>j</code>; a positive value means that there is an edge, with any value less than 1 being drawn as a dashed line, and a value of 1 being drawn as a solid line.</p>
<h3><code>adjacency_matrix(edges)</code></h3>
<p>Given a list of edges, in the form <code>[v1,v2]</code>, where <code>v1</code> and <code>v2</code> are indices of vertices, produce an adjacency matrix for the graph with those edges and no extra vertices.</p>
<h3><code>draw_graph_from_adjacency(adjacency, labels)</code></h3>
<p>Given an adjacency matrix and an optional list of string labels for the vertices, produce a drawing of a graph.</p>
<h3><code>draw_graph(adjacency, vertices, labels)</code></h3>
<p>Given an adjacency matrix, a list of vectors giving the positions of the vertices, and an optional list of string labels for the vertices, produce a drawing of a graph.</p>
<h3><code>layout_graph(adjacency)</code></h3>
<p>Given an adjacency matrix, lay the graph out, trying to separate vertices reasonably and avoid crossing edges.</p>
<p>Returns a list of vectors giving the positions of the vertices.</p>
<h3><code>vertex_degrees(adjacency)</code></h3>
<p>Given an adjacency matrix, return a list giving the degree of each vertex.</p>
<h3><code>graph_union(a,b)</code></h3>
<p>Given adjacency matrices <code>a</code> and <code>b</code>, return an adjacency matrix representing the union of the two graphs.</p>
<h3><code>cartesian_product(a,b)</code></h3>
<p>Given adjacency matrices <code>a</code> and <code>b</code>, return an adjacency matrix representing the cartesian product of the two graphs.</p>
<h3><code>direct_product(a,b)</code></h3>
<p>Given adjacency matrices <code>a</code> and <code>b</code>, return an adjacency matrix representing the direct product of the two graphs.</p>
<h3><code>adjacency_permutation(p,m)</code></h3>
<p>Given a permutation <code>p</code> (produced by the permutations extension) and an adjacency matrix <code>m</code>, return an adjacency matrix representing the graph with the vertices permuted according to <code>p</code>.</p>
<h3><code>is_graph_isomorphism(p,m)</code></h3>
<p>Given a permutation <code>p</code> (produced by the permutations extension) and an adjacency matrix <code>m</code>, return <code>true</code> if <code>p</code> is an isomorphism of the graph represented by <code>m</code>, and <code>false</code> otherwise.</p>
<h2>JavaScript functions</h2>
<p>All JavaScript functions are available under <code>Numbas.extensions['graph-theory']</code>.</p>
<p>Many of these functions take an adjacency matrix as an argument.
An adjacency matrix is a 2D array (an array of arrays), with added integer properties <code>rows</code> and <code>columns</code> giving the number.
A value of 0 in position <code>[i][j]</code> means that there is no edge from vertex <code>i</code> to <code>j</code>; a positive value means that there is an edge, with any value less than 1 being drawn as a dashed line, and a value of 1 being drawn as a solid line.</p>
<h3><code>connected_components(adjacency)</code></h3>
<p>Given an adjacency matrix, find the connected components.
Returns a list of components, each represented as a list of the indices of the vertices in that component.</p>
<h3><code>is_connected(adjacency)</code></h3>
<p>Return <code>true</code> if the graph represented by the given adjacency matrix has a single connected component.</p>
<h3><code>subgraph(adjacency,vertices)</code></h3>
<p>Given a graph represented by an adjacency matrix, and a list of indices of vertices, return the adjacency matrix of the subgraph containing only those vertices.</p>
<h3><code>largest_connected_component(adjacency, labels)</code></h3>
<p>Given a graph represented as an adjacency matrix, and a list of labels for the vertices, return the largest connected component of the graph and the labels of its vertices.</p>
<p>Returns an object <code>{adjacency, labels}</code>.</p>
<p><em>(I'm not sure if this function is needed)</em></p>
<h3><code>adjacency_matrix_from_edges(edges,directed)</code></h3>
<p>Given a list of edges, produce the corresponding adjacency matrix.</p>
<p><code>edges</code> is a list of values <code>[v1,v2]</code>, where <code>v1</code> and <code>v2</code> are indices of vertices.</p>
<p>If <code>directed</code> is true, then the adjacency matrix will be made symmetric about its diagonal. 
So for an undirected edge between vertices <code>i</code> and <code>j</code>, you only need to include <code>[i,j]</code> in <code>edges</code>.</p>
<p>If <code>directed</code> is false, then <code>[i,j]</code> and <code>[j,i]</code> are different directed edges.</p>
<h3><code>from_adjacency_matrix(adjacency)</code></h3>
<p>Given an adjacency matrix, return lists of vertices and edges, to be used by the cola layout engine.</p>
<p>Returns an object <code>{vertices, edges}</code>.</p>
<h3><code>draw_graph(graph)</code></h3>
<p><code>graph</code> is an object <code>{vertices, adjacency, labels}</code>.</p>
<ul>
<li><code>vertices</code> is a list of objects <code>{x,y}</code>.</li>
<li><code>adjacency</code> is an adjacency matrix: 0 means no edge; 1 means an edge; and any number between 0 and 1 means a dashed edge. If there are edges <code>i</code> to <code>j</code> and <code>j</code> to <code>i</code>, the edge is drawn as undirected; otherwise if there is just an edge <code>i</code> to <code>j</code> it is drawn as directed with an arrow.</li>
<li><code>labels</code> is a list of string labels for the vertices.</li>
</ul>
<p>Returns an SVG element containing a drawing of the graph.</p>
<h3><code>layout_graph(graph)</code></h3>
<p><code>graph</code> is an object <code>{vertices, edges}</code>.</p>
<ul>
<li><code>vertices</code> is a list of objects <code>{x,y}</code>.</li>
<li><code>edges</code> is a list of objects <code>{source, target, weight}</code>, where <code>source</code> and <code>target</code> are indices of vertices, and <code>weight</code> is a scalar controlling how long the edge should be.</li>
</ul>
<p>Returns a list of positions for the vertices, as objects <code>{x,y}</code>.</p>
<h3><code>vertex_degrees(adjacency)</code></h3>
<p>Given a graph represented as an adjacency matrix, return a list giving the degree of each vertex.</p>
<h3><code>graph_union(m1, m2, ...)</code></h3>
<p>Given arbitrarily many adjacency matrices representing graphs, return an adjacency matrix representing the union of those graphs.</p>
<h3><code>cartesian_product(m1, m2, ...)</code></h3>
<p>Given arbitrarily many adjacency matrices representing graphs, return an adjacency matrix representing the cartesian product of those graphs.</p>
<h3><code>direct_product(m1, m2, ...)</code></h3>
<p>Given arbitrarily many adjacency matrices representing graphs, return an adjacency matrix representing the direct product of those graphs.</p>
<h3><code>adjacency permutation(p,m)</code></h3>
<p>Apply the given permutation <code>p</code>, represented as a list where <code>p[i]</code> gives the image of <code>i</code> under <code>p</code>, to the vertices of the graph represented by the adjacency matrix <code>m</code>.</p>
<p>Returns an adjacency matrix.</p>
<h3><code>is_graph_isomorphism(p,m)</code></h3>
<p>Returns <code>true</code> if the permutation <code>p</code> is an isomorphism of the graph represented by the adjacency matrix <code>m</code>.</p>
<h3><code>edges_from_weight_matrix(weights)</code></h3>
<p><code>weights</code> is a 2D array, where <code>weights[i][j]</code> gives the weight of the edge between vertices <code>i</code> and <code>j</code>, or <code>-1</code> if there's no edge.</p>
<p>Returns a list of edges represented as objects <code>{from, to, weight}</code>.</p>
<h3><code>kruskals_algorithm(weights)</code></h3>
<p>Find a minimum spanning forest of the graph represented by <code>weights</code>, using Kruskal's algorithm.</p>
<p><code>weights</code> is a 2D array representing the weights of edges in a graph, which will be passed to <code>edges_from_weight_matrix</code> to produce a list of edges.</p>
<p>Returns a list of edges, each represented by an object <code>{from, to, weight}</code>.</p>
<h3><code>prims_algorithm(weights)</code></h3>
<p>Find a minimum spanning tree of the graph represented by <code>weights</code>, using Prim's algorithm.
The graph must be connected.</p>
<p><code>weights</code> is a 2D array representing the weights of edges in a graph, which will be passed to <code>edges_from_weight_matrix</code> to produce a list of edges.</p>
<p>Returns a list of edges, each represented by an object <code>{from, to, weight}</code>.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>What colour is that?</title>
        <link href="https://somethingorotherwhatever.com/items/what-colour-is-that"/>
        <id>https://somethingorotherwhatever.com/items/what-colour-is-that</id>
        <updated>2021-10-30T06:56:22.867000Z</updated>
        <summary type="html"><![CDATA[<p>Point your camera at something, nad this tells you what colour it is.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/what-colour-is-that/main.png" />
                
                
                    <p>I'm really colourblind. There are quite a few apps that let you point your camera at something and tell you what colour it is, but they're either too erratic or too precise in the names of colours they give. </p>
<p>After years of frustration, I decided to make my own. This does a few things:</p>
<ul>
<li>it averages the sample over a second or two, so the colour it's matching doesn't flicker with camera noise.</li>
<li>it uses a simple list of colours, because anything more specific is useless to me, and gives the top 5 closest matches in case it's between a few named colours, along with bars showing how confident it is.</li>
<li>I weighted the colour names, so you have to be <em>really</em> close to 'teal' for it to say 'teal'.</li>
<li>it uses the CIEDE2000 metric to calculate the closest colours, which matches perceived colour better than Euclidean distance in RGB space.</li>
<li>most of the screen is filled with the colour it's thinking about, with a small peephole for the camera view, so you can see the colour it's naming.</li>
</ul>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Line-by-line derivation</title>
        <link href="https://somethingorotherwhatever.com/items/line-by-line-derivation"/>
        <id>https://somethingorotherwhatever.com/items/line-by-line-derivation</id>
        <updated>2021-10-21T11:34:55.274000Z</updated>
        <summary type="html"><![CDATA[<p>A thing for writing out line-by-line mathematical derivations more conveniently than just TeX allows</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                
                    <p>A thing for writing out line-by-line mathematical derivations more conveniently than just TeX allows</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Behind the design of Numbas</title>
        <link href="https://somethingorotherwhatever.com/items/behind-the-design-of-numbas"/>
        <id>https://somethingorotherwhatever.com/items/behind-the-design-of-numbas</id>
        <updated>2021-08-25T12:18:52Z</updated>
        <summary type="html"><![CDATA[<p>A collection of articles about the motivation and research behind the design of the Numbas system</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                
                    <h1>Behind the design of Numbas</h1>
<p>In this repository I'm collecting essays and documentation on the design decisions behind the Numbas system.</p>
<h2>Building</h2>
<p>The notes are written using Sphinx. Install it using pip:</p>
<p><code>pip install -r requirements.txt</code></p>
<p>To build the HTML version, run:</p>
<p><code>make html</code></p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>QTI to Numbas</title>
        <link href="https://somethingorotherwhatever.com/items/qti-to-numbas"/>
        <id>https://somethingorotherwhatever.com/items/qti-to-numbas</id>
        <updated>2021-08-17T14:00:12Z</updated>
        <summary type="html"><![CDATA[<p>A tool to convert a bank of QTI items to Numbas</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                
                    <h1>QTI to Numbas</h1>
<p>A tool to convert QTI packages to Numbas exams.</p>
<p>This is an ambitious goal! At the moment, it can convert the following kinds of packages:</p>
<ul>
<li>a bank of multiple choice questions exported from Blackboard in QTI 2.1 format.</li>
<li>a Canvas quiz created using the old quiz engine, exported in QTI 1.2 format.</li>
</ul>
<p>It could be expanded to support more of the QTI specification.</p>
<p>There is no real error handling: packages containing unsupported items will fail.</p>
<p>I (Christian Lawson-Perfect) don't have access to Blackboard, so if you have a QTI package that doesn't work, please send it to me and I'll try to work out how to support it.</p>
<h2>Installation</h2>
<p>This is a Python 3 script which requires a couple of packages to be installed.</p>
<p>To install the packages, run:</p>
<p><code>pip install -r requirements.txt</code></p>
<h2>Usage</h2>
<p>To convert a package called <code>question_bank.zip</code>, run:</p>
<p><code>python qti_to_numbas.py question_bank.zip</code></p>
<p>A .exam file containing all of the questions in the question bank will be created in the current directory.
You can upload this file to the Numbas editor.</p>
<h2>To do</h2>
<ul>
<li>Deal with generic/correct/incorrect feedback in Canvas quizzes.</li>
</ul>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>A lullaby sequence</title>
        <link href="https://somethingorotherwhatever.com/items/a-lullaby-sequence"/>
        <id>https://somethingorotherwhatever.com/items/a-lullaby-sequence</id>
        <updated>2021-07-14T08:48:17Z</updated>
        <summary type="html"><![CDATA[<p>My son was born last September. While he doesn’t hate sleep as much as his sister did, he still needs a bit of help to drop off. I’m not at all musically inclined, and I seem unable to …</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/a-lullaby-sequence/main.png" />
                
                
                    <p>My son was born last September. While he doesn’t hate sleep as much as his sister did, he still needs a bit of help to drop off. I’m not at all musically inclined, and I seem unable to …</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>WhyStartAt.xyz</title>
        <link href="https://somethingorotherwhatever.com/items/whystartat-xyz"/>
        <id>https://somethingorotherwhatever.com/items/whystartat-xyz</id>
        <updated>2021-07-04T23:00:00Z</updated>
        <summary type="html"><![CDATA[<p>A collaborative site collecting ambiguities, inconsistencies and other unpleasantness in the conventions of mathematical notation.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/whystartat-xyz/main.svg" />
                
                
                    <p>A collaborative site collecting ambiguities, inconsistencies and other unpleasantness in the conventions of mathematical notation.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>The Unicode guessing game</title>
        <link href="https://somethingorotherwhatever.com/items/the-unicode-guessing-game"/>
        <id>https://somethingorotherwhatever.com/items/the-unicode-guessing-game</id>
        <updated>2021-06-24T11:05:01.917000Z</updated>
        <summary type="html"><![CDATA[<p>A game where you're shown a Unicode character and have to work out its name</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/the-unicode-guessing-game/main.png" />
                
                
                    <p>A game where you're shown a Unicode character and have to work out its name</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Wordsearch generator mk 2</title>
        <link href="https://somethingorotherwhatever.com/items/wordsearch-generator-mk-2"/>
        <id>https://somethingorotherwhatever.com/items/wordsearch-generator-mk-2</id>
        <updated>2021-06-15T07:52:14.968000Z</updated>
        <summary type="html"><![CDATA[<p>A wordsearch generator, written in Elm</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/wordsearch-generator-mk-2/main.png" />
                
                
                    <p>A wordsearch generator, written in Elm</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Elm on Glitch</title>
        <link href="https://somethingorotherwhatever.com/items/elm-on-glitch"/>
        <id>https://somethingorotherwhatever.com/items/elm-on-glitch</id>
        <updated>2021-05-14T13:27:51.203000Z</updated>
        <summary type="html"><![CDATA[<p>A starter Glitch.com project for things written in Elm.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                
                    <p>A starter Glitch.com project for things written in Elm.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Pentagonal spirals</title>
        <link href="https://somethingorotherwhatever.com/items/pentagonal-spirals"/>
        <id>https://somethingorotherwhatever.com/items/pentagonal-spirals</id>
        <updated>2021-05-13T06:01:29.344000Z</updated>
        <summary type="html"><![CDATA[<p>Can you make a rule for laying out a pentagonal spiral, so it goes on forever?</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <video autoplay src="https://somethingorotherwhatever.com/items/pentagonal-spirals/main.mp4"></video>
                
                
                    <p>Can you make a rule for laying out a pentagonal spiral, so it goes on forever?</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Your laptop knows more than Euler</title>
        <link href="https://somethingorotherwhatever.com/items/your-laptop-knows-more-than-euler"/>
        <id>https://somethingorotherwhatever.com/items/your-laptop-knows-more-than-euler</id>
        <updated>2021-05-12T19:17:05Z</updated>
        <summary type="html"><![CDATA[<p>A Jupyter notebook to accompany a post on The Aperiodical by Connor Krill. It shows that computers can find Mersenne primes much faster than Édouard Lucas (Connor got the wrong mathematician originally).</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/your-laptop-knows-more-than-euler/main.png" />
                
                
                    <p>A Jupyter notebook to accompany a post on The Aperiodical by Connor Krill. It shows that computers can find Mersenne primes much faster than Édouard Lucas (Connor got the wrong mathematician originally).</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>My robot draws TeX</title>
        <link href="https://somethingorotherwhatever.com/items/my-robot-draws-tex"/>
        <id>https://somethingorotherwhatever.com/items/my-robot-draws-tex</id>
        <updated>2021-04-08T13:32:44Z</updated>
        <summary type="html"><![CDATA[<p>For my birthday I got an EleksDraw pen plotter. It’s a cheap and cheerful example of the form: a pair of orthogonal metal rods with a pen on the end, attached to electric motors. The idea is …</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/my-robot-draws-tex/main.jpg" />
                
                
                    <p>For my birthday I got an EleksDraw pen plotter. It’s a cheap and cheerful example of the form: a pair of orthogonal metal rods with a pen on the end, attached to electric motors. The idea is …</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Postcard maker</title>
        <link href="https://somethingorotherwhatever.com/items/postcard-maker"/>
        <id>https://somethingorotherwhatever.com/items/postcard-maker</id>
        <updated>2021-04-08T12:49:30Z</updated>
        <summary type="html"><![CDATA[<p>A web page to create a postcard, for my pen plotter to draw. The text can include mathematical notation, rendered using MathJax.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/postcard-maker/main.png" />
                
                
                    <p>A web page to create a postcard, for my pen plotter to draw. The text can include mathematical notation, rendered using MathJax.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Which One Doesn&#39;t Belong? maker</title>
        <link href="https://somethingorotherwhatever.com/items/which-one-doesn-t-belong-maker"/>
        <id>https://somethingorotherwhatever.com/items/which-one-doesn-t-belong-maker</id>
        <updated>2021-04-01T05:54:51.186000Z</updated>
        <summary type="html"><![CDATA[<p>A tool to make 'Which One Doesn't Belong?' grids - a 2×2 square of images.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/which-one-doesn-t-belong-maker/main.png" />
                
                
                    <p>A tool to make 'Which One Doesn't Belong?' grids - a 2×2 square of images.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Extract data from a Numbas exam</title>
        <link href="https://somethingorotherwhatever.com/items/extract-data-from-a-numbas-exam"/>
        <id>https://somethingorotherwhatever.com/items/extract-data-from-a-numbas-exam</id>
        <updated>2021-03-31T08:17:34.214000Z</updated>
        <summary type="html"><![CDATA[<p>A page made to show how to embed a Numbas exam and extract the attempt data from it.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/extract-data-from-a-numbas-exam/main.png" />
                
                
                    <p>A page made to show how to embed a Numbas exam and extract the attempt data from it.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Plotter tools</title>
        <link href="https://somethingorotherwhatever.com/items/plotter-tools"/>
        <id>https://somethingorotherwhatever.com/items/plotter-tools</id>
        <updated>2021-02-15T08:13:46Z</updated>
        <summary type="html"><![CDATA[<p>This is a web-based controller for my pen plotter, an EleksDraw.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/plotter-tools/main.png" />
                
                
                    <h1>plotterweb</h1>
<p>This is a web-based controller for my pen plotter, an EleksDraw.</p>
<p>It uses vpype to read in SVG files and produce a load of line segments, then sends GCode to a plotter device connected on a serial port, which it tries to detect.</p>
<p>There are two processes that need to run: the web server, and the worker which talks to the plotter.</p>
<p>To run the web server:</p>
<p><code>python manage.py runserver</code></p>
<p>To run the worker:</p>
<p><code>python manage.py runworker plotter-manager</code></p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>MathsKlatch 2020 camera operator</title>
        <link href="https://somethingorotherwhatever.com/items/mathsklatch-2020-camera-operator"/>
        <id>https://somethingorotherwhatever.com/items/mathsklatch-2020-camera-operator</id>
        <updated>2020-11-14T12:08:21Z</updated>
        <summary type="html"><![CDATA[<p>Some bits to help record talks delivered in gather.town.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                
                    <h1>MathsKlatch 2020 camera operator stuff</h1>
<p>This repository contains files for the camera operator at MathsKlatch 2020.</p>
<p>bookmarklet.js contains a JavaScript bookmarklet which will toggle the intruding bits of the gather.town UI off, so you can capture just the speaker's video.</p>
<p>MathsJam_2020.obs is an OBS scene collection. One scene is configured to capture a window, and there are two other scenes containing images to switch to while fiddling with things. I don't think this will copy across to another device well, but at least it's a starting point.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Download text file extension for Numbas</title>
        <link href="https://somethingorotherwhatever.com/items/download-text-file-extension-for-numbas"/>
        <id>https://somethingorotherwhatever.com/items/download-text-file-extension-for-numbas</id>
        <updated>2020-10-29T10:00:27Z</updated>
        <summary type="html"><![CDATA[<p>This Numbas extension adds functions to create links for students to download randomly-generated files.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                
                    <h1>Download text file</h1>
<p>This extension provides a function <code>download_link(filename,content,link_text)</code>, which creates an HTML link tag with the given link tag. When the student clicks on the link, a file with the given filename and content is downloaded.</p>
<p><a href="https://numbas.mathcentre.ac.uk/question/77554/download-text-file-extension/">There's a demo question showing how to use this extension</a>.</p>
<h2><code>download_link(filename,content,link_text)</code></h2>
<p>Creates an HTML link tag which downloads a file with the given filename and text content. If you don't give <code>link_text</code>, the link reads "Download <code>filename</code>".</p>
<h2><code>csv(data,headers)</code></h2>
<p>Format a set of data as a CSV file.</p>
<ul>
<li>If <code>data</code> is a list of lists, The second argument <code>headers</code> is an optional list of strings to use as column headers.</li>
<li>If <code>data</code> is a list of dictionaries, the output contains a column for each distinct key in those dictionaries.</li>
<li>If <code>data</code> is a dictionary, it's assumed to map headers to columns of data.</li>
</ul>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Gaussian origami</title>
        <link href="https://somethingorotherwhatever.com/items/gaussian-origami"/>
        <id>https://somethingorotherwhatever.com/items/gaussian-origami</id>
        <updated>2020-10-22T10:43:19Z</updated>
        <summary type="html"><![CDATA[<p>Inspired by a question on math-fun.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <video autoplay src="https://somethingorotherwhatever.com/items/gaussian-origami/main.mp4"></video>
                
                
                    <p>Inspired by a question on math-fun.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Lean Blockly</title>
        <link href="https://somethingorotherwhatever.com/items/lean-blockly"/>
        <id>https://somethingorotherwhatever.com/items/lean-blockly</id>
        <updated>2020-10-09T12:42:23.073000Z</updated>
        <summary type="html"><![CDATA[<p>I had a thought about using Blockly to construct proofs, which would be translated to Lean code for evaluation.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/lean-blockly/main.png" />
                
                
                    <p>I had a thought about using Blockly to construct proofs, which would be translated to Lean code for evaluation.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Fix the maths on wordpress.com</title>
        <link href="https://somethingorotherwhatever.com/items/fix-the-maths-on-wordpress-com"/>
        <id>https://somethingorotherwhatever.com/items/fix-the-maths-on-wordpress-com</id>
        <updated>2020-10-01T09:05:11.010000Z</updated>
        <summary type="html"><![CDATA[<p>A bookmarklet to replace all the maths rendered as images on wordpress.com blogs with a better rendering using MathJax.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                
                    <p>A bookmarklet to replace all the maths rendered as images on wordpress.com blogs with a better rendering using MathJax.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>The enormous difficulty of telling the truth about escalators with statistics</title>
        <link href="https://somethingorotherwhatever.com/items/the-enormous-difficulty-of-telling-the-truth-about-escalators-with-statistics"/>
        <id>https://somethingorotherwhatever.com/items/the-enormous-difficulty-of-telling-the-truth-about-escalators-with-statistics</id>
        <updated>2020-09-02T13:25:35Z</updated>
        <summary type="html"><![CDATA[<p>Earlier this year, when getting the train to work was still a thing for me, I noticed this statistic: 95% of the time escalators were working in the last four weeks.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/the-enormous-difficulty-of-telling-the-truth-about-escalators-with-statistics/main.jpg" />
                
                
                    <p>Earlier this year, when getting the train to work was still a thing for me, I noticed this statistic: 95% of the time escalators were working in the last four weeks.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Unix permutation clock</title>
        <link href="https://somethingorotherwhatever.com/items/unix-permutation-clock"/>
        <id>https://somethingorotherwhatever.com/items/unix-permutation-clock</id>
        <updated>2020-08-28T14:22:37.494000Z</updated>
        <summary type="html"><![CDATA[<p>A clock which shows a different permutation of a deck of cards each second, for the next 10^60 years</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <video autoplay src="https://somethingorotherwhatever.com/items/unix-permutation-clock/main.mp4"></video>
                
                
                    <p>A clock which shows a different permutation of a deck of cards each second, for the next 10^60 years</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>The permutation clock</title>
        <link href="https://somethingorotherwhatever.com/items/the-permutation-clock"/>
        <id>https://somethingorotherwhatever.com/items/the-permutation-clock</id>
        <updated>2020-08-26T12:19:16.141000Z</updated>
        <summary type="html"><![CDATA[<p>A different permutation of the cards every second.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <video autoplay src="https://somethingorotherwhatever.com/items/the-permutation-clock/main.mp4"></video>
                
                
                    <p>A different permutation of the cards every second.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>transcriptpage</title>
        <link href="https://somethingorotherwhatever.com/items/transcriptpage"/>
        <id>https://somethingorotherwhatever.com/items/transcriptpage</id>
        <updated>2020-08-03T11:08:12Z</updated>
        <summary type="html"><![CDATA[<p>A tool to create a page showing a video next to its transcript</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/transcriptpage/main.png" />
                
                
                    <h1>transcriptpage</h1>
<p><code>transcriptpage</code> is a tool which takes a video and a captions file, and creates a web page which displays the video alongside the transcript.</p>
<p>Each sentence in the transcript is displayed on a separate line, along with a timestamp; clicking on the timestamp jumps the video to that sentence.</p>
<h2>How to use it</h2>
<p><code>transcriptpage</code> is a Python 3 script. It has been tested with python 3.8.</p>
<p>At the moment, it only supports videos on Vimeo. Soon, it will support YouTube as well.</p>
<p>It requires a few Python packages, which can be installed with pip:</p>
<p><code>python
pip install -r requirements.txt</code></p>
<p>To create a page, you need a captions file in .srt format and the address of the video. The command takes two arguments: the local path of the .srt file, and the address of the video.</p>
<p><code>./transcriptpage captions.srt https://vimeo.com/442721457</code></p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Inclusive e-assessment</title>
        <link href="https://somethingorotherwhatever.com/items/inclusive-e-assessment"/>
        <id>https://somethingorotherwhatever.com/items/inclusive-e-assessment</id>
        <updated>2020-06-25T10:50:09Z</updated>
        <summary type="html"><![CDATA[<p>A talk given at <a href="https://eams.ncl.ac.uk/sessions/2020">EAMS 2020</a>. Presented both as a video and a series of slides with accompanying transcript.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/inclusive-e-assessment/main.png" />
                
                
                    <p>A talk given at <a href="https://eams.ncl.ac.uk/sessions/2020">EAMS 2020</a>. Presented both as a video and a series of slides with accompanying transcript.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Absolutely huge memory</title>
        <link href="https://somethingorotherwhatever.com/items/absolutely-huge-memory"/>
        <id>https://somethingorotherwhatever.com/items/absolutely-huge-memory</id>
        <updated>2020-04-26T07:59:47.309000Z</updated>
        <summary type="html"><![CDATA[<p>A memory game that is bigger than you'll ever be able to deal with</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/absolutely-huge-memory/main.png" />
                
                
                    <p>A memory game that is bigger than you'll ever be able to deal with</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Wobbly clock!</title>
        <link href="https://somethingorotherwhatever.com/items/wobbly-clock"/>
        <id>https://somethingorotherwhatever.com/items/wobbly-clock</id>
        <updated>2020-04-16T06:13:10.410000Z</updated>
        <summary type="html"><![CDATA[<p>A wobbly clock</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <video autoplay src="https://somethingorotherwhatever.com/items/wobbly-clock/main.mp4"></video>
                
                
                    <p>A wobbly clock</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Moodle SCORM report for Numbas</title>
        <link href="https://somethingorotherwhatever.com/items/moodle-scorm-report-for-numbas"/>
        <id>https://somethingorotherwhatever.com/items/moodle-scorm-report-for-numbas</id>
        <updated>2020-04-03T13:01:32Z</updated>
        <summary type="html"><![CDATA[<p>This Moodle plugin provides a special report for Moodle's SCORM player, for use with Numbas exams.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                
                    <h1>Numbas report for Moodle SCORM</h1>
<p>This Moodle plugin provides a special report for Moodle's SCORM player, for use with <a href="https:/www.numbas.org.uk">Numbas</a> exams.</p>
<p>For each attempt, it shows the student's answers and scores against the correct answer for each part, in an easier to read form than Moodle's built-in "track details" view.</p>
<h2>Installation</h2>
<p>Clone this repository into the folder <code>mod/scorm/report/numbas</code> inside your Moodle folder, then go to <em>Site administration → Notifications</em> and click to install it.</p>
<h2>Usage</h2>
<p>Click on a Numbas SCORM package, then click <em>Reports → Numbas report</em>.</p>
<p>Click on the attempt number for the attempt you want to look at. You'll be shown a breakdown of the student's answers and scores for that attempt.</p>
<h2>Licence</h2>
<p>Copyright (C) 2020-2021 Newcastle University</p>
<p>This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.</p>
<p>This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.</p>
<p>You should have received a copy of the GNU General Public License
along with this program.  If not, see <a href="https://www.gnu.org/licenses/">https://www.gnu.org/licenses/</a>.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Make it rain, Bloomberg!</title>
        <link href="https://somethingorotherwhatever.com/items/make-it-rain-bloomberg"/>
        <id>https://somethingorotherwhatever.com/items/make-it-rain-bloomberg</id>
        <updated>2020-03-06T19:31:56.888000Z</updated>
        <summary type="html"><![CDATA[<p>If you wanted to give the same amount to everyone in a place, how much would each person get?</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/make-it-rain-bloomberg/main.png" />
                
                
                    <p>If you wanted to give the same amount to everyone in a place, how much would each person get?</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Chirun in Docker</title>
        <link href="https://somethingorotherwhatever.com/items/chirun-in-docker"/>
        <id>https://somethingorotherwhatever.com/items/chirun-in-docker</id>
        <updated>2020-03-06T14:11:39Z</updated>
        <summary type="html"><![CDATA[<p>A Docker container for running Chirun.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                
                    <p>To build, run <code>make</code>, which runs this:</p>
<p><code>docker build . --build-arg VERSION=(latest commit hash)</code></p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Chirun</title>
        <link href="https://somethingorotherwhatever.com/items/chirun"/>
        <id>https://somethingorotherwhatever.com/items/chirun</id>
        <updated>2020-03-05T14:41:09Z</updated>
        <summary type="html"><![CDATA[<p>A tool to produce accessible lecture notes from LaTeX or Markdown source. I took over development from George Stagg.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/chirun/main.png" />
                
                
                    <p><img src="https://mas-coursebuild.ncl.ac.uk/lti/images/chirun_logo_512.png" height="100"></p>
<p>Chirun produces flexible and accessible course notes, in a variety of formats, from LaTeX or Markdown source. It is aimed primarily at notes in the mathematical sciences.</p>
<p>This repository, <code>chirun</code>, is the source code of the Chirun Python package, providing the command line interface for building content.</p>
<h2>Documentation</h2>
<p>The Chirun documentation, including infromation about the <a href="https://mas-coursebuild.ncl.ac.uk/public/">Chirun Public Content Builder</a> and
<a href="https://github.com/chirun-ncl/chirun-lti/">Chirun LTI Provider</a> can be found at,</p>
<p>https://chirun.readthedocs.io/en/latest/</p>
<h3>How it works</h3>
<p>A set of course notes are provided in either Markdown or LaTeX along with a configuration file <code>config.yml</code>. The <code>chirun</code> command then builds the requested outputs based on the contents of the configuration file.</p>
<ul>
<li>Markdown parsing is provided by <a href="https://github.com/Python-Markdown/markdown">Python Markdown</a>.</li>
<li>LaTeX parsing is provided by <a href="https://github.com/plastex/plastex">plasTeX</a>.</li>
</ul>
<hr />
<h3>Prerequisites</h3>
<h4>Linux (Ubuntu 18.10+)</h4>
<ul>
<li>Ensure a system TeX distribution is installed, such as TeX Live (<code>apt install texlive-full</code>).</li>
<li>Install <code>pdf2svg</code>, <code>pdftoppm</code>, <code>pdftk</code> and <code>libyaml</code> using your standard package manager (<code>apt install pdf2svg poppler-utils libyaml-dev pdftk-java</code>).</li>
<li>Ensure the <code>virtualenv</code> python package is installed (<code>apt install python3-virtualenv</code>).</li>
</ul>
<h4>MacOS</h4>
<ul>
<li>Install a system TeX distribution, such as MacTeX from https://tug.org/mactex/.</li>
<li>Install Homebrew by following the instructions at https://brew.sh and once installed use the <code>brew</code> command to install <code>pdf2svg</code>, <code>pdftoppm</code>, <code>pdftk</code> and <code>libyaml</code>:</li>
<li><code>brew install poppler</code></li>
<li><code>brew install pdf2svg</code></li>
<li><code>brew install libyaml</code></li>
<li><code>brew install pdftk-java</code></li>
<li>Install <code>virtualenv</code> by running <code>pip3 install virtualenv</code>.</li>
<li>If you are not using the default Apple-provided build of Python 3 ( e.g. Python is installed under <code>/Applications/Python 3.X</code>, where <code>3.X</code> is the version),
  ensure that the SSL CA certificates are installed by running:<ul>
<li><code>sudo /Applications/Python\ 3.X/Install\ Certificates.command</code></li>
</ul>
</li>
</ul>
<hr />
<h3>Quick Installation</h3>
<ul>
<li>Create a Python3 virtualenv: <code>virtualenv -p python3 chirun_env</code> and activate it: <code>source ./chirun_env/bin/activate</code></li>
<li>Install chirun: <code>pip install git+https://github.com/chirun-ncl/chirun.git</code></li>
</ul>
<p>The command <code>chirun</code> is now available for use. You should now compile the sample course and ensure everything works.</p>
<h4>Upgrade Instructions</h4>
<ul>
<li>Run the following command with the virtualenv active to upgrade the installed version of <code>chirun</code>:</li>
<li><code>pip install --upgrade git+https://github.com/chirun-ncl/chirun.git</code></li>
<li>You may need to run the above command with an extra <code>--force-reinstall</code> argument if the version number has not been changed between updates.</li>
</ul>
<hr />
<h3>Development installation</h3>
<ul>
<li>Create a Python3 virtualenv: <code>virtualenv -p python3 chirun_env</code> and activate it: <code>source ./chirun_env/bin/activate</code></li>
<li>Clone the repository: <code>git clone https://github.com/chirun-ncl/chirun.git</code></li>
<li><code>cd chirun</code></li>
<li>Install all the requirements: <code>pip install -r requirements.txt</code></li>
<li>Install the chirun tool into your environment: <code>pip install -e .</code></li>
</ul>
<p>The command <code>chirun</code> is now available for use. You should now compile the sample course and ensure everything works.</p>
<h4>Development Upgrade Instructions</h4>
<ul>
<li>To upgrade the development installation pull the latest changes from this git repository and install any new requirements, e.g.</li>
<li><code>cd chirun</code></li>
<li><code>git pull</code></li>
<li><code>pip install -r requirements.txt</code></li>
</ul>
<h4>Upgrading from <code>makecourse</code></h4>
<p>The project has recently been renamed from "makecourse" to "chirun". To upgrade, first remove the older <code>makecourse</code> package with,</p>
<p><code>pip uninstall makecourse</code></p>
<p>Then follow the installation or upgrade instructions above.</p>
<hr />
<h3>Demo</h3>
<p><a href="https://chirun-ncl.github.io/sample_course/">Sample course</a>, and its <a href="https://github.com/chirun-ncl/sample_course">source code</a>.</p>
<h3>Compile the Sample Course</h3>
<ul>
<li>Install the <code>chirun</code> package using the instructions above</li>
<li>Clone the sample course: <code>git clone https://github.com/chirun-ncl/sample_course.git</code></li>
<li>Change into the directory you just cloned to and run <code>make</code> to build and view a local version of the sample course.</li>
<li>The finished website output will be in <code>./sample_course/build</code></li>
</ul>
<hr />
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Animations</title>
        <link href="https://somethingorotherwhatever.com/items/animations"/>
        <id>https://somethingorotherwhatever.com/items/animations</id>
        <updated>2020-03-03T18:57:04Z</updated>
        <summary type="html"><![CDATA[<p>Some looping animations that I made.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <video autoplay src="https://somethingorotherwhatever.com/items/animations/main.mp4"></video>
                
                
                    <p>Some looping animations that I made.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>SAMDOB - The order of operations</title>
        <link href="https://somethingorotherwhatever.com/items/samdob-the-order-of-operations"/>
        <id>https://somethingorotherwhatever.com/items/samdob-the-order-of-operations</id>
        <updated>2020-02-20T13:21:37Z</updated>
        <summary type="html"><![CDATA[<p>A tool to play around with the order of operations</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/samdob-the-order-of-operations/main.png" />
                
                
                    <h1><a href="https://www.checkmyworking.com/misc/samdob/">SAMDOB</a></h1>
<p>A tool to play around with the order of operations.</p>
<h2>Why?</h2>
<p>Pretty much everyone is taught a mnemonic for the order of arithmetic operations.</p>
<p>Some people are taught BODMAS, some are taught BIMDAS, while PEMDAS is popular in other parts of the world.</p>
<p>They describe the order in which you should carry out operations, but you need some more rules as well, that don't fit into a snappy mnemonic:</p>
<ul>
<li>Consider each operation in turn, reading the mnemonic from left to right.</li>
<li>Read the expression from left to right. When you encounter the current operation, replace it with its numerical result.</li>
<li>When you get to the end of the expression, go back to the start and move to the next operation in the mnemonic.</li>
</ul>
<p><em>Except</em> multiplication and division, and addition and subtraction, have the same precedence: you consider them both at the same time, rather than one after the other. The mnemonic doesn't mention this.</p>
<p>It's actually quite fiddly, but the fiddliness rarely makes a difference, if you've got common sense.</p>
<p><em>What if you didn't have any common sense?</em></p>
<h2>So</h2>
<p>SAMDOB lets you see how the order of operations is applied. When you write an expression in the right-hand box, the steps taken to evaluate it to a number are shown underneath.</p>
<p>You can change the order of operations by writing a mnemonic in the left-hand box. Once you've done that, the sequence is described underneath.</p>
<p>Letters grouped in brackets have the same precedence.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>A paper version of the Seven Triples puzzle</title>
        <link href="https://somethingorotherwhatever.com/items/a-paper-version-of-the-seven-triples-puzzle"/>
        <id>https://somethingorotherwhatever.com/items/a-paper-version-of-the-seven-triples-puzzle</id>
        <updated>2020-02-20T11:25:04Z</updated>
        <summary type="html"><![CDATA[<p>Last year I wrote about a 3D-printed puzzle I’d designed, called Seven Triples. At work we want to use this puzzle during an A-Level enrichment day, which means we need about twenty copies of…</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/a-paper-version-of-the-seven-triples-puzzle/main.png" />
                
                
                    <p>Last year I wrote about a 3D-printed puzzle I’d designed, called Seven Triples. At work we want to use this puzzle during an A-Level enrichment day, which means we need about twenty copies of…</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Triangular squares</title>
        <link href="https://somethingorotherwhatever.com/items/triangular-squares"/>
        <id>https://somethingorotherwhatever.com/items/triangular-squares</id>
        <updated>2020-02-12T12:24:14.404000Z</updated>
        <summary type="html"><![CDATA[<p>A nice looping animation showing a triangular lattice morphing to a square grid</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <video autoplay src="https://somethingorotherwhatever.com/items/triangular-squares/main.mp4"></video>
                
                
                    <p>A nice looping animation showing a triangular lattice morphing to a square grid</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Triangular square 1</title>
        <link href="https://somethingorotherwhatever.com/items/triangular-square-1"/>
        <id>https://somethingorotherwhatever.com/items/triangular-square-1</id>
        <updated>2020-02-11T15:26:15.655000Z</updated>
        <summary type="html"><![CDATA[<p>A nice looping animation showing a triangular lattice morphing to a square grid</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <video autoplay src="https://somethingorotherwhatever.com/items/triangular-square-1/main.mp4"></video>
                
                
                    <p>A nice looping animation showing a triangular lattice morphing to a square grid</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Draggy box</title>
        <link href="https://somethingorotherwhatever.com/items/draggy-box"/>
        <id>https://somethingorotherwhatever.com/items/draggy-box</id>
        <updated>2020-01-24T09:39:11.880000Z</updated>
        <summary type="html"><![CDATA[<p>Game/puzzle to do with shuffling boxes</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <video autoplay src="https://somethingorotherwhatever.com/items/draggy-box/main.mp4"></video>
                
                
                    <p>Game/puzzle to do with shuffling boxes</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>The Conant gasket</title>
        <link href="https://somethingorotherwhatever.com/items/the-conant-gasket"/>
        <id>https://somethingorotherwhatever.com/items/the-conant-gasket</id>
        <updated>2020-01-15T09:06:12.051000Z</updated>
        <summary type="html"><![CDATA[<p>Draws the Conant gasket, a fractal which ought to be better known.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/the-conant-gasket/main.png" />
                
                
                    <p>Draws the Conant gasket, a fractal which ought to be better known.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Numbas parts graph</title>
        <link href="https://somethingorotherwhatever.com/items/numbas-parts-graph"/>
        <id>https://somethingorotherwhatever.com/items/numbas-parts-graph</id>
        <updated>2019-12-19T09:37:54.259000Z</updated>
        <summary type="html"><![CDATA[<p>I was trying to make something to visualise the flow of parts in a Numbas explore mode question.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/numbas-parts-graph/main.png" />
                
                
                    <p>I was trying to make something to visualise the flow of parts in a Numbas explore mode question.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>TikZJax demo</title>
        <link href="https://somethingorotherwhatever.com/items/tikzjax-demo"/>
        <id>https://somethingorotherwhatever.com/items/tikzjax-demo</id>
        <updated>2019-12-10T09:15:05.386000Z</updated>
        <summary type="html"><![CDATA[<p>Jim Fowler's TikZJax is incredible, but it needed an easy way of trying it out. So I made one.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/tikzjax-demo/main.png" />
                
                
                    <p>Jim Fowler's TikZJax is incredible, but it needed an easy way of trying it out. So I made one.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Automatic Namesby</title>
        <link href="https://somethingorotherwhatever.com/items/automatic-namesby"/>
        <id>https://somethingorotherwhatever.com/items/automatic-namesby</id>
        <updated>2019-11-18T15:01:23.515000Z</updated>
        <summary type="html"><![CDATA[<p>Uses some word lists to come up with random fake place names and show them in street signs. Prompted by the thought that glitch's automatic project URLs would be cuter if they were place names.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/automatic-namesby/main.png" />
                
                
                    <p>Uses some word lists to come up with random fake place names and show them in street signs. Prompted by the thought that glitch's automatic project URLs would be cuter if they were place names.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>My adventures in 3D printing: Seven Triples puzzle</title>
        <link href="https://somethingorotherwhatever.com/items/my-adventures-in-3d-printing-seven-triples-puzzle"/>
        <id>https://somethingorotherwhatever.com/items/my-adventures-in-3d-printing-seven-triples-puzzle</id>
        <updated>2019-11-07T11:36:59Z</updated>
        <summary type="html"><![CDATA[<p>At work we’ve got a 3D printer. In this series of posts I’ll share some of the designs I’ve made. There are seven kinds of shape. There are three copies of each shape. The pieces …</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/my-adventures-in-3d-printing-seven-triples-puzzle/main.jpg" />
                
                
                    <p>At work we’ve got a 3D printer. In this series of posts I’ll share some of the designs I’ve made. There are seven kinds of shape. There are three copies of each shape. The pieces …</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Baked sudoku</title>
        <link href="https://somethingorotherwhatever.com/items/baked-sudoku"/>
        <id>https://somethingorotherwhatever.com/items/baked-sudoku</id>
        <updated>2019-11-05T00:00:00Z</updated>
        <summary type="html"><![CDATA[<p>You can impose on Sudoku puzzles a physical system which works surprisingly well. It has phase transitions, and when you reduce the heat it settles into a solved state!</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/baked-sudoku/main.png" />
                
                
                    <p>You can impose on Sudoku puzzles a physical system which works surprisingly well. It has phase transitions, and when you reduce the heat it settles into a solved state!</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Flock paths</title>
        <link href="https://somethingorotherwhatever.com/items/flock-paths"/>
        <id>https://somethingorotherwhatever.com/items/flock-paths</id>
        <updated>2019-11-04T11:23:42Z</updated>
        <summary type="html"><![CDATA[<p>An arty thing inspired by the Herschel enneahedron.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <video autoplay src="https://somethingorotherwhatever.com/items/flock-paths/main.mp4"></video>
                
                
                    <p>An arty thing inspired by the Herschel enneahedron.</p>
<p>The genesis of this was thinking about how to show that the Herschel graph is non-Hamiltonian: there's no path that visits every vertex once.</p>
<p>This simulates flocking gliders, who move between the points on the graph. Because the graph is non-Hamiltonian, every glider is bound to re-visit a vertex before they've completed the tour.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>The homologist&#39;s nightmare</title>
        <link href="https://somethingorotherwhatever.com/items/the-homologist-s-nightmare"/>
        <id>https://somethingorotherwhatever.com/items/the-homologist-s-nightmare</id>
        <updated>2019-10-15T09:44:30.712000Z</updated>
        <summary type="html"><![CDATA[<p>Lots and lots and lots of overlapping rings</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <video autoplay src="https://somethingorotherwhatever.com/items/the-homologist-s-nightmare/main.mp4"></video>
                
                
                    <p>Lots and lots and lots of overlapping rings</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Get the coins out of the bank</title>
        <link href="https://somethingorotherwhatever.com/items/get-the-coins-out-of-the-bank"/>
        <id>https://somethingorotherwhatever.com/items/get-the-coins-out-of-the-bank</id>
        <updated>2019-10-07T07:56:54.470000Z</updated>
        <summary type="html"><![CDATA[<p>A puzzle from the maths-fun mailing list.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/get-the-coins-out-of-the-bank/main.png" />
                
                
                    <p>A puzzle from the maths-fun mailing list.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Number dress-up party</title>
        <link href="https://somethingorotherwhatever.com/items/number-dress-up-party"/>
        <id>https://somethingorotherwhatever.com/items/number-dress-up-party</id>
        <updated>2019-09-18T10:24:44.792000Z</updated>
        <summary type="html"><![CDATA[<p>All the numbers have come to a party in fancy dress.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <video autoplay src="https://somethingorotherwhatever.com/items/number-dress-up-party/main.mp4"></video>
                
                
                    <p>All the numbers have come to a party in fancy dress.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Sierpinski interpolation</title>
        <link href="https://somethingorotherwhatever.com/items/sierpinski-interpolation"/>
        <id>https://somethingorotherwhatever.com/items/sierpinski-interpolation</id>
        <updated>2019-09-16T23:00:00Z</updated>
        <summary type="html"><![CDATA[<p>This is known in some places as the chaos game: if you repeatedly move halfway towards a randomly chosen vertex of an equilateral triangle, the positions you can end up together make the Sierpiński triangle. In this one, press the keys 1, 2 and 3 to move to each vertex.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/sierpinski-interpolation/main.png" />
                
                
                    <p>This is known in some places as the chaos game: if you repeatedly move halfway towards a randomly chosen vertex of an equilateral triangle, the positions you can end up together make the Sierpiński triangle. In this one, press the keys 1, 2 and 3 to move to each vertex.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>S.O.X.</title>
        <link href="https://somethingorotherwhatever.com/items/s-o-x"/>
        <id>https://somethingorotherwhatever.com/items/s-o-x</id>
        <updated>2019-08-31T23:00:00Z</updated>
        <summary type="html"><![CDATA[<p>An adaptation of the book <em>Solo Noughts and Crosses</em></p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/s-o-x/main.png" />
                
                
                    <p>An adaptation of the book <em>Solo Noughts and Crosses</em></p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>TMiP 2019 - The Big Internet Math-Off</title>
        <link href="https://somethingorotherwhatever.com/items/tmip-2019-the-big-internet-math-off"/>
        <id>https://somethingorotherwhatever.com/items/tmip-2019-the-big-internet-math-off</id>
        <updated>2019-08-11T23:00:00Z</updated>
        <summary type="html"><![CDATA[<p>About the Big Internet Math-Off, a competition I ran on The Aperiodical. Given at <em>Talking Maths in Public</em>.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/tmip-2019-the-big-internet-math-off/main.png" />
                
                
                    <p>About the Big Internet Math-Off, a competition I ran on The Aperiodical. Given at <em>Talking Maths in Public</em>.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Incident counter</title>
        <link href="https://somethingorotherwhatever.com/items/incident-counter"/>
        <id>https://somethingorotherwhatever.com/items/incident-counter</id>
        <updated>2019-06-17T06:00:38.792000Z</updated>
        <summary type="html"><![CDATA[<p>Inspired by the 'paralellepiped incident' joke that some friends make. You reocrd an incident, and when you come back later it tells you how long since the last incident.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/incident-counter/main.png" />
                
                
                    <p>Inspired by the 'paralellepiped incident' joke that some friends make. You reocrd an incident, and when you come back later it tells you how long since the last incident.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>CLP&#39;s Nice Calculator</title>
        <link href="https://somethingorotherwhatever.com/items/clp-s-nice-calculator"/>
        <id>https://somethingorotherwhatever.com/items/clp-s-nice-calculator</id>
        <updated>2019-05-16T09:26:27Z</updated>
        <summary type="html"><![CDATA[<p>An RPN calculator with some nice features</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <video autoplay src="https://somethingorotherwhatever.com/items/clp-s-nice-calculator/main.mp4"></video>
                
                
                    <h1>CLP's Nice calculator</h1>
<p>An RPN calculator with some nifty features.</p>
<ul>
<li>The operation history is kept, and you can change input numbers to automatically recalculate the result.</li>
<li>When you duplicate numbers, both copies are linked so a change to one is applied to the other simultaneously.</li>
</ul>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Eukleides extension for Numbas</title>
        <link href="https://somethingorotherwhatever.com/items/eukleides-extension-for-numbas"/>
        <id>https://somethingorotherwhatever.com/items/eukleides-extension-for-numbas</id>
        <updated>2019-05-02T13:19:14Z</updated>
        <summary type="html"><![CDATA[<p>An extension for Numbas which provides the Eukleides geometrical drawing language.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/eukleides-extension-for-numbas/main.png" />
                
                
                    <h1>Eukleides extension for Numbas</h1>
<p>This extension for Numbas contains a port of the <a href="http://eukleides.org/">Eukleides geometrical drawing language</a> by Christian Obrecht, with extensions to make diagrams interactive and accessibility improvements.</p>
<h2>Documentation</h2>
<p>There's <a href="docs/index.md">documentation on how the extension works and a full function reference</a>.</p>
<p>See the <a href="demo.html">demo page</a> for a gallery of examples, and the <a href="playground.html">interactive playground</a> to draw your own diagrams.</p>
<h2>Development</h2>
<p>The extension is written using ES6 syntax and features. This is compiled with <a href="https://babeljs.io/">babeljs</a> to ES5, which is supported by lots more browsers.</p>
<p><a href="dev_demo.html">dev_demo.html</a> and <a href="dev_playground.html">dev_playground.html</a> load the source scripts directly, on browsers which support ES6.</p>
<p>To install the babeljs tools, first install <a href="https://nodejs.org/en/">nodejs</a> and then run:</p>
<p><code>npm install</code></p>
<p>Then, when you make a change to the source, run</p>
<p><code>make</code></p>
<p>to compile the scripts in the <code>dist</code> folder.</p>
<p>You might need to set the environment variable <code>NUMBAS_RUNTIME_PATH</code> to the location of your <a href="https://github.com/numbas/Numbas">Numbas compiler</a> directory.</p>
<h2>License</h2>
<p>&copy; 2019 Christian Lawson-Perfect for Newcastle University.</p>
<p>The original Eukleides is &copy; 2004-2010 Christian Obrecht.</p>
<p>This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 3 of the License, or (at your
option) any later version.</p>
<p>Some code is taken from <a href="https://github.com/bijection/g9">g9</a>, and used under the terms of the MIT license.</p>
<p>Data from <a href="https://github.com/axismaps/colorbrewer/">ColorBrewer2</a> is used under the terms of the Apache 2.0 license.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>My RedBubble shop</title>
        <link href="https://somethingorotherwhatever.com/items/my-redbubble-shop"/>
        <id>https://somethingorotherwhatever.com/items/my-redbubble-shop</id>
        <updated>2019-03-11T00:00:00Z</updated>
        <summary type="html"><![CDATA[<p>I've made a few mathsy t-shirt designs.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/my-redbubble-shop/main.jpg" />
                
                
                    <p>I've made a few mathsy t-shirt designs.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Statistics extension for Numbas</title>
        <link href="https://somethingorotherwhatever.com/items/statistics-extension-for-numbas"/>
        <id>https://somethingorotherwhatever.com/items/statistics-extension-for-numbas</id>
        <updated>2019-02-25T12:44:46Z</updated>
        <summary type="html"><![CDATA[<p>A Numbas extension providing a wrapper around the jStat library</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                
                    <h1>Statistics extension for <a href="https://www.numbas.org.uk/">Numbas</a></h1>
<p>This extension provides a load of statistical functions, wrapping the <a href="https://github.com/jstat/jstat">jStat</a> library.</p>
<p>There's <a href="https://docs.numbas.org.uk/en/latest/extensions/stats.html">documentation at docs.numbas.org.uk</a>.</p>
<h2>Functions</h2>
<p>This list of functions contains descriptions copied from the jStat documentation.
Click on the function name to see the original documentation.</p>
<h3>Descriptive statistics of a list of numbers</h3>
<h4><a href="http://jstat.github.io/all.html#sum"><code>sum(array)</code></a></h4>
<p>Returns the sum of the <code>array</code> vector.</p>
<h4><a href="http://jstat.github.io/all.html#sumsqrd"><code>sumsqrd(array)</code></a></h4>
<p>Returns the sum squared of the <code>array</code> vector.</p>
<h4><a href="http://jstat.github.io/all.html#sumsqerr"><code>sumsqerr(array)</code></a></h4>
<p>Returns the sum of squared errors of prediction of the <code>array</code> vector.</p>
<h4><a href="http://jstat.github.io/all.html#product"><code>product(array)</code></a></h4>
<p>Returns the product of the <code>array</code> vector.</p>
<h4><a href="http://jstat.github.io/all.html#min"><code>min(array)</code></a></h4>
<p>Returns the minimum value of the <code>array</code> vector.</p>
<h4><a href="http://jstat.github.io/all.html#max"><code>max(array)</code></a></h4>
<p>Returns the maximum value of the <code>array</code> vector.</p>
<h4><a href="http://jstat.github.io/all.html#mean"><code>mean(array)</code></a></h4>
<p>Returns the mean of the <code>array</code> vector.</p>
<h4><a href="http://jstat.github.io/all.html#meansqerr"><code>meansqerr(array)</code></a></h4>
<p>Returns the mean squared error of the <code>array</code> vector.</p>
<h4><a href="http://jstat.github.io/all.html#geomean"><code>geomean(array)</code></a></h4>
<p>Returns the geometric mean of the <code>array</code> vector.</p>
<h4><a href="http://jstat.github.io/all.html#median"><code>median(array)</code></a></h4>
<p>Returns the median of the <code>array</code> vector.</p>
<h4><a href="http://jstat.github.io/all.html#cumsum"><code>cumsum(array)</code></a></h4>
<p>Returns an array of partial sums in the sequence.</p>
<h4><a href="http://jstat.github.io/all.html#diff"><code>diff(array)</code></a></h4>
<p>Returns an array of the successive differences of the array.</p>
<h4><a href="http://jstat.github.io/all.html#range"><code>range(array)</code></a></h4>
<p>Returns the range of the <code>array</code> vector.</p>
<h4><a href="http://jstat.github.io/all.html#variance"><code>variance(array)</code></a></h4>
<p>Returns the variance of the <code>array</code> vector.
By default, the population variance is calculated.
Passing <code>true</code> to <code>flag</code> indicates to compute the sample variance instead.</p>
<h4><a href="http://jstat.github.io/all.html#stdev"><code>stdev(array)</code></a></h4>
<p>Returns the standard deviation of the <code>array</code> vector.
By default, the population standard deviation is returned.
Passing <code>true</code> to <code>flag</code> returns the sample standard deviation.</p>
<h4><a href="http://jstat.github.io/all.html#meandev"><code>meandev(array)</code></a></h4>
<p>Returns the mean absolute deviation of the <code>array</code> vector.</p>
<h4><a href="http://jstat.github.io/all.html#meddev"><code>meddev(array)</code></a></h4>
<p>Returns the median absolute deviation of the <code>array</code> vector.</p>
<h4><a href="http://jstat.github.io/all.html#coeffvar"><code>coeffvar(array)</code></a></h4>
<p>Returns the coefficient of variation of the <code>array</code> vector.</p>
<h4><a href="http://jstat.github.io/all.html#quartiles"><code>quartiles(array)</code></a></h4>
<p>Returns the quartiles of the <code>array</code> vector.</p>
<h3>Correlation of two samples</h3>
<h4><a href="http://jstat.github.io/all.html#covariance"><code>covariance(array1, array2)</code></a></h4>
<p>Returns the covariance of the <code>array1</code> and <code>array2</code> vectors.</p>
<h4><a href="http://jstat.github.io/all.html#corrcoeff"><code>corrcoeff(array1, array2)</code></a></h4>
<p>Returns the population correlation coefficient of the <code>array1</code> and <code>array2</code> vectors (Pearson's Rho).</p>
<h4><a href="http://jstat.github.io/all.html#stdev"><code>stdev(array, is_sample)</code></a></h4>
<p>Returns the standard deviation of the <code>array</code> vector.
By default, the population standard deviation is returned.
Passing <code>true</code> to <code>flag</code> returns the sample standard deviation.</p>
<h4><a href="http://jstat.github.io/all.html#variance"><code>variance(array, is_sample)</code></a></h4>
<p>Returns the variance of the <code>array</code> vector.
By default, the population variance is calculated.
Passing <code>true</code> to <code>flag</code> indicates to compute the sample variance instead.</p>
<h4><a href="http://jstat.github.io/all.html#mode"><code>mode(array)</code></a></h4>
<p>Returns the mode of the <code>array</code> vector.
If there are multiple modes then <code>mode()</code> will return all of them.</p>
<h3>Distributions</h3>
<h4><a href="http://jstat.github.io/all.html#jStat.beta.pdf"><code>betapdf(x, alpha, beta)</code></a></h4>
<p>Returns the value of <code>x</code> in the Beta distribution with parameters <code>alpha</code> and <code>beta</code>.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.beta.cdf"><code>betacdf(x, alpha, beta)</code></a></h4>
<p>Returns the value of <code>x</code> in the cdf for the Beta distribution with parameters <code>alpha</code> and <code>beta</code>.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.beta.inv"><code>betainv(p, alpha, beta)</code></a></h4>
<p>Returns the value of <code>p</code> in the inverse of the cdf for the Beta distribution with parameters <code>alpha</code> and <code>beta</code>.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.beta.mean"><code>betamean(alpha, beta)</code></a></h4>
<p>Returns the mean of the Beta distribution with parameters <code>alpha</code> and <code>beta</code>.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.beta.median"><code>betamedian(alpha, beta)</code></a></h4>
<p>Returns the median of the Beta distribution with parameters <code>alpha</code> and <code>beta</code>.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.beta.mode"><code>betamode(alpha, beta)</code></a></h4>
<p>Returns the mode of the Beta distribution with parameters <code>alpha</code> and <code>beta</code>.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.beta.sample"><code>betasample(alpha, beta)</code></a></h4>
<p>Returns a random number whose distribution is the Beta distribution with parameters <code>alpha</code> and <code>beta</code>.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.beta.variance"><code>betavariance(alpha, beta)</code></a></h4>
<p>Returns the variance of the Beta distribution with parameters <code>alpha</code> and <code>beta</code>.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.centralF.pdf"><code>centralFpdf(x, df1, df2)</code></a></h4>
<p>Given <code>x</code> in the range [0, infinity), returns the probability density of the (central) F distribution at <code>x</code>.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.centralF.cdf"><code>centralFcdf(x, df1, df2)</code></a></h4>
<p>Given x in the range [0, infinity), returns the cumulative probability density of the central F distribution. That is, <code>jStat.centralF.cdf(2.5, 10, 20)</code> will return the probability that a number randomly selected from the central F distribution with <code>df1 = 10</code> and <code>df2 = 20</code> will be less than 2.5.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.centralF.inv"><code>centralFinv(p, df1, df2)</code></a></h4>
<p>Given <code>p</code> in [0, 1), returns the value of x for which the cumulative probability density of the central F distribution is p. That is, <code>jStat.centralF.inv(p, df1, df2) = x</code> if and only if <code>jStat.centralF.inv(x, df1, df2) = p</code>.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.centralF.mean"><code>centralFmean(df1, df2)</code></a></h4>
<p>Returns the mean of the (Central) F distribution.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.centralF.mode"><code>centralFmode(df1, df2)</code></a></h4>
<p>Returns the mode of the (Central) F distribution.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.centralF.sample"><code>centralFsample(df1, df2)</code></a></h4>
<p>Returns a random number whose distribution is the (Central) F distribution.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.centralF.variance"><code>centralFvariance(df1, df2)</code></a></h4>
<p>Returns the variance of the (Central) F distribution.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.cauchy.pdf"><code>cauchypdf(x, local, scale)</code></a></h4>
<p>Returns the value of <code>x</code> in the pdf of the Cauchy distribution with a location (median) of <code>local</code> and scale factor of <code>scale</code>.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.cauchy.cdf"><code>cauchycdf(x, local, scale)</code></a></h4>
<p>Returns the value of <code>x</code> in the cdf of the Cauchy distribution with a location (median) of <code>local</code> and scale factor of <code>scale</code>.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.cauchy.inv"><code>cauchyinv(p, local, scale)</code></a></h4>
<p>Returns the value of <code>p</code> in the inverse of the cdf for the Cauchy distribution with a location (median) of <code>local</code> and scale factor of <code>scale</code>.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.cauchy.median"><code>cauchymedian(local, scale)</code></a></h4>
<p>Returns the value of the median for the Cauchy distribution with a location (median) of <code>local</code> and scale factor of <code>scale</code>.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.cauchy.mode"><code>cauchymode(local, scale)</code></a></h4>
<p>Returns the value of the mode for the Cauchy distribution with a location (median) of <code>local</code> and scale factor of <code>scale</code>.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.cauchy.sample"><code>cauchysample(local, scale)</code></a></h4>
<p>Returns a random number whose distribution is the Cauchy distribution with a location (median) of <code>local</code> and scale factor of <code>scale</code>.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.chisquare.pdf"><code>chisquarepdf(x, dof)</code></a></h4>
<p>Returns the value of <code>x</code> in the pdf of the Chi Square distribution with <code>dof</code> degrees of freedom.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.chisquare.cdf"><code>chisquarecdf(x, dof)</code></a></h4>
<p>Returns the value of <code>x</code> in the cdf of the Chi Square distribution with <code>dof</code> degrees of freedom.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.chisquare.inv"><code>chisquareinv(p, dof)</code></a></h4>
<p>Returns the value of <code>x</code> in the inverse of the cdf for the Chi Square distribution with <code>dof</code> degrees of freedom.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.chisquare.mean"><code>chisquaremean(dof)</code></a></h4>
<p>Returns the value of the mean for the Chi Square distribution with <code>dof</code> degrees of freedom.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.chisquare.median"><code>chisquaremedian(dof)</code></a></h4>
<p>Returns the value of the median for the Chi Square distribution with <code>dof</code> degrees of freedom.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.chisquare.mode"><code>chisquaremode(dof)</code></a></h4>
<p>Returns the value of the mode for the Chi Square distribution with <code>dof</code> degrees of freedom.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.chisquare.sample"><code>chisquaresample(dof)</code></a></h4>
<p>Returns a random number whose distribution is the Chi Square distribution with <code>dof</code> degrees of freedom.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.chisquare.variance"><code>chisquarevariance(dof)</code></a></h4>
<p>Returns the value of the variance for the Chi Square distribution with <code>dof</code> degrees of freedom.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.exponential.pdf"><code>exponentialpdf(x, rate)</code></a></h4>
<p>Returns the value of <code>x</code> in the pdf of the Exponential distribution with the parameter <code>rate</code> (lambda).</p>
<h4><a href="http://jstat.github.io/all.html#jStat.exponential.cdf"><code>exponentialcdf(x, rate)</code></a></h4>
<p>Returns the value of <code>x</code> in the cdf of the Exponential distribution with the parameter <code>rate</code> (lambda).</p>
<h4><a href="http://jstat.github.io/all.html#jStat.exponential.inv"><code>exponentialinv(p, rate)</code></a></h4>
<p>Returns the value of <code>p</code> in the inverse of the cdf for the Exponential distribution with the parameter <code>rate</code> (lambda).</p>
<h4><a href="http://jstat.github.io/all.html#jStat.exponential.mean"><code>exponentialmean(rate)</code></a></h4>
<p>Returns the value of the mean for the Exponential distribution with the parameter <code>rate</code> (lambda).</p>
<h4><a href="http://jstat.github.io/all.html#jStat.exponential.median"><code>exponentialmedian(rate)</code></a></h4>
<p>Returns the value of the median for the Exponential distribution with the parameter <code>rate</code> (lambda)</p>
<h4><a href="http://jstat.github.io/all.html#jStat.exponential.mode"><code>exponentialmode(rate)</code></a></h4>
<p>Returns the value of the mode for the Exponential distribution with the parameter <code>rate</code> (lambda).</p>
<h4><a href="http://jstat.github.io/all.html#jStat.exponential.sample"><code>exponentialsample(rate)</code></a></h4>
<p>Returns a random number whose distribution is the Exponential distribution with the parameter <code>rate</code> (lambda).</p>
<h4><a href="http://jstat.github.io/all.html#jStat.exponential.variance"><code>exponentialvariance(rate)</code></a></h4>
<p>Returns the value of the variance for the Exponential distribution with the parameter <code>rate</code> (lambda).</p>
<h4><a href="http://jstat.github.io/all.html#jStat.gamma.pdf"><code>gammapdf(x, shape, scale)</code></a></h4>
<p>Returns the value of <code>x</code> in the pdf of the Gamma distribution with the parameters <code>shape</code> (k) and <code>scale</code> (theta). Notice that if using the alpha beta convention, <code>scale = 1/beta</code>.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.gamma.cdf"><code>gammacdf(x, shape, scale)</code></a></h4>
<p>Returns the value of <code>x</code> in the cdf of the Gamma distribution with the parameters <code>shape</code> (k) and <code>scale</code> (theta). Notice that if using the alpha beta convention, <code>scale = 1/beta</code>.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.gamma.inv"><code>gammainv(p, shape, scale)</code></a></h4>
<p>Returns the value of <code>p</code> in the inverse of the cdf for the Gamma distribution with the parameters <code>shape</code> (k) and <code>scale</code> (theta). Notice that if using the alpha beta convention, <code>scale = 1/beta</code>.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.gamma.mean"><code>gammamean(shape, scale)</code></a></h4>
<p>Returns the value of the mean for the Gamma distribution with the parameters <code>shape</code> (k) and <code>scale</code> (theta). Notice that if using the alpha beta convention, <code>scale = 1/beta</code>.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.gamma.mode"><code>gammamode(shape, scale)</code></a></h4>
<p>Returns the value of the mode for the Gamma distribution with the parameters <code>shape</code> (k) and <code>scale</code> (theta). Notice that if using the alpha beta convention, <code>scale = 1/beta</code>.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.gamma.sample"><code>gammasample(shape, scale)</code></a></h4>
<p>Returns a random number whose distribution is the Gamma distribution with the parameters <code>shape</code> (k) and <code>scale</code> (theta). Notice that if using the alpha beta convention, <code>scale = 1/beta</code>.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.gamma.variance"><code>gammavariance(shape, scale)</code></a></h4>
<p>Returns the value of the variance for the Gamma distribution with the parameters <code>shape</code> (k) and <code>scale</code> (theta). Notice that if using the alpha beta convention, <code>scale = 1/beta</code>.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.invgamma.pdf"><code>invgammapdf(x, shape, scale)</code></a></h4>
<p>Returns the value of <code>x</code> in the pdf of the Inverse-Gamma distribution with parametres <code>shape</code> (alpha) and <code>scale</code> (beta).</p>
<h4><a href="http://jstat.github.io/all.html#jStat.invgamma.cdf"><code>invgammacdf(x, shape, scale)</code></a></h4>
<p>Returns the value of <code>x</code> in the cdf of the Inverse-Gamma distribution with parametres <code>shape</code> (alpha) and <code>scale</code> (beta).</p>
<h4><a href="http://jstat.github.io/all.html#jStat.invgamma.inv"><code>invgammainv(p, shape, scale)</code></a></h4>
<p>Returns the value of <code>p</code> in the inverse of the cdf for the Inverse-Gamma distribution with parametres <code>shape</code> (alpha) and <code>scale</code> (beta).</p>
<h4><a href="http://jstat.github.io/all.html#jStat.invgamma.mean"><code>invgammamean(shape, scale)</code></a></h4>
<p>Returns the value of the mean for the Inverse-Gamma distribution with parametres <code>shape</code> (alpha) and <code>scale</code> (beta).</p>
<h4><a href="http://jstat.github.io/all.html#jStat.invgamma.mode"><code>invgammamode(shape, scale)</code></a></h4>
<p>Returns the value of the mode for the Inverse-Gamma distribution with parametres <code>shape</code> (alpha) and <code>scale</code> (beta).</p>
<h4><a href="http://jstat.github.io/all.html#jStat.invgamma.sample"><code>invgammasample(shape, scale)</code></a></h4>
<p>Returns a random number whose distribution is the Inverse-Gamma distribution with parametres <code>shape</code> (alpha) and <code>scale</code> (beta).</p>
<h4><a href="http://jstat.github.io/all.html#jStat.invgamma.variance"><code>invgammavariance(shape, scale)</code></a></h4>
<p>Returns the value of the variance for the Inverse-Gamma distribution with parametres <code>shape</code> (alpha) and <code>scale</code> (beta).</p>
<h4><a href="http://jstat.github.io/all.html#jStat.kumaraswamy.pdf"><code>kumaraswamypdf(x, alpha, beta)</code></a></h4>
<p>Returns the value of <code>x</code> in the pdf of the Kumaraswamy distribution with parameters <code>a</code> and <code>b</code>.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.kumaraswamy.cdf"><code>kumaraswamycdf(x, alpha, beta)</code></a></h4>
<p>Returns the value of <code>x</code> in the cdf of the Kumaraswamy distribution with parameters <code>alpha</code> and <code>beta</code>.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.kumaraswamy.inv"><code>kumaraswamyinv(p, alpha, beta)</code></a></h4>
<p>Returns the value of <code>p</code> in the inverse of the pdf for the Kumaraswamy distribution with parametres <code>alpha</code> and <code>beta</code>.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.kumaraswamy.mean"><code>kumaraswamymean(alpha, beta)</code></a></h4>
<p>Returns the value of the mean of the Kumaraswamy distribution with parameters <code>alpha</code> and <code>beta</code>.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.kumaraswamy.median"><code>kumaraswamymedian(alpha, beta)</code></a></h4>
<p>Returns the value of the median of the Kumaraswamy distribution with parameters <code>alpha</code> and <code>beta</code>.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.kumaraswamy.mode"><code>kumaraswamymode(alpha, beta)</code></a></h4>
<p>Returns the value of the mode of the Kumaraswamy distribution with parameters <code>alpha</code> and <code>beta</code>.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.kumaraswamy.variance"><code>kumaraswamyvariance(alpha, beta)</code></a></h4>
<p>Returns the value of the variance of the Kumaraswamy distribution with parameters <code>alpha</code> and <code>beta</code>.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.lognormal.pdf"><code>lognormalpdf(x, mu, sigma)</code></a></h4>
<p>Returns the value of <code>x</code> in the pdf of the Log-normal distribution with paramters <code>mu</code> (mean) and <code>sigma</code> (standard deviation).</p>
<h4><a href="http://jstat.github.io/all.html#jStat.lognormal.cdf"><code>lognormalcdf(x, mu, sigma)</code></a></h4>
<p>Returns the value of <code>x</code> in the cdf of the Log-normal distribution with paramters <code>mu</code> (mean) and <code>sigma</code> (standard deviation).</p>
<h4><a href="http://jstat.github.io/all.html#jStat.lognormal.inv"><code>lognormalinv(p, mu, sigma)</code></a></h4>
<p>Returns the value of <code>x</code> in the inverse of the cdf for the Log-normal distribution with paramters <code>mu</code> (mean of the Normal distribution) and <code>sigma</code> (standard deviation of the Normal distribution).</p>
<h4><a href="http://jstat.github.io/all.html#jStat.lognormal.mean"><code>lognormalmean(mu, sigma)</code></a></h4>
<p>Returns the value of the mean for the Log-normal distribution with paramters <code>mu</code> (mean of the Normal distribution) and <code>sigma</code> (standard deviation of the Normal distribution).</p>
<h4><a href="http://jstat.github.io/all.html#jStat.lognormal.median"><code>lognormalmedian(mu, sigma)</code></a></h4>
<p>Returns the value of the median for the Log-normal distribution with paramters <code>mu</code> (mean of the Normal distribution) and <code>sigma</code> (standard deviation of the Normal distribution).</p>
<h4><a href="http://jstat.github.io/all.html#jStat.lognormal.mode"><code>lognormalmode(mu, sigma)</code></a></h4>
<p>Returns the value of the mode for the Log-normal distribution with paramters <code>mu</code> (mean of the Normal distribution) and <code>sigma</code> (standard deviation of the Normal distribution).</p>
<h4><a href="http://jstat.github.io/all.html#jStat.lognormal.sample"><code>lognormalsample(mu, sigma)</code></a></h4>
<p>Returns a random number whose distribution is the Log-normal distribution with paramters <code>mu</code> (mean of the Normal distribution) and <code>sigma</code> (standard deviation of the Normal distribution).</p>
<h4><a href="http://jstat.github.io/all.html#jStat.lognormal.variance"><code>lognormalvariance(mu, sigma)</code></a></h4>
<p>Returns the value of the variance for the Log-normal distribution with paramters <code>mu</code> (mean of the Normal distribution) and <code>sigma</code> (standard deviation of the Normal distribution).</p>
<h4><a href="http://jstat.github.io/all.html#jStat.normal.pdf"><code>normalpdf(x, mean, std)</code></a></h4>
<p>Returns the value of <code>x</code> in the pdf of the Normal distribution with parameters <code>mean</code> and <code>std</code> (standard deviation).</p>
<h4><a href="http://jstat.github.io/all.html#jStat.normal.cdf"><code>normalcdf(x, mean, std)</code></a></h4>
<p>Returns the value of <code>x</code> in the cdf of the Normal distribution with parameters <code>mean</code> and <code>std</code> (standard deviation).</p>
<h4><a href="http://jstat.github.io/all.html#jStat.normal.inv"><code>normalinv(p, mean, std)</code></a></h4>
<p>Returns the value of <code>p</code> in the inverse cdf for the Normal distribution with parameters <code>mean</code> and <code>std</code> (standard deviation).</p>
<h4><a href="http://jstat.github.io/all.html#jStat.normal.mean"><code>normalmean(mean, std)</code></a></h4>
<p>Returns the value of the mean for the Normal distribution with parameters <code>mean</code> and <code>std</code> (standard deviation).</p>
<h4><a href="http://jstat.github.io/all.html#jStat.normal.median"><code>normalmedian(mean, std)</code></a></h4>
<p>Returns the value of the median for the Normal distribution with parameters <code>mean</code> and <code>std</code> (standard deviation).</p>
<h4><a href="http://jstat.github.io/all.html#jStat.normal.mode"><code>normalmode(mean, std)</code></a></h4>
<p>Returns the value of the mode for the Normal distribution with parameters <code>mean</code> and <code>std</code> (standard deviation).</p>
<h4><a href="http://jstat.github.io/all.html#jStat.normal.sample"><code>normalsample(mean, std)</code></a></h4>
<p>Returns a random number whose distribution is the Normal distribution with parameters <code>mean</code> and <code>std</code> (standard deviation).</p>
<h4><a href="http://jstat.github.io/all.html#jStat.normal.variance"><code>normalvariance(mean, std)</code></a></h4>
<p>Returns the value of the variance for the Normal distribution with parameters <code>mean</code> and <code>std</code> (standard deviation).</p>
<h4><a href="http://jstat.github.io/all.html#jStat.pareto.pdf"><code>paretopdf(x, scale, shape)</code></a></h4>
<p>Returns the value of <code>x</code> in the pdf of the Pareto distribution with parameters <code>scale</code> (x&lt;sub&gt;m&lt;/sub&gt;) and <code>shape</code> (alpha).</p>
<h4><a href="http://jstat.github.io/all.html#jStat.pareto.cdf"><code>paretocdf(x, scale, shape)</code></a></h4>
<p>Returns the value of <code>x</code> in the cdf of the Pareto distribution with parameters <code>scale</code> (x&lt;sub&gt;m&lt;/sub&gt;) and <code>shape</code> (alpha).</p>
<h4><a href="http://jstat.github.io/all.html#jStat.pareto.inv"><code>paretoinv(p, scale, shape)</code></a></h4>
<p>Returns the inverse of the Pareto distribution with probability <code>p</code>, <code>scale</code>, <code>shape</code>.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.pareto.mean"><code>paretomean(scale, shape)</code></a></h4>
<p>Returns the value of the mean of the Pareto distribution with parameters <code>scale</code> (x&lt;sub&gt;m&lt;/sub&gt;) and <code>shape</code> (alpha).</p>
<h4><a href="http://jstat.github.io/all.html#jStat.pareto.median"><code>paretomedian(scale, shape)</code></a></h4>
<p>Returns the value of the median of the Pareto distribution with parameters <code>scale</code> (x&lt;sub&gt;m&lt;/sub&gt;) and <code>shape</code> (alpha).</p>
<h4><a href="http://jstat.github.io/all.html#jStat.pareto.mode"><code>paretomode(scale, shape)</code></a></h4>
<p>Returns the value of the mode of the Pareto distribution with parameters <code>scale</code> (x&lt;sub&gt;m&lt;/sub&gt;) and <code>shape</code> (alpha).</p>
<h4><a href="http://jstat.github.io/all.html#jStat.pareto.variance"><code>paretovariance(scale, shape)</code></a></h4>
<p>Returns the value of the variance of the Pareto distribution with parameters <code>scale</code> (x&lt;sub&gt;m&lt;/sub&gt;) and <code>shape</code> (alpha).</p>
<h4><a href="http://jstat.github.io/all.html#jStat.studentt.pdf"><code>studenttpdf(x, dof)</code></a></h4>
<p>Returns the value of <code>x</code> in the pdf of the Student's T distribution with <code>dof</code> degrees of freedom.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.studentt.cdf"><code>studenttcdf(x, dof)</code></a></h4>
<p>Returns the value of <code>x</code> in the cdf of the Student's T distribution with <code>dof</code> degrees of freedom.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.studentt.inv"><code>studenttinv(p, dof)</code></a></h4>
<p>Returns the value of <code>p</code> in the inverse of the cdf for the Student's T distribution with <code>dof</code> degrees of freedom.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.studentt.mean"><code>studenttmean(dof)</code></a></h4>
<p>Returns the value of the mean of the Student's T distribution with <code>dof</code> degrees of freedom.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.studentt.median"><code>studenttmedian(dof)</code></a></h4>
<p>Returns the value of the median of the Student's T distribution with <code>dof</code> degrees of freedom.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.studentt.mode"><code>studenttmode(dof)</code></a></h4>
<p>Returns the value of the mode of the Student's T distribution with <code>dof</code> degrees of freedom.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.studentt.sample"><code>studenttsample(dof)</code></a></h4>
<p>Returns a random number whose distribution is the Student's T distribution with <code>dof</code> degrees of freedom.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.studentt.variance"><code>studenttvariance(dof)</code></a></h4>
<p>Returns the value of the variance for the Student's T distribution with <code>dof</code> degrees of freedom.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.weibull.pdf"><code>weibullpdf(x, scale, shape)</code></a></h4>
<p>Returns the value <code>x</code> in the pdf for the Weibull distribution with parameters <code>scale</code> (lambda) and <code>shape</code> (k).</p>
<h4><a href="http://jstat.github.io/all.html#jStat.weibull.cdf"><code>weibullcdf(x, scale, shape)</code></a></h4>
<p>Returns the value <code>x</code> in the cdf for the Weibull distribution with parameters <code>scale</code> (lambda) and <code>shape</code> (k).</p>
<h4><a href="http://jstat.github.io/all.html#jStat.weibull.inv"><code>weibullinv(p, scale, shape)</code></a></h4>
<p>Returns the value of <code>x</code> in the inverse of the cdf for the Weibull distribution with parameters <code>scale</code> (lambda) and <code>shape</code> (k).</p>
<h4><a href="http://jstat.github.io/all.html#jStat.weibull.mean"><code>weibullmean(scale, shape)</code></a></h4>
<p>Returns the value of the mean of the Weibull distribution with parameters <code>scale</code> (lambda) and <code>shape</code> (k).</p>
<h4><a href="http://jstat.github.io/all.html#jStat.weibull.median"><code>weibullmedian(scale, shape)</code></a></h4>
<p>Returns the value of the median of the Weibull distribution with parameters <code>scale</code> (lambda) and <code>shape</code> (k).</p>
<h4><a href="http://jstat.github.io/all.html#jStat.weibull.mode"><code>weibullmode(scale, shape)</code></a></h4>
<p>Returns the mode of the Weibull distribution with parameters <code>scale</code> (lambda) and <code>shape</code> (k).</p>
<h4><a href="http://jstat.github.io/all.html#jStat.weibull.sample"><code>weibullsample(scale, shape)</code></a></h4>
<p>Returns a random number whose distribution is the Weibull distribution with parameters <code>scale</code> (lambda) and <code>shape</code> (k).</p>
<h4><a href="http://jstat.github.io/all.html#jStat.weibull.variance"><code>weibullvariance(scale, shape)</code></a></h4>
<p>Returns the variance of the Weibull distribution with parameters <code>scale</code> (lambda) and <code>shape</code> (k).</p>
<h4><a href="http://jstat.github.io/all.html#jStat.uniform.pdf"><code>uniformpdf(x, a, b)</code></a></h4>
<p>Returns the value of <code>x</code> in the pdf of the Uniform distribution from <code>a</code> to <code>b</code>.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.uniform.cdf"><code>uniformcdf(x, a, b)</code></a></h4>
<p>Returns the value of <code>x</code> in the cdf of the Uniform distribution from <code>a</code> to <code>b</code>.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.uniform.inv"><code>uniforminv(p, a, b)</code></a></h4>
<p>Returns the inverse of the <code>uniform.cdf</code> function; i.e. the value of <code>x</code> for which <code>uniform.cdf(x, a, b) == p</code>.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.uniform.mean"><code>uniformmean(a, b)</code></a></h4>
<p>Returns the value of the mean of the Uniform distribution from <code>a</code> to <code>b</code>.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.uniform.median"><code>uniformmedian(a, b)</code></a></h4>
<p>Returns the value of the median of the Uniform distribution from <code>a</code> to <code>b</code>.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.uniform.mode"><code>uniformmode(a, b)</code></a></h4>
<p>Returns the value of the mode of the Uniform distribution from <code>a</code> to <code>b</code>.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.uniform.sample"><code>uniformsample(a, b)</code></a></h4>
<p>Returns a random number whose distribution is the Uniform distribution from <code>a</code> to <code>b</code>.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.uniform.variance"><code>uniformvariance(a, b)</code></a></h4>
<p>Returns the variance of the Uniform distribution from <code>a</code> to <code>b</code>.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.binomial.pdf"><code>binomialpdf(x, n, p)</code></a></h4>
<p>Returns the value of <code>k</code> in the pdf of the Binomial distribution with parameters <code>n</code> and <code>p</code>.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.binomial.cdf"><code>binomialcdf(x, n, p)</code></a></h4>
<p>Returns the value of <code>k</code> in the cdf of the Binomial distribution with parameters <code>n</code> and <code>p</code>.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.geometric.pdf"><code>geometricpdf(x, p)</code></a></h4>
<h4><a href="http://jstat.github.io/all.html#jStat.geometric.cdf"><code>geometriccdf(x, p)</code></a></h4>
<h4><a href="http://jstat.github.io/all.html#jStat.geometric.mean"><code>geometricmean(p)</code></a></h4>
<h4><a href="http://jstat.github.io/all.html#jStat.geometric.median"><code>geometricmedian(p)</code></a></h4>
<h4><a href="http://jstat.github.io/all.html#jStat.geometric.mode"><code>geometricmode(p)</code></a></h4>
<h4><a href="http://jstat.github.io/all.html#jStat.geometric.sample"><code>geometricsample(p)</code></a></h4>
<h4><a href="http://jstat.github.io/all.html#jStat.geometric.variance"><code>geometricvariance(p)</code></a></h4>
<h4><a href="http://jstat.github.io/all.html#jStat.negbin.pdf"><code>negbinpdf(x, r, p)</code></a></h4>
<p>Returns the value of <code>k</code> in the pdf of the Negative Binomial distribution with parameters <code>n</code> and <code>p</code>.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.negbin.cdf"><code>negbincdf(x, r, p)</code></a></h4>
<p>Returns the value of <code>x</code> in the cdf of the Negative Binomial distribution with parameters <code>n</code> and <code>p</code>.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.hypgeom.pdf"><code>hypgeompdf(x, population_size, success_rate, num_draws)</code></a></h4>
<p>Returns the value of <code>k</code> in the pdf of the Hypergeometric distribution with parameters <code>N</code> (the population size), <code>m</code> (the success rate), and <code>n</code> (the number of draws).</p>
<h4><a href="http://jstat.github.io/all.html#jStat.hypgeom.cdf"><code>hypgeomcdf(x, population_size, success_rate, num_draws)</code></a></h4>
<p>Returns the value of <code>x</code> in the cdf of the Hypergeometric distribution with parameters <code>N</code> (the population size), <code>m</code> (the success rate), and <code>n</code> (the number of draws).</p>
<h4><a href="http://jstat.github.io/all.html#jStat.poisson.pdf"><code>poissonpdf(x, l)</code></a></h4>
<p>Returns the value of <code>k</code> in the pdf of the Poisson distribution with parameter <code>l</code> (lambda).</p>
<h4><a href="http://jstat.github.io/all.html#jStat.poisson.cdf"><code>poissoncdf(x, l)</code></a></h4>
<p>Returns the value of <code>x</code> in the cdf of the Poisson distribution with parameter <code>l</code> (lambda).</p>
<h4><a href="http://jstat.github.io/all.html#jStat.poisson.mean"><code>poissonmean(l)</code></a></h4>
<h4><a href="http://jstat.github.io/all.html#jStat.poisson.sample"><code>poissonsample(l)</code></a></h4>
<p>Returns a random number whose distribution is the Poisson distribution with rate parameter l (lamda)</p>
<h4><a href="http://jstat.github.io/all.html#jStat.poisson.variance"><code>poissonvariance(l)</code></a></h4>
<h4><a href="http://jstat.github.io/all.html#jStat.triangular.pdf"><code>triangularpdf(x, a, b, c)</code></a></h4>
<p>Returns the value of <code>x</code> in the pdf of the Triangular distribution with the parameters <code>a</code>, <code>b</code>, and <code>c</code>.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.triangular.cdf"><code>triangularcdf(x, a, b, c)</code></a></h4>
<p>Returns the value of <code>x</code> in the cdf of the Triangular distribution with the parameters <code>a</code>, <code>b</code>, and <code>c</code>.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.triangular.inv"><code>triangularinv(p, a, b, c)</code></a></h4>
<h4><a href="http://jstat.github.io/all.html#jStat.triangular.mean"><code>triangularmean(a, b, c)</code></a></h4>
<p>Returns the value of the mean of the Triangular distribution with the parameters <code>a</code>, <code>b</code>, and <code>c</code>.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.triangular.median"><code>triangularmedian(a, b, c)</code></a></h4>
<p>Returns the value of the median of the Triangular distribution with the parameters <code>a</code>, <code>b</code>, and <code>c</code>.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.triangular.mode"><code>triangularmode(a, b, c)</code></a></h4>
<p>Returns the value of the mode of the Triangular distribution with the parameters <code>a</code>, <code>b</code>, and <code>c</code>.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.triangular.sample"><code>triangularsample(a, b, c)</code></a></h4>
<p>Returns a random number whose distribution is the Triangular distribution with the parameters <code>a</code>, <code>b</code>, and <code>c</code>.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.triangular.variance"><code>triangularvariance(a, b, c)</code></a></h4>
<p>Returns the value of the variance of the Triangular distribution with the parameters <code>a</code>, <code>b</code>, and <code>c</code>.</p>
<h3>Statistical Tests</h3>
<h4><a href="http://jstat.github.io/all.html#jStat.zscore"><code>zScore(value, mean, sd)</code></a></h4>
<p>Returns the z-score of <code>value</code> given the data from <code>array</code>. <code>flag===true</code> denotes
use of the sample standard deviation.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.zscore"><code>zScore(value, array)</code></a></h4>
<p>Returns the z-score of <code>value</code> given the data from <code>array</code>. <code>flag===true</code> denotes
use of the sample standard deviation.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.ztest"><code>zTest(value, mean, sd, sides)</code></a></h4>
<p>Returns the p-value of <code>value</code> given the data from <code>array</code>. <code>sides</code> is
an integer value 1 or 2 denoting a one or two sided z-test. If <code>sides</code>
is not specified the test defaults to a two sided z-test. <code>flag===true</code>
denotes the use of the sample standard deviation.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.ztest"><code>zTest(zscore, sides)</code></a></h4>
<p>Returns the p-value of <code>value</code> given the data from <code>array</code>. <code>sides</code> is
an integer value 1 or 2 denoting a one or two sided z-test. If <code>sides</code>
is not specified the test defaults to a two sided z-test. <code>flag===true</code>
denotes the use of the sample standard deviation.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.tscore"><code>tScore(value, mean, sd, n)</code></a></h4>
<p>Returns the t-score of <code>value</code> given the data from <code>array</code>.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.tscore"><code>tScore(value, array)</code></a></h4>
<p>Returns the t-score of <code>value</code> given the data from <code>array</code>.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.ttest"><code>tTest(value, mean, sd, n, sides)</code></a></h4>
<p>Returns the p-value of <code>value</code> given the data in <code>array</code>.
<code>sides</code> is an integer value 1 or 2 denoting a one or two sided
t-test. If <code>sides</code> is not specified the test defaults to a two
sided t-test.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.ttest"><code>tTest(tscore, n, sides)</code></a></h4>
<p>Returns the p-value of <code>value</code> given the data in <code>array</code>.
<code>sides</code> is an integer value 1 or 2 denoting a one or two sided
t-test. If <code>sides</code> is not specified the test defaults to a two
sided t-test.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.ttest"><code>tTest(value, array, sides)</code></a></h4>
<p>Returns the p-value of <code>value</code> given the data in <code>array</code>.
<code>sides</code> is an integer value 1 or 2 denoting a one or two sided
t-test. If <code>sides</code> is not specified the test defaults to a two
sided t-test.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.anovafscore"><code>anovaFScore(array1, ..., arrayN)</code></a></h4>
<p>Returns the f-score of an ANOVA on the arrays.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.anovaftest"><code>anovaFTest(array1, ..., arrayN)</code></a></h4>
<p>Returns the p-value of the f-statistic from the ANOVA
test on the arrays.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.ftest"><code>ftest(fscore, df1, df2)</code></a></h4>
<p>Returns the p-value for the <code>fscore</code> f-score with a <code>df1</code> numerator degrees
of freedom and a <code>df2</code> denominator degrees of freedom.</p>
<h3>Confidence intervals</h3>
<h4><a href="http://jstat.github.io/all.html#jStat.normalci"><code>normalci(value, alpha, sd, n)</code></a></h4>
<p>Returns a 1-alpha confidence interval for <code>value</code> given
a normal distribution in the data from <code>array</code>.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.normalci"><code>normalci(value, alpha, array)</code></a></h4>
<p>Returns a 1-alpha confidence interval for <code>value</code> given
a normal distribution in the data from <code>array</code>.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.tci"><code>tci(value, alpha, sd, n)</code></a></h4>
<p>Returns a 1-alpha confidence interval for <code>value</code> given
the data from <code>array</code>.</p>
<h4><a href="http://jstat.github.io/all.html#jStat.tci"><code>tci(value, alpha, array)</code></a></h4>
<p>Returns a 1-alpha confidence interval for <code>value</code> given
the data from <code>array</code>.</p>
<h3>Special functions</h3>
<h4><a href="http://jstat.github.io/all.html#betafn"><code>betafn(x, y)</code></a></h4>
<p>Evaluates the Beta function at <code>(x,y)</code>.</p>
<h4><a href="http://jstat.github.io/all.html#betaln"><code>betaln(x, y)</code></a></h4>
<p>Evaluates the log Beta function at <code>(x,y)</code>.</p>
<h4><a href="http://jstat.github.io/all.html#betacf"><code>betacf(x, a, b)</code></a></h4>
<p>Returns the continued fraction for the incomplete Beta function with parameters a and b modified by Lentz's method evaluated at <code>x</code>.</p>
<h4><a href="http://jstat.github.io/all.html#ibetainv"><code>ibetainv(p, a, b)</code></a></h4>
<p>Returns the inverse of the incomplete Beta function evaluated at <code>(p,a,b)</code>.</p>
<h4><a href="http://jstat.github.io/all.html#ibeta"><code>ibeta(x, a, b)</code></a></h4>
<p>Returns the incomplete Beta function evaluated at <code>(x,a,b)</code>.</p>
<h4><a href="http://jstat.github.io/all.html#gammaln"><code>gammaln(x)</code></a></h4>
<p>Returns the Log-Gamma function evaluated at <code>x</code>.</p>
<h4><a href="http://jstat.github.io/all.html#gammafn"><code>gammafn(x)</code></a></h4>
<p>Returns the Gamma function evaluated at <code>x</code>. This is sometimes called the 'complete' gamma function.</p>
<h4><a href="http://jstat.github.io/all.html#gammap"><code>gammap(a, x)</code></a></h4>
<p>Returns the lower incomplete gamma function evaluated at <code>(a,x)</code>.
This function is usually written with a lower case greek gamma character, and is one of the two <a href="http://mathworld.wolfram.com/IncompleteGammaFunction.html">incomplete gamma functions</a>.</p>
<h4><a href="http://jstat.github.io/all.html#factorialln"><code>factorialln(n)</code></a></h4>
<p>Returns the natural log factorial of <code>n</code>.</p>
<h4><a href="http://jstat.github.io/all.html#factorial"><code>factorial(n)</code></a></h4>
<p>Returns the factorial of <code>n</code>.</p>
<h4><a href="http://jstat.github.io/all.html#combination"><code>combination(n, m)</code></a></h4>
<p>Returns the number of combinations of <code>n</code>, <code>m</code>.</p>
<h4><a href="http://jstat.github.io/all.html#permutation"><code>permutation(permutation)</code></a></h4>
<p>Returns the number of permutations of <code>n</code>, <code>m</code>.</p>
<h4><a href="http://jstat.github.io/all.html#gammapinv"><code>gammapinv(p, a)</code></a></h4>
<p>Returns the inverse of the lower regularized incomplete Gamma function evaluated at <code>(p,a)</code>.
This function is the inverse of lowerRegularizedGamma(x, a).</p>
<h4><a href="http://jstat.github.io/all.html#erf"><code>erf(x)</code></a></h4>
<p>Returns the error function evaluated at <code>x</code>.</p>
<h4><a href="http://jstat.github.io/all.html#erfc"><code>erfc(x)</code></a></h4>
<p>Returns the complementary error function evaluated at <code>x</code>.</p>
<h4><a href="http://jstat.github.io/all.html#erfcinv"><code>erfcinv(p)</code></a></h4>
<p>Returns the inverse of the complementary error function evaluated at <code>p</code>.</p>
<h4><a href="http://jstat.github.io/all.html#randn"><code>randn(n, m)</code></a></h4>
<p>Returns a normal deviate (mean 0 and standard deviation 1).</p>
<h4><a href="http://jstat.github.io/all.html#randg"><code>randg(shape, n, m)</code></a></h4>
<p>Returns a Gamma deviate by the method of Marsaglia and Tsang.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>JSXGraph extension for Numbas</title>
        <link href="https://somethingorotherwhatever.com/items/jsxgraph-extension-for-numbas"/>
        <id>https://somethingorotherwhatever.com/items/jsxgraph-extension-for-numbas</id>
        <updated>2019-02-25T12:36:06Z</updated>
        <summary type="html"><![CDATA[<p>This extension for Numbas adds the ability to generate diagrams using <a href="https://jsxgraph.org">JSXGraph</a>.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/jsxgraph-extension-for-numbas/main.png" />
                
                
                    <h1>JSXGraph extension for <a href="https://www.numbas.org.uk/">Numbas</a></h1>
<p>This extension provides the <a href="https://jsxgraph.org">JSXGraph</a> library and functions to create diagrams inside a Numbas question.</p>
<h2>Examples</h2>
<p>The <a href="https://numbas.mathcentre.ac.uk/exam/652/jsxgraph-demo/preview/">JSXGraph demo exam</a> contains a collection of questions demonstrating different techniques to do with JSXGraph.</p>
<h2>Creating a diagram</h2>
<p>The preferred method to create a diagram is one of the <code>jsxgraph</code> or <code>jessiecode</code> functions. These produce a value with the type <code>jsxgraphboard</code>, which can be inserted into content areas by substitution with curly braces.</p>
<p>You should create the board in a question variable, so that its state can be saved and restored in case the student leaves and resumes their attempt.</p>
<h2>Linking a diagram to marking and part inputs</h2>
<p>The <code>jxg_</code> functions described below can be used to access properties of a JSXGraph diagram inside a part's marking algorithm.</p>
<p>To link a part's input field to a JSXGraph diagram, you must describe how the link will work in each direction: from the input to the diagram, and vice versa.
This is achieved by defining two notes in the part's marking algorithm, <code>jxg_input</code> and <code>jxg_output</code>.</p>
<h3><code>jxg_input</code></h3>
<p>The <code>jxg_input</code> note describes how to take input from the student and modify the JSXGraph diagram.
It is a list of operations to perform.
Since this is a marking note, all the other notes and variables in the algorithm are available.</p>
<p>The available operations are as follows:</p>
<h4><code>jxg_set_position(object,position)</code></h4>
<p>Set the position of <code>object</code> to the given <code>position</code>, which should be a 2D vector.</p>
<h4><code>jxg_show(object,visible)</code></h4>
<p>If <code>visible = true</code>, then show <code>object</code>, otherwise hide it.</p>
<h4><code>jxg_set(object,property,arguments)</code></h4>
<p>Call the JSXGraph <code>set&lt;property&gt;</code> on the given object, with the given arguments.</p>
<p>For example, <code>jxg_set(c, "radius", 5)</code> calls the JSXGraph method <code>c.setRadius(5)</code>.</p>
<h4><code>jxg_set_attribute(object,attributes)</code></h4>
<p><code>attributes</code> should be a dictionary mapping attribute names to values.</p>
<p>This calls the JSXGraph method <code>setAttribute</code> on the given object.</p>
<h3><code>jxg_output</code></h3>
<p>The <code>jxg_output</code> note describes how to take the state of the diagram to fill in the part's input field.</p>
<p>The note should return a value of the same type as the marking algorithm's <code>studentAnswer</code> variable.
For example, for a "number entry" part this note should produce a string, representing what the student should write.</p>
<h2>JME functions</h2>
<h3><code>jsxgraph(width, height, [boundingBox], objects, [options])</code></h3>
<p>Create a JSXGraph board.</p>
<ul>
<li><code>width: number</code> - the displayed width in pixels of the board.</li>
<li><code>height: number</code> - the displayed height in pixels of the board.</li>
<li><code>boundingBox: [number, number, number, number]</code> - an optional list of four numbers defining the bounding box of the diagram, in the format <code>[x1,y1,x2,y2]</code>. The first point is mappted to the top-left of the board, and the second point to the bottom-right.</li>
<li><code>objects: list or dict</code> - a list of object definitions, or a dictionary mapping object names to definitions.</li>
<li><code>options: dict</code> - a dictionary of options for the board. See <a href="https://jsxgraph.uni-bayreuth.de/docs/symbols/JXG.JSXGraph.html#.initBoard">the documentation for JSXGraph.initBoard</a></li>
</ul>
<p>An object definition is a list in the format <code>[type, parents, attribute]</code>.</p>
<ul>
<li><code>type: string</code> - the type of object to create. Available types are listed in <a href="https://jsxgraph.uni-bayreuth.de/docs/">the 'Elements' section of the JSXGraph' documentation</a>.</li>
<li><code>parents: list</code> - a list of 'parent' values for the object. The format of this list depends on the type of the object being created. Any values of data type <code>expression</code> are replaced with functions which take a single parameter.</li>
<li><code>attributes: dict</code> - an optional dictionary of attributes for the object. The available attributes dpeend on the type of the object.</li>
<li><code>events: dict</code> - an optional dictionary of events produced by the object to react to. Each event name should correspond to a string of JessieCode.</li>
</ul>
<p>JSXGraph will often interpret string values in the <code>parents</code> list as JavaScript expressions. You can refer to other objects by name.
Alternately, you can provide JME <code>expression</code> values to evaluate expressions in terms of JME variables and functions. JSXGraph objects are not available in these expressions, and they're quite a bit slower than JavaScript.</p>
<h4>Example</h4>
<p>This creates a board with a line and a glider point on that line:</p>
<p><code>jsxgraph(
    500,500,
    [
        "l": ['line', [[0,1], [1,2]]],
        "p": ['glider', ['l']]
    ]
)</code></p>
<p>This creates a board with a polar plot of the function <code>r(phi) = sin(5phi)</code> centred at the origin:</p>
<p><code>jsxgraph(
    500,500,
    [
        ['curve', [expression('sin(5phi)'),[0,0],0,2pi], ["curveType": "polar"]]
    ]
)</code></p>
<h3><code>jessiecode(width, height, [boundingBox], script, [options])</code></h3>
<p>Create a JSXGraph board defined by a JessieCode script.</p>
<p>JessieCode is a languaged designed for efficiently creating diagrams in JSXGraph. 
There is <a href="https://jsxgraph.org/wp/docs_jessiecode/">some documentation about JessieCode syntax</a>. The available object types and their construction options are the same as in the <a href="https://jsxgraph.org/docs/">JavaScript API</a>.</p>
<ul>
<li><code>width: number</code> - the displayed width in pixels of the board.</li>
<li><code>height: number</code> - the displayed height in pixels of the board.</li>
<li><code>boundingBox: [number, number, number, number]</code> - an optional list of four numbers defining the bounding box of the diagram, in the format <code>[x1,y1,x2,y2]</code>. The first point is mappted to the top-left of the board, and the second point to the bottom-right.</li>
<li><code>script: string</code> - a JessieCode script defining the objects in the board. </li>
<li><code>options: dict</code> - a dictionary of options for the board. See <a href="https://jsxgraph.uni-bayreuth.de/docs/symbols/JXG.JSXGraph.html#.initBoard">the documentation for JSXGraph.initBoard</a></li>
</ul>
<h4>Example</h4>
<p>This creates a board with two points and a dashed line between them, and no background grid or axes:</p>
<p>```
jessiecode(
    500,500,
    """
        A = point(0,1);
        B = point(4,0);</p>
<pre><code>    line(A,B) &lt;&lt; dash: 4 &gt;&gt;;
""",
[
    "axis": false
]
</code></pre>
<p>)
```</p>
<h3><code>jxg_add_objects(board, objects)</code></h3>
<p>Add a list of objects to the given board.</p>
<p>The format for <code>objects</code> is the same as in the <code>jsxgraph()</code> function. Use this to add extra objects to a board - if you want to produce several similar boards, you might define a function which produces a generic board and then use this to add extra objects.</p>
<h3><code>jxg_run_jessiecode(board, code)</code></h3>
<p>Run a JessieCode script, given as a string, on the given board. You could use this to add objects, or modify some aspect of the board.</p>
<h3><code>board[name]</code></h3>
<p>Boards created by the <code>jsxgraph</code> and <code>jessiecode</code> functions work like dictionaries: the keys are the IDs of objects in the board.</p>
<p>JSXGraph assigns automatic IDs to objects, but these aren't predictable, so if you want to access an object later you have to explicitly set its <code>id</code> attribute.</p>
<p>For example, <code>board["A"]</code> gets the object with the ID <code>"A"</code>.</p>
<p>To access properties of an object in a board, use one of the <code>jxg_</code> functions.</p>
<p>The following is a brief description of what the <code>jxg_</code> functions do. Refer to the JSXGraph documentation for more information.</p>
<h3><code>jxg_angle(object)</code></h3>
<p>Defined only on lines.</p>
<p>Returns the angle between the line and the x-axis.</p>
<h3><code>jxg_area(object)</code></h3>
<p>Defined only on circles and polygons.</p>
<p>Returns the area of the object.</p>
<h3><code>jxg_attribute(object,key)</code></h3>
<p>Get the value of an arbitrary attribute of an object.</p>
<p>Example: <code>jxg_attribute(board["A"],"size")</code></p>
<h3><code>jxg_bounding_box(object)</code></h3>
<p>Defined only on polygons.</p>
<p>Returns the coordinates of the smallest box containing the polygon, as a list of four numbers <code>[minX,minY,maxX,maxY]</code>.</p>
<h3><code>jxg_bounds(object)</code></h3>
<p>Returns the coordinates of the smallest box containing the polygon, as a list of four numbers <code>[minX,minY,maxX,maxY]</code>.</p>
<h3><code>jxg_distance(a,b)</code></h3>
<p>Defined only on points, text and images.</p>
<p>Returns the distance between two points.</p>
<h3><code>jxg_has_point(object,x,y)</code> or <code>jxg_has_point(object,position)</code></h3>
<p>Returns <code>true</code> if the point with the given coordinates is contained in <code>object</code>.</p>
<p>You can either give the coordinates as two separate numbers, or as a 2D vector.</p>
<h3><code>jxg_has_point_sector(object,x,y)</code></h3>
<p>Defined only on arcs and sectors.</p>
<p>Returns <code>true</code> if the point with coordinates <code>(x,y)</code> is contained in the sector defined by <code>object</code>.</p>
<h3><code>jxg_length(object)</code></h3>
<p>Defined only on lines.</p>
<p>Returns the length of the line.</p>
<h3><code>jxg_max_x(object)</code></h3>
<p>Defined only on circles, curves, lines and turtle graphics.</p>
<p>Treating the object as a parametric curve, returns the maximum value of the parameter.</p>
<h3><code>jxg_min_x(object)</code></h3>
<p>Defined only on circles, curves, lines and turtle graphics.</p>
<p>Treating the object as a parametric curve, returns the maximum value of the parameter.</p>
<h3><code>jxg_name(object)</code></h3>
<p>Returns the name of the object.</p>
<h3><code>jxg_parents(object)</code></h3>
<p>Returns a list of the IDs of the object's parents.</p>
<h3><code>jxg_perimeter(object)</code></h3>
<p>Defined only on polygons.</p>
<p>Returns the length of the object's perimeter.</p>
<h3><code>jxg_position(object)</code></h3>
<p>Returns the object's position as a vector.</p>
<h3><code>jxg_position_at(object,t)</code></h3>
<p>Defined only on circles, curves, lines and turtle graphics.</p>
<p>Returns the coordinates of the point at parameter <code>t</code> on the object, as a vector.</p>
<h3><code>jxg_radius(object)</code></h3>
<p>Defined only on arcs, sectors and circles.</p>
<p>Returns the radius of the object.</p>
<h3><code>jxg_rise(object)</code></h3>
<p>Defined only on lines.</p>
<p>Returns the y-coordinate at which the line crosses the y-axis.</p>
<h3><code>jxg_size(object)</code></h3>
<p>Defined only on text objects.</p>
<p>Returns the size of the text.</p>
<h3><code>jxg_slope(object)</code></h3>
<p>Defined only on lines.</p>
<p>Returns the gradient of the line, or <code>infinity</code> if it is parallel to the y-axis.</p>
<h3><code>jxg_type(object)</code></h3>
<p>Returns the type of the object as a string.</p>
<h3><code>jxg_value(object)</code></h3>
<p>The returned value depends on the type of the object:</p>
<ul>
<li><code>angle</code> - the angle, as a number in radians.</li>
<li><code>arc</code> - the length of the arc, as a number.</li>
<li><code>input</code> - the content of the input element, as a string.</li>
<li><code>slider</code> - the value the slider is currently set to, as a number.</li>
<li><code>checkbox</code> - whether the checkbox is ticked, as a boolean.</li>
<li><code>tapemeasure</code> - the length of the tape measure.</li>
<li><code>integral</code> - the value of the integral.</li>
<li><code>riemannsum</code> - the sum of the rectangles.</li>
</ul>
<h3><code>jxg_width(object)</code></h3>
<p>Defined only on images.</p>
<p>Returns the width of the image, as a number.</p>
<h2>JavaScript functions</h2>
<p>All JavaScript functions are properties of the object <code>Numbas.extensions.jsxgraph</code>.</p>
<h3><code>makeBoardPromise(width, height, options)</code></h3>
<p>Make a JSXGraph board with the given dimensions and options, and attach it to a <code>&lt;div&gt;</code> element.
The board is only initialised once the container element has been attached to the page.</p>
<p>An object of the format <code>{element, promise}</code> is returned. 
The <code>element</code> is a container <code>&lt;div&gt;</code> element that the board will be created under.
The <code>promise</code> resolves to the JSXGraph Board object once the container has been attached to the page and the board initialised.</p>
<p>The <code>options</code> object is passed to <code>JSXGraph.initBoard</code>, with some defaults applied.
The default options are:</p>
<p><code>{
    boundingBox:[-5,5,5,-5],
    showCopyright:false, 
    showNavigation:false, 
    axis:true
}</code></p>
<h4>Example</h4>
<p>This creates a board with the default options and a single point at the coordinates (1,2).</p>
<p><code>var result = Numbas.extensions.jsxgraph.makeBoardPromise(500,500);
result.promise.then(function(board) {
    board.create('point',[1,2]);
});
return result.element;</code></p>
<h3><code>makeBoard(width, height, options)</code></h3>
<p>Make a JSXGraph board with the given dimensions and options, and attach it to a <code>&lt;div&gt;</code> element.
The div element is returned. The JSXGraph board object is available as <code>div.board</code>.</p>
<p>The <code>options</code> object is passed to <code>JSXGraph.initBoard</code>, with some defaults applied.
The default options are the same as for <code>makeBoardPromise</code>.</p>
<p><strong>Note</strong>: This function initialises the board immediately, and is kept for backwards compatibility.
It's better to wait until the container element is attached to the page, using <code>makeBoardPromise</code>.</p>
<h4>Example</h4>
<p>This creates a board with the default options and a single point at the coordinates (1,2).</p>
<p><code>var div = Numbas.extensions.jsxgraph.makeBoard(500,500);
div.board.create('point',[1,2]);
return div;</code></p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Glass Sudoku</title>
        <link href="https://somethingorotherwhatever.com/items/glass-sudoku"/>
        <id>https://somethingorotherwhatever.com/items/glass-sudoku</id>
        <updated>2019-02-11T08:26:37.279000Z</updated>
        <summary type="html"><![CDATA[<p>Following the paper "the paramagnetic and glass transitions in sudoku"</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <video autoplay src="https://somethingorotherwhatever.com/items/glass-sudoku/main.mp4"></video>
                
                
                    <p>Following the paper "the paramagnetic and glass transitions in sudoku"</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Zeckendorf cup arithmetic</title>
        <link href="https://somethingorotherwhatever.com/items/zeckendorf-cup-arithmetic"/>
        <id>https://somethingorotherwhatever.com/items/zeckendorf-cup-arithmetic</id>
        <updated>2018-11-19T09:39:51Z</updated>
        <summary type="html"><![CDATA[<p>My 5-minute talk at the big MathsJam conference this weekend was about some stacking cups that my daughter is too young to appreciate. Here’s the really quick version, in just over a minute: …</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/zeckendorf-cup-arithmetic/main.jpg" />
                
                
                    <p>My 5-minute talk at the big MathsJam conference this weekend was about some stacking cups that my daughter is too young to appreciate. Here’s the really quick version, in just over a minute: …</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>MathsJam countdown</title>
        <link href="https://somethingorotherwhatever.com/items/mathsjam-countdown"/>
        <id>https://somethingorotherwhatever.com/items/mathsjam-countdown</id>
        <updated>2018-11-18T09:18:53.638000Z</updated>
        <summary type="html"><![CDATA[<p>A five-minute timer for MathsJam Gathering talks.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/mathsjam-countdown/main.png" />
                
                
                    <p>A five-minute timer for MathsJam Gathering talks.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Distance to postcodes</title>
        <link href="https://somethingorotherwhatever.com/items/distance-to-postcodes"/>
        <id>https://somethingorotherwhatever.com/items/distance-to-postcodes</id>
        <updated>2018-11-14T10:14:02Z</updated>
        <summary type="html"><![CDATA[<p>Calculates the straight-line distances from a source postcode to a list of other postcodes. Made in response to someone at a university asking how many of their students they could expect to travel in for a day event.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/distance-to-postcodes/main.png" />
                
                
                    <p>Find the distance between a 'home' postcode and a list of other postcodes.</p>
<p>Uses data from https://www.getthedata.com/open-postcode-geo</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>MathsJam retweeter</title>
        <link href="https://somethingorotherwhatever.com/items/mathsjam-retweeter"/>
        <id>https://somethingorotherwhatever.com/items/mathsjam-retweeter</id>
        <updated>2018-11-01T10:04:43Z</updated>
        <summary type="html"><![CDATA[<p>MathsJam Retweeter bot code</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                
                    <h1>MathsJam Retweeter</h1>
<p>This repository contains Python code that makes the <a href="https://twitter.com/mathsjam">@MathsJam</a> Twitter account
automatically retweet local MathsJams on the day of and the day before events.</p>
<h2>Running this code</h2>
<p>Before running this code, you will need to:</p>
<ol>
<li>Make a copy of <code>config.py.template</code> called <code>config.py</code> and fill in the Twitter API keys for the MathsJam account.</li>
<li>Install the required Python libraries by running
<code>bash
pip install -r requirements.txt</code></li>
</ol>
<p>Once you've done this you can run the code using:
<code>bash
python tweet.py</code></p>
<p>If you want to test the code without actually sending and tweets, you can do this using:
<code>bash
python tweet.py test</code></p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Truchet polygons</title>
        <link href="https://somethingorotherwhatever.com/items/truchet-polygons"/>
        <id>https://somethingorotherwhatever.com/items/truchet-polygons</id>
        <updated>2018-10-26T15:14:46Z</updated>
        <summary type="html"><![CDATA[<p>Each tile is a regular polygon with an even number of sides. The vertices are painted in alternating colours. The tiles are lined up so that the colours on every edge match.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <video autoplay src="https://somethingorotherwhatever.com/items/truchet-polygons/main.mp4"></video>
                
                
                    <h1>Truchet polygons</h1>
<p>Truchet tiles are square tiles with quarter-circles on opposite vertices. When you put several tiles together, the circles line up. You can extend the idea to any even-sided regular polygon.</p>
<p>There are, as far as I know, only four tilings of the plane with even-sided regular polygons.</p>
<p>This was inspired by Colin Beveridge's article in Chalkdust magazine, <a href="http://chalkdustmagazine.com/features/too-good-to-be-truchet/">Too Good to be Truchet</a>. I haven't actually read the article yet, only the title...</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Spontaneous Venning</title>
        <link href="https://somethingorotherwhatever.com/items/spontaneous-venning"/>
        <id>https://somethingorotherwhatever.com/items/spontaneous-venning</id>
        <updated>2018-10-17T09:16:13.457000Z</updated>
        <summary type="html"><![CDATA[<p>An attempt to simulate people spontaneously forming a Venn diagram</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <video autoplay src="https://somethingorotherwhatever.com/items/spontaneous-venning/main.mp4"></video>
                
                
                    <p>An attempt to simulate people spontaneously forming a Venn diagram</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Categorised Esoterica</title>
        <link href="https://somethingorotherwhatever.com/items/categorised-esoterica"/>
        <id>https://somethingorotherwhatever.com/items/categorised-esoterica</id>
        <updated>2018-10-12T14:41:17.434000Z</updated>
        <summary type="html"><![CDATA[<p>A tool I made to help quickly categorise all the things in my <a href="https://read.somethingorotherwhatever.com/">Interesting Esoterica</a> collection.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                
                    <p>A tool I made to help quickly categorise all the things in my <a href="https://read.somethingorotherwhatever.com/">Interesting Esoterica</a> collection.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>This matrix joke is only barely worth your time</title>
        <link href="https://somethingorotherwhatever.com/items/this-matrix-joke-is-only-barely-worth-your-time"/>
        <id>https://somethingorotherwhatever.com/items/this-matrix-joke-is-only-barely-worth-your-time</id>
        <updated>2018-10-01T08:33:38Z</updated>
        <summary type="html"><![CDATA[<p>If you see me doing a maths thing, I’m probably wearing one of my maths t-shirts. I’ve got quite a few, but the one that reliably produces the much-sought-after look of total indifferen…</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/this-matrix-joke-is-only-barely-worth-your-time/main.png" />
                
                
                    <p>If you see me doing a maths thing, I’m probably wearing one of my maths t-shirts. I’ve got quite a few, but the one that reliably produces the much-sought-after look of total indifferen…</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Unit fractions are all you need</title>
        <link href="https://somethingorotherwhatever.com/items/unit-fractions-are-all-you-need"/>
        <id>https://somethingorotherwhatever.com/items/unit-fractions-are-all-you-need</id>
        <updated>2018-09-20T08:18:02.491000Z</updated>
        <summary type="html"><![CDATA[<p>Every rational number can be written as the sum of unit fractions</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/unit-fractions-are-all-you-need/main.png" />
                
                
                    <p>Every rational number can be written as the sum of unit fractions</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Reciprocals</title>
        <link href="https://somethingorotherwhatever.com/items/reciprocals"/>
        <id>https://somethingorotherwhatever.com/items/reciprocals</id>
        <updated>2018-09-15T12:39:04.856000Z</updated>
        <summary type="html"><![CDATA[<p>A never-ending list of reciprocals</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <video autoplay src="https://somethingorotherwhatever.com/items/reciprocals/main.mp4"></video>
                
                
                    <p>A never-ending list of reciprocals</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Factorisation list</title>
        <link href="https://somethingorotherwhatever.com/items/factorisation-list"/>
        <id>https://somethingorotherwhatever.com/items/factorisation-list</id>
        <updated>2018-09-15T06:44:32.434000Z</updated>
        <summary type="html"><![CDATA[<p>A never-ending list of factorisations of the natural numbers.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <video autoplay src="https://somethingorotherwhatever.com/items/factorisation-list/main.mp4"></video>
                
                
                    <p>A never-ending list of factorisations of the natural numbers.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>A big countdown</title>
        <link href="https://somethingorotherwhatever.com/items/a-big-countdown"/>
        <id>https://somethingorotherwhatever.com/items/a-big-countdown</id>
        <updated>2018-08-29T06:09:59.699000Z</updated>
        <summary type="html"><![CDATA[<p>Shows a big timer counting down from 10 minutes.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/a-big-countdown/main.png" />
                
                
                    <p>Shows a big timer counting down from 10 minutes.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>A big clock</title>
        <link href="https://somethingorotherwhatever.com/items/a-big-clock"/>
        <id>https://somethingorotherwhatever.com/items/a-big-clock</id>
        <updated>2018-08-28T08:18:58.970000Z</updated>
        <summary type="html"><![CDATA[<p>A page showing a big HH:MM:SS time display and nothing else</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/a-big-clock/main.png" />
                
                
                    <p>A page showing a big HH:MM:SS time display and nothing else</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Chemistry extension for Numbas</title>
        <link href="https://somethingorotherwhatever.com/items/chemistry-extension-for-numbas"/>
        <id>https://somethingorotherwhatever.com/items/chemistry-extension-for-numbas</id>
        <updated>2018-08-16T09:24:05Z</updated>
        <summary type="html"><![CDATA[<p>Data and functions to help with calculations in chemistry</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                
                    <h1>Chemistry extension for Numbas</h1>
<p>Provides data and functions to make calculations in chemistry easier.</p>
<p>Functions and data are being added as needed.</p>
<p>This has been written by a non-chemist, in collaboration with some non-coding chemists.</p>
<h2>JME functions</h2>
<h3><code>atom(symbol, [mass number])</code> or <code>atom(atomic number, [mass number])</code></h3>
<p>Construct an atom of the element with the given symbol or atomic number.
Give <code>mass number</code> to specify a particular isotope.</p>
<p><strong>Example:</strong></p>
<ul>
<li><code>atom("Na")</code></li>
<li><code>atom("Na",19)</code></li>
<li><code>atom(11)</code></li>
</ul>
<h3><code>name(atom)</code></h3>
<p>The IUPAC name of the atom, with the mass number appended if it's a particular isotope.</p>
<p><strong>Examples:</strong></p>
<ul>
<li><code>name(atom("Na"))</code> → <code>"sodium"</code></li>
<li><code>name(atom("Na",19))</code> → <code>"sodium-19"</code></li>
</ul>
<h3><code>symbol(atom)</code></h3>
<p>The symbol of the atom.</p>
<p><strong>Example:</strong></p>
<ul>
<li><code>symbol(atom(11))</code> → <code>"Na"</code></li>
</ul>
<h3><code>string(atom)</code></h3>
<p>A plaintext string representation of the atom. For isotopes, the mass number is shown in superscript.</p>
<p><strong>Example:</strong></p>
<ul>
<li><code>string(atom("Na",19))</code> → <code>"¹⁹Na"</code></li>
</ul>
<h3><code>atom[property]</code></h3>
<p>Get the given property of the atom, from the <code>periodic_table_data</code> or <code>isotope_data</code> dictionaries.</p>
<p><strong>Examples:</strong></p>
<ul>
<li><code>atom("Na")["electronegativity"]</code> → <code>0.93</code></li>
<li><code>atom("C",13)["Isotopic Composition"]</code> → <code>"0.0107(8)"</code></li>
</ul>
<h3><code>atomic_number(atom)</code></h3>
<p>The atomic number of the atom.</p>
<p><strong>Example:</strong></p>
<ul>
<li><code>atomic_number(atom("C"))</code> → <code>6</code></li>
</ul>
<h3><code>mass_number(atom)</code></h3>
<p>The mass number of the given atom. If no isotope is specified, the most abundant isotope is used.</p>
<p><strong>Example:</strong></p>
<ul>
<li><code>mass_number(atom("Na"))</code> → <code>23</code></li>
</ul>
<h3><code>neutrons(atom)</code></h3>
<p>The number of neutrons in the atom Equivalent to <code>mass_number(atom) - atomic_number(atom)</code>.</p>
<p><strong>Example:</strong></p>
<ul>
<li><code>neutrons(atom("Na"))</code> → <code>12</code></li>
</ul>
<h3><code>relative_mass(atom)</code></h3>
<p>The relative atomic mass of the atom. If no isotope is specified, the standard atomic weight is used.</p>
<p><strong>Example:</strong></p>
<ul>
<li><code>relative_mass(atom("C"))</code> → <code>12.0107</code></li>
</ul>
<h3><code>isotopes(atom)</code></h3>
<p>List the mass number of known isotopes of the element.</p>
<p><strong>Example:</strong></p>
<ul>
<li><code>isotopes(atom("H"))</code> → <code>[ 1, 2, 3, 4, 5, 6, 7 ]</code></li>
</ul>
<h3><code>abundance(atom)</code></h3>
<p>Abundance of the given isotope. If no isotope specified, returns <code>1</code>.</p>
<p><strong>Example:</strong></p>
<ul>
<li><code>abundance(atom("C",13))</code> → <code>0.0107</code></li>
</ul>
<h3><code>formula(string)</code></h3>
<p>Construct a compound from the given formula.</p>
<p><strong>Examples:</strong></p>
<ul>
<li><code>formula("H2O")</code></li>
<li><code>formula("C(CH3)4")</code></li>
<li><code>formula("2(N2)")</code></li>
</ul>
<h3><code>string(formula)</code></h3>
<p>A plain text display representation of the given formula.</p>
<p><strong>Example:</strong></p>
<ul>
<li><code>string(formula("H2O"))</code> → <code>"H₂O"</code></li>
</ul>
<h3><code>plain_string(formula)</code></h3>
<p>A plain text display representation of the given formula.</p>
<p><strong>Example:</strong></p>
<ul>
<li><code>string(formula("H2O"))</code> → <code>"H₂O"</code></li>
</ul>
<h3><code>atom_counts(formula)</code></h3>
<p>Returns a dictionary containing the number of atoms of each element present in the compound.</p>
<p><strong>Example:</strong> </p>
<ul>
<li><code>atom_counts(formula("C(CH3)4"))</code> → <code>[ "C": 5, "H": 12 ]</code></li>
</ul>
<h3><code>mass(formula)</code></h3>
<p>The relative atomic mass of the compound specified by the formula.</p>
<p><strong>Example:</strong></p>
<ul>
<li><code>mass(formula("C(CH3)4"))</code> → <code>72.14878</code></li>
</ul>
<h3><code>thermodynamic_data(name,state)</code></h3>
<p>Returns data from the <code>thermodynamic_data</code> dictionary for the chemical with the given name or symbol, in the given state.
Common values of <code>state</code> are <code>"g"</code> (gas), <code>"l"</code> (liquid), "c" (crystalline), or <code>"amorphous"</code>. Some other states are also listed; see <code>thermodynamic_data</code>.</p>
<h2>Data</h2>
<p>Some data sets are available as variables.</p>
<h3><code>periodic_table</code></h3>
<p>Based on <a href="https://github.com/andrejewski/periodic-table">https://github.com/andrejewski/periodic-table</a>, which is itself based on <a href="https://web.archive.org/web/20161203095654/http://php.scripts.psu.edu/djh300/cmpsc221/p3s11-pt-data.htm">https://web.archive.org/web/20161203095654/http://php.scripts.psu.edu/djh300/cmpsc221/p3s11-pt-data.htm</a>.</p>
<p>A list of dictionaries providing data on elements in the periodic table.
<code>periodic_table[n]</code> give data for the element with atomic number <code>n</code>.</p>
<p>Each dictionary has the following keys:</p>
<ul>
<li><code>atomicNumber</code></li>
<li><code>symbol</code></li>
<li><code>name</code></li>
<li><code>atomicMass</code> - Standard atomic weight, with precision (e.g. "1.00794(4)")</li>
<li><code>cpkHexColor</code> - Hex representation of the element's <a href="https://en.wikipedia.org/wiki/CPK_coloring">CPK colour</a></li>
<li><code>electronicConfiguration</code> - <a href="https://en.wikipedia.org/wiki/Electron_configuration">Electron configuration</a></li>
<li><code>electronegativity</code> - Pauling electronegativity</li>
<li><code>atomicRadius</code> - Atomic radius in pm</li>
<li><code>ionRadius</code> - Ion radius in pm</li>
<li><code>vanDerWaalsRadius</code> - van der Waals radius in pm</li>
<li><code>ionizationEnergy</code> - IE<sup>-1</sup> in kJ/mol</li>
<li><code>electronAffinity</code> - EA in kJ/mol</li>
<li><code>oxidationStates</code> - Oxidation states</li>
<li><code>standardState</code> - Standard state, one of <code>"gas"</code>, <code>"solid"</code>, <code>"liquid"</code> or <code>""</code></li>
<li><code>bondingType</code> - Bonding type, one of <code>"diatomic"</code>, <code>"atomic"</code>, <code>"metallic"</code>, <code>"covalent network"</code> or <code>""</code></li>
<li><code>meltingPoint</code> - Melting point in K</li>
<li><code>boilingPoint</code> - Boiling point in K</li>
<li><code>density</code> - Density in g/mL</li>
<li><code>groupBlock</code> - Group, one of <code>"nonmetal"</code>, <code>"noble gas"</code>, <code>"alkali metal"</code>, <code>"alkaline earth metal"</code>, <code>"metalloid"</code>, <code>"halogen"</code>, <code>"metal"</code>, <code>"transition metal"</code>, <code>"lanthanoid"</code>, <code>"actinoid"</code>, <code>"post-transition metal"</code></li>
<li><code>yearDiscovered</code></li>
</ul>
<h3><code>isotope_data</code></h3>
<p>Based on <a href="https://www.nist.gov/pml/atomic-weights-and-isotopic-compositions-relative-atomic-masses">https://www.nist.gov/pml/atomic-weights-and-isotopic-compositions-relative-atomic-masses</a></p>
<p>Data on properties of isotopes. A dictionary of the form <code>{atomic_number: {mass_number: data}}</code>.</p>
<p>Each dictionary has the following keys:</p>
<ul>
<li><code>"Isotopic Composition"</code> - Abundance of this isotope as a proportion between 0 and 1, with precision (e.g. <code>"0.524(1)"</code>)</li>
<li><code>"Notes"</code> - See the <a href="https://www.nist.gov/pml/atomic-weights-and-isotopic-compositions-column-descriptions#notes">NIST column description</a></li>
<li><code>"Standard Atomic Weight"</code> - Standard atomic weight of the element, with precision</li>
<li><code>"Atomic Number"</code></li>
<li><code>"Atomic Symbol"</code></li>
<li><code>"Relative Atomic Mass"</code> - Relative atomic mass of this isotope</li>
<li><code>"Mass Number</code></li>
</ul>
<h3><code>thermodynamic_data</code></h3>
<p>Based on Newcastle University's thermodynamic data card.</p>
<p>Data on thermodynamic properties of some chemicals in different states. Most easily accessed with <code>thermodynamic_data(name,state)</code>.</p>
<p>A list of dictionaries with the following keys:</p>
<ul>
<li><code>"name"</code></li>
<li><code>"formula"</code></li>
<li><code>"state"</code> </li>
<li><code>"Hfg"</code> - Enthalpy of formation, in kJ/mol</li>
<li><code>"Gfg"</code> - Gibbs free energy, in kJ/mol</li>
<li><code>"Smg"</code> - Entropy, in J/mol/K</li>
<li><code>"Cpm"</code> - Specific heat capacity, in J/mol/K</li>
</ul>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>The People Shuffler</title>
        <link href="https://somethingorotherwhatever.com/items/the-people-shuffler"/>
        <id>https://somethingorotherwhatever.com/items/the-people-shuffler</id>
        <updated>2018-08-10T15:19:58.507000Z</updated>
        <summary type="html"><![CDATA[<p>A tool to decide who goes first: everyone loads this on their phone, and presses the screen at the same time. The phones will all ping at different times. A knock-off of an app I saw someone use. Contains a QR code so everyone else can load it easily.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/the-people-shuffler/main.png" />
                
                
                    <p>A tool to decide who goes first: everyone loads this on their phone, and presses the screen at the same time. The phones will all ping at different times. A knock-off of an app I saw someone use. Contains a QR code so everyone else can load it easily.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Quantities extension for Numbas</title>
        <link href="https://somethingorotherwhatever.com/items/quantities-extension-for-numbas"/>
        <id>https://somethingorotherwhatever.com/items/quantities-extension-for-numbas</id>
        <updated>2018-07-25T08:58:33Z</updated>
        <summary type="html"><![CDATA[<p>A Numbas extension providing functions to handle amounts with units</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                
                    <h1>Quantities extension for Numbas</h1>
<p>This extension wraps the <a href="https://github.com/gentooboontoo/js-quantities">js-quantities</a> library to provide a "quantity with units" data type to Numbas.</p>
<p>It provides a <code>quantity</code> data type, which represents a scalar <em>amount</em> and a list of <em>units</em>.</p>
<p><strong>A note about precision:</strong> Amounts are represented with JavaScript floating-point numbers, which are only precise to around 30 decimal places. 
It's our intention to add support for more precise number representations to Numbas; when that happens, this extension could be updated to use that.</p>
<h2>JME functions</h2>
<h3><code>quantity([number], units)</code> or <code>qty([number], units)</code></h3>
<p>Create a quantity with the given units. If the number is not given, the returned quantity represents 1 of the given units.
Use <code>*</code> and <code>/</code> to combine units, and <code>^</code> for powers of units.
An empty <code>units</code> string will produce a unitless quantity.</p>
<p><strong>Examples:</strong></p>
<ul>
<li><code>quantity("kg")</code></li>
<li><code>qty("kg")</code></li>
<li><code>quantity(1.2, "kg")</code></li>
<li><code>quantity("kg*m/s^2")</code></li>
<li><code>quantity("1/s")</code></li>
<li><code>quantity("kg*m^-2")</code></li>
</ul>
<h3><code>units_of_kind(kind)</code></h3>
<p>Returns a list of <a href="#recognised-units">recognised units</a> of the given kind.</p>
<p><strong>Example:</strong></p>
<ul>
<li><code>units_of_kind("length")</code> → <code>[ "angstrom", "AU", "datamile", "fathom", "foot", "furlong", "inch", "league", "light-minute", "light-second", "light-year", "meter", "mil", "mile", "naut-mile", "parsec", "pica", "point", "redshift", "rod", "yard", "m" ]</code></li>
</ul>
<h3><code>aliases(unit)</code></h3>
<p>Returns a list of accepted names for the given unit.</p>
<p><strong>Example:</strong></p>
<ul>
<li><code>aliases("meter")</code> → <code>[ "m", "meter", "meters", "metre", "metres" ]</code></li>
</ul>
<h3><code>compatible(q1, q2)</code></h3>
<p>Are the two given quantities compatible? That is, are they of the same kindm, so one can be converted to the other?</p>
<p><strong>Examples:</strong></p>
<ul>
<li><code>compatible(qty("m"), qty("ft"))</code> → <code>true</code></li>
<li><code>compatible(qty("m"), qty("kg"))</code> → <code>false</code></li>
</ul>
<h3><code>kind(quantity)</code></h3>
<p>What <a href="#recognised-units">kind of unit</a> is <code>quantity</code> measured in? 
Returns a string code corresponding to the kind.
For combinations of units that don't correspond to a built-in kind, an empty string is returned.</p>
<p><strong>Examples:</strong></p>
<ul>
<li><code>kind(qty("m"))</code> → <code>"length"</code></li>
<li><code>kind(qty("N*s"))</code> → <code>"momentum"</code></li>
<li><code>kind(qty("W/s"))</code> → <code>""</code></li>
</ul>
<h3><code>unitless(quantity)</code></h3>
<p>Does the given quantity have no associated units?
Note that a <em>dimensionless</em> quantity is <strong>not necessarily</strong> unitless - for example, a quantity measured in meters per foot has no dimension but is not unitless.</p>
<ul>
<li><code>unitless(qty(1,""))</code> → <code>true</code></li>
<li><code>unitless(qty(1,"m"))</code> → <code>false</code></li>
<li><code>unitless(qty(1,"m/ft"))</code> → <code>false</code></li>
</ul>
<h3><code>isbase(quantity)</code></h3>
<p>Is the given quantity in base units, as defined in the International System of Units (SI)?</p>
<p><strong>Examples:</strong></p>
<ul>
<li><code>isbase(qty("kg"))</code> → <code>true</code></li>
<li><code>isbase(qty("lb"))</code> → <code>false</code></li>
</ul>
<h3><code>tobase(quantity)</code></h3>
<p>Convert the given quantity to base SI units.</p>
<p><strong>Example</strong>:</p>
<ul>
<li><code>tobase(qty(1, "inch"))</code> → <code>quantity(0.0254, "m")</code></li>
</ul>
<h3><code>q_from in units</code> or <code>q_from in q_to</code></h3>
<p>Convert quantity <code>q_from</code> to the units specified by the given string, or the same units as <code>q_to</code>.
If the desired units are not compatible with <code>q_from</code>, an error is thrown.</p>
<p><strong>Examples</strong>:</p>
<ul>
<li><code>qty(1.5, "m") in "cm"</code> → <code>quantity(150, "cm")</code></li>
<li><code>qty(100,"g") in qty("kg")</code> → <code>quantity(0.1, "kg")</code></li>
</ul>
<h3><code>as_si(quantity)</code></h3>
<p>Convert quantity to SI units.</p>
<p><strong>Example:</strong></p>
<ul>
<li><code>as_si(quantity(1, "lb*ft"))</code> → <code>quantity(0.1382549544, "m*kg")</code></li>
</ul>
<h3><code>inverse(quantity)</code></h3>
<p>Return the reciprocal of the given quantity.</p>
<p><strong>Example:</strong></p>
<ul>
<li><code>inverse(qty(2, "m/s"))</code> → <code>quantity(0.5, "s/m")</code></li>
</ul>
<h3><code>same(a, b)</code></h3>
<p>Are <code>a</code> and <code>b</code> both exactly the same quantity, measured in the same units?</p>
<p><strong>Examples:</strong></p>
<ul>
<li><code>same(qty(1, "m"), qty(100, "cm"))</code> → <code>false</code></li>
<li><code>same(qty(1, "m"), qty(2, "m"))</code> → <code>false</code></li>
<li><code>same(qty(1, "m"), qty(1, "m"))</code> → <code>true</code></li>
</ul>
<h3><code>a &lt; b</code>, <code>a &lt;= b</code>, <code>a &gt; b</code>, <code>a &gt;= b</code></h3>
<p>Compare quantities <code>a</code> and <code>b</code>. If their units are not compatible, an error is thrown.</p>
<p><strong>Examples:</strong></p>
<ul>
<li><code>qty(1, "cm") &lt; qty(1, "m")</code> → <code>true</code></li>
<li><code>qty(4, "feet") &gt; qty(1, "m")</code> → <code>true</code></li>
<li><code>qty(1, "cm") &gt; qty(1, "cm")</code> → <code>false</code></li>
<li><code>qty(1, "cm") &gt;= qty(1, "cm")</code> → <code>true</code></li>
</ul>
<h3><code>a = b</code></h3>
<p>Quantities <code>a</code> and <code>b</code> are equal if their units are compatible and they represent exactly the same amount.</p>
<p><strong>Examples:</strong></p>
<ul>
<li><code>qty(2.54, "cm") = qty(1, "inch")</code> → <code>true</code></li>
<li><code>qty(1, "cm") = qty(1, "second")</code> → <code>false</code></li>
</ul>
<h3><code>a + b</code>, <code>a - b</code>, <code>a * b</code>, <code>a / b</code></h3>
<p>Arithmetic on units is supported. When adding or subtracting units, the result is given in the same units as the left-hand argument, and if the two quantities being combined are in incompatible units an error is thrown.
When multiplying or dividing, units are not automatically converted to their common names. For example, The division of a quantity in <code>Newtons</code> by a quantity in <code>m^2</code> returns a quantity in <code>N/m^2</code>, not in <code>Pa</code>.</p>
<p><strong>Examples:</strong></p>
<ul>
<li><code>qty(1, "cm") + qty(1, "m")</code> → <code>quantity(101, "cm")</code></li>
<li><code>qty(100, "cm") - qty(1, "m")</code> → <code>quantity(0, "cm")</code></li>
<li><code>qty(100, "cm") * qty(1, "s")</code> → <code>quantity(100, "cm*s")</code></li>
<li><code>qty(100, "N") / qty(4, "m^2")</code> → <code>quantity(25, "N/m^2")</code></li>
</ul>
<h3><code>-q</code></h3>
<p>The negative of the given quantity.</p>
<p><strong>Example:</strong></p>
<ul>
<li><code>-qty(1,"N")</code> → <code>quantity(-1, "N")</code></li>
</ul>
<h3><code>n * quantity</code> or <code>quantity * n</code></h3>
<p>Multiply a quantity by a scalar.</p>
<p><strong>Example:</strong></p>
<ul>
<li><code>5 * quantity(6, "g")</code> → <code>quantity(30, "g")</code></li>
</ul>
<h3><code>round(quantity, precision)</code></h3>
<p>Round <code>quantity</code> to the nearest multiple of <code>precision</code>, given either as a string in the form <code>"amount units"</code>, or another quantity.
If precision is not given, the quantity is rounded to the nearest whole unit.</p>
<p><strong>Examples:</strong></p>
<ul>
<li><code>round(qty(123, "cm"), "1 m")</code> → <code>quantity(100, "cm")</code></li>
<li><code>round(qty(0.1697, "m"), qty(5, "cm"))</code> → <code>quantity(0.15, "m")</code></li>
<li><code>round(qty(6.32, "kg"))</code> → <code>quantity(6, "kg")</code></li>
</ul>
<h3><code>precround(quantity,dp)</code></h3>
<p>Round <code>quantity</code> to <code>dp</code> decimal places. </p>
<p><strong>Example:</strong></p>
<ul>
<li><code>precround(qty(123.456,"cm"), 1)</code> → <code>quantity(123.5, "cm")</code></li>
</ul>
<h3><code>siground(quantity,sf)</code></h3>
<p>Round <code>quantity</code> to <code>sf</code> significant figures. </p>
<p><strong>Example:</strong></p>
<ul>
<li><code>siground(qty(123.456,"cm"), 1)</code> → <code>quantity(100, "cm")</code></li>
</ul>
<h3><code>abs(quantity)</code></h3>
<p>The absolute value of the quantity.</p>
<p><strong>Example:</strong></p>
<ul>
<li><code>abs(qty(-5, "N"))</code> → <code>quantity(5, "N")</code></li>
</ul>
<h3><code>scalar(quantity)</code></h3>
<p>The scalar amount of the quantity, as a number - in other words, strip off the units information.</p>
<p><strong>Example:</strong></p>
<ul>
<li><code>scalar(qty(53, "s"))</code> → <code>53</code></li>
</ul>
<h3><code>sign(quantity)</code></h3>
<p>Returns 1 if the quantity is positive, -1 if it's negative, and 0 otherwise.</p>
<p><strong>Examples:</strong></p>
<ul>
<li><code>sign(qty(20,"kg"))</code> → <code>1</code></li>
<li><code>sign(qty(-10,"kg"))</code> → <code>-1</code></li>
<li><code>sign(qty(0,"kg"))</code> → <code>0</code></li>
</ul>
<h3><code>string(quantity, [notation style])</code></h3>
<p>A string representing the given quantity, in the given <a href="https://docs.numbas.org.uk/en/latest/number-notation.html#styles-of-notation">notational style</a> (plain English is the default)
The units are presented using "nice" characters: a dot for multiplication, and exponents are displayed in superscript.</p>
<p><strong>Examples:</strong></p>
<ul>
<li><code>string(qty(23, "kg*s^-1"))</code> → <code>"23 kg/s"</code></li>
<li><code>string(qty(1000.235, "kg*m^2"), "si-fr")</code> → <code>"1 000,235 kg⋅m²"</code></li>
</ul>
<h3><code>plain_string(quantity, [notation style])</code></h3>
<p>A string representing the given quantity, in the given <a href="https://docs.numbas.org.uk/en/latest/number-notation.html#styles-of-notation">notational style</a> (plain English is the default).
The units are given in a form that is easy to type: <code>*</code> is used for multiplication, and <code>^</code> marks an exponent.</p>
<p><strong>Examples:</strong></p>
<ul>
<li><code>plain_string(qty(23, "kg/s"))</code> → <code>"23 kg/s"</code></li>
<li><code>plain_string(qty(1000.235, "kg*m^2"), "si-fr")</code> → <code>"1 000,235 kg*m^2"</code></li>
</ul>
<h3><code>units_numerator(quantity)</code> and <code>units_denominator(quantity)</code></h3>
<p>The units of a quantity can be written as a fraction whose numerator and denominator both consist of a list of units.
When a squared or cubed unit is used, the base unit is repeated.
These functions return the lists of units in the numerator and denominator, respectively, for a given quantity.
Any order-of-magnitude prefixes are included as separate items in the list</p>
<p><strong>Examples:</strong></p>
<ul>
<li><code>units_numerator(qty(1, "m"))</code> → <code>[ "meter" ]</code></li>
<li><code>units_denominator(qty(1, "m"))</code> → <code>[ "1" ]</code></li>
<li><code>units_numerator(qty(1, "kg*cm^2/s^2"))</code> → <code>[ "kilogram", "centi", "meter", "centi", "meter" ]</code></li>
<li><code>units_denominator(qty(1, "m^2/s^2"))</code> → <code>[ "second", "second" ]</code></li>
</ul>
<h3><code>units(quantity)</code></h3>
<p>Return a quantity representing one unit of the same kind as the given quantity.</p>
<p><strong>Example:</strong></p>
<ul>
<li><code>units(qty(23, "m^2/s"))</code> → <code>quantity(1, "m^2/s")</code></li>
</ul>
<h3><code>units_string(quantity)</code></h3>
<p>Return a string describing the units of the given quantity, suitable for display. Powers are displayed in superscript, and <strong>⋅</strong> is used for multiplication.
The units are presented using "nice" characters: a dot for multiplication, and exponents are displayed in superscript.</p>
<p><strong>Example:</strong></p>
<ul>
<li><code>units_string(qty("kg*cm^2/s^2"))</code> → <code>"kg⋅cm²/s²"</code></li>
</ul>
<h3><code>plain_units_string(quantity)</code></h3>
<p>Return a string describing the units of the given quantity, suitable for display. Powers are displayed in superscript, and <strong>⋅</strong> is used for multiplication.
The units are given in a form that is easy to type: <code>*</code> is used for multiplication, and <code>^</code> marks an exponent.</p>
<p><strong>Example:</strong></p>
<ul>
<li><code>plain_units_string(qty("kg*cm^2/s^2"))</code> → <code>"kg*cm^2/s^2"</code></li>
</ul>
<h3><code>quantity_kinds</code></h3>
<p>A constant list of all the recognised kinds of units.</p>
<h2>JavaScript functions</h2>
<p>See the <a href="https://github.com/gentooboontoo/js-quantities">documentation for js-quantities</a> for detail on its JavaScript API.</p>
<p>The <code>Qty</code> object is available globally when this extension is loaded.</p>
<p>In addition, the following functions are defined under the <code>Numbas.extensions.quantities</code> namespace:</p>
<h3><code>precround(q,dp)</code></h3>
<p>Round the quantity <code>q</code> to <code>dp</code> decimal places. See <a href="http://numbas.github.io/Numbas/Numbas.math.html#.precround">Numbas.math.precround</a></p>
<h3><code>siground(q,sf)</code></h3>
<p>Round the quantity <code>q</code> to <code>sf</code> significant figures. See <a href="http://numbas.github.io/Numbas/Numbas.math.html#.siground">Numbas.math.siground</a></p>
<h2><a name="recognised-units">Recognised units</a></h2>
<p>The following unit names are recognised. Units of the same kind can be converted between each other.
The <a href="#prefixes">prefixes</a> can be written to the left of any other unit, to change the order of magnitude.</p>
<h3>acceleration</h3>
<ul>
<li>gee</li>
</ul>
<h3>activity</h3>
<ul>
<li>Katal, kat, katal</li>
<li>U, enzUnit, unit</li>
</ul>
<h3>angle</h3>
<ul>
<li>rad, radian, radians</li>
<li>deg, degree, degrees</li>
<li>gon, grad, gradian, grads</li>
<li>rotation</li>
</ul>
<h3>angular velocity</h3>
<ul>
<li>rpm</li>
</ul>
<h3>area</h3>
<ul>
<li>hectare</li>
<li>acre, acres</li>
<li>sqft</li>
</ul>
<h3>capacitance</h3>
<ul>
<li>F, Farad, farad</li>
</ul>
<h3>charge</h3>
<ul>
<li>C, Coulomb, coulomb</li>
<li>Ah</li>
</ul>
<h3>concentration</h3>
<ul>
<li>M, molar</li>
<li>wt%, wtpercent</li>
</ul>
<h3>conductance</h3>
<ul>
<li>S, Siemens, siemens</li>
</ul>
<h3>counting</h3>
<ul>
<li>cell, cells</li>
<li>each</li>
<li>count</li>
<li>base-pair, bp</li>
<li>nt, nucleotide</li>
<li>molecule, molecules</li>
</ul>
<h3>currency</h3>
<ul>
<li>USD, dollar</li>
<li>cents</li>
</ul>
<h3>current</h3>
<ul>
<li>A, Ampere, amp, ampere, amps</li>
</ul>
<h3>energy</h3>
<ul>
<li>J, Joule, joule, joules</li>
<li>erg, ergs</li>
<li>BTU, BTUs, btu</li>
<li>cal, calorie, calories</li>
<li>Cal, Calorie, Calories</li>
<li>Therm, th, therm, therm-US, therms</li>
<li>Wh</li>
</ul>
<h3>force</h3>
<ul>
<li>N, Newton, newton</li>
<li>dyn, dyne</li>
<li>lbf, pound-force</li>
</ul>
<h3>frequency</h3>
<ul>
<li>Hertz, Hz, hertz</li>
</ul>
<h3>illuminance</h3>
<ul>
<li>lux</li>
</ul>
<h3>inductance</h3>
<ul>
<li>H, Henry, henry</li>
</ul>
<h3>information</h3>
<ul>
<li>B, byte, bytes</li>
<li>b, bit, bits</li>
</ul>
<h3>information rate</h3>
<ul>
<li>Bps</li>
<li>bps</li>
</ul>
<h3>length</h3>
<ul>
<li>m, meter, meters, metre, metres</li>
<li>", in, inch, inches</li>
<li>', feet, foot, ft</li>
<li>yard, yards, yd</li>
<li>mi, mile, miles</li>
<li>naut-mile, nmi</li>
<li>league, leagues</li>
<li>furlong, furlongs</li>
<li>rd, rod, rods</li>
<li>mil, mils</li>
<li>ang, angstrom, angstroms</li>
<li>fathom, fathoms</li>
<li>pica, picas</li>
<li>point, points, pt</li>
<li>red-shift, redshift, z</li>
<li>AU, astronomical-unit</li>
<li>light-second, ls</li>
<li>light-minute, lmin</li>
<li>light-year, ly</li>
<li>parsec, parsecs, pc</li>
<li>DM, datamile</li>
</ul>
<h3>logarithmic</h3>
<ul>
<li>dB, decibel, decibels</li>
</ul>
<h3>luminosity</h3>
<ul>
<li>candela, cd</li>
</ul>
<h3>luminous power</h3>
<ul>
<li>lm, lumen</li>
</ul>
<h3>magnetism</h3>
<ul>
<li>Wb, weber, webers</li>
<li>T, tesla, teslas</li>
<li>G, gauss</li>
<li>Mx, maxwell, maxwells</li>
<li>Oe, oersted, oersteds</li>
</ul>
<h3>mass</h3>
<ul>
<li>kg, kilogram, kilograms</li>
<li>AMU, amu, u</li>
<li>Da, Dalton, Daltons, dalton, daltons</li>
<li>slug, slugs</li>
<li>short-ton, tn, ton</li>
<li>metric-ton, tonne</li>
<li>carat, carats, ct</li>
<li>
<h1>, lb, lbs, pound, pounds</h1>
</li>
<li>ounce, ounces, oz</li>
<li>g, gram, gramme, grammes, grams</li>
<li>gr, grain, grains</li>
<li>dr, dram, drams</li>
<li>st, stone, stones</li>
</ul>
<h3>potential</h3>
<ul>
<li>V, Volt, volt, volts</li>
</ul>
<h3>power</h3>
<ul>
<li>W, watt, watts</li>
<li>VA, volt-ampere</li>
<li>VAR, VAr, Var, var, volt-ampere-reactive</li>
<li>horsepower, hp</li>
</ul>
<h3><a name="prefixes">prefix</a></h3>
<ul>
<li>googol</li>
<li>Ki, Kibi, kibi</li>
<li>Mebi, Mi, mebi</li>
<li>Gi, Gibi, gibi</li>
<li>Tebi, Ti, tebi</li>
<li>Pebi, Pi, pebi</li>
<li>Ei, Exi, exi</li>
<li>Zebi, Zi, zebi</li>
<li>Yebi, Yi, yebi</li>
<li>Y, Yotta, yotta</li>
<li>Z, Zetta, zetta</li>
<li>E, Exa, exa</li>
<li>P, Peta, peta</li>
<li>T, Tera, tera</li>
<li>G, Giga, giga</li>
<li>M, Mega, mega</li>
<li>k, kilo</li>
<li>Hecto, h, hecto</li>
<li>Deca, da, deca, deka</li>
<li>Deci, d, deci</li>
<li>Centi, c, centi</li>
<li>Milli, m, milli</li>
<li>Micro, mc, micro, u, µ, μ</li>
<li>Nano, n, nano</li>
<li>Pico, p, pico</li>
<li>Femto, f, femto</li>
<li>Atto, a, atto</li>
<li>Zepto, z, zepto</li>
<li>Yocto, y, yocto</li>
</ul>
<h3>prefix only</h3>
<ul>
<li>doz, dozen, dz</li>
<li>%, percent</li>
<li>ppm</li>
<li>ppt</li>
<li>gr, gross</li>
</ul>
<h3>pressure</h3>
<ul>
<li>Pa, Pascal, pascal</li>
<li>bar, bars</li>
<li>mmHg</li>
<li>inHg</li>
<li>torr</li>
<li>ATM, atm, atmosphere, atmospheres</li>
<li>psi</li>
<li>cmH2O, cmh2o</li>
<li>inH2O, inh2o</li>
</ul>
<h3>radiation</h3>
<ul>
<li>Gy, gray, grays</li>
<li>R, roentgen</li>
<li>Sv, sievert, sieverts</li>
<li>Bq, becquerel, becquerels</li>
<li>Ci, curie, curies</li>
</ul>
<h3>rate</h3>
<ul>
<li>cpm</li>
<li>dpm</li>
<li>bpm</li>
</ul>
<h3>resistance</h3>
<ul>
<li>Ohm, ohm, Ω, Ω</li>
</ul>
<h3>resolution</h3>
<ul>
<li>dot, dots</li>
<li>pixel, px</li>
<li>ppi</li>
</ul>
<h3>solid angle</h3>
<ul>
<li>sr, steradian, steradians</li>
</ul>
<h3>speed</h3>
<ul>
<li>kph</li>
<li>mph</li>
<li>kn, knot, knots, kt, kts</li>
<li>fps</li>
</ul>
<h3>substance</h3>
<ul>
<li>mol, mole</li>
</ul>
<h3>temperature</h3>
<ul>
<li>degK, kelvin</li>
<li>celsius, celsius, centigrade, degC</li>
<li>degF, fahrenheit</li>
<li>degR, rankine</li>
<li>temp-K, tempK</li>
<li>temp-C, tempC</li>
<li>temp-F, tempF</li>
<li>temp-R, tempR</li>
</ul>
<h3>time</h3>
<ul>
<li>s, sec, second, seconds, secs</li>
<li>min, mins, minute, minutes</li>
<li>h, hour, hours, hr, hrs</li>
<li>d, day, days</li>
<li>week, weeks, wk</li>
<li>fortnight, fortnights</li>
<li>annum, y, year, years, yr</li>
<li>decade, decades</li>
<li>centuries, century</li>
</ul>
<h3>typography</h3>
<ul>
<li>dpi</li>
</ul>
<h3>viscosity</h3>
<ul>
<li>P, poise</li>
<li>St, stokes</li>
</ul>
<h3>volume</h3>
<ul>
<li>L, l, liter, liters, litre, litres</li>
<li>gal, gallon, gallons</li>
<li>qt, quart, quarts</li>
<li>pint, pints, pt</li>
<li>cu, cup, cups</li>
<li>floz, fluid-ounce, fluid-ounces</li>
<li>tablespoon, tablespoons, tb, tbs, tbsp</li>
<li>teaspoon, teaspoons, tsp</li>
<li>bsh, bu, bushel, bushels</li>
</ul>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Random statistically plausible people</title>
        <link href="https://somethingorotherwhatever.com/items/random-statistically-plausible-people"/>
        <id>https://somethingorotherwhatever.com/items/random-statistically-plausible-people</id>
        <updated>2018-07-24T12:23:13.909000Z</updated>
        <summary type="html"><![CDATA[<p>Randomly generate the names of statistically plausible people</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/random-statistically-plausible-people/main.png" />
                
                
                    <p>Randomly generate the names of statistically plausible people</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Divisibility diagrams</title>
        <link href="https://somethingorotherwhatever.com/items/divisibility-diagrams"/>
        <id>https://somethingorotherwhatever.com/items/divisibility-diagrams</id>
        <updated>2018-07-09T08:11:17.858000Z</updated>
        <summary type="html"><![CDATA[<p>Show a diagram to compute divisibility by any number</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/divisibility-diagrams/main.png" />
                
                
                    <p>Show a diagram to compute divisibility by any number</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>The Big Internet Math-Off</title>
        <link href="https://somethingorotherwhatever.com/items/the-big-internet-math-off"/>
        <id>https://somethingorotherwhatever.com/items/the-big-internet-math-off</id>
        <updated>2018-06-23T23:00:00Z</updated>
        <summary type="html"><![CDATA[<p>A competition to find The World's Most Interesting Mathematician. It's really a way of tricking people into telling me fun maths.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/the-big-internet-math-off/main.png" />
                
                
                    <p>A competition to find The World's Most Interesting Mathematician. It's really a way of tricking people into telling me fun maths.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Get the Average Right</title>
        <link href="https://somethingorotherwhatever.com/items/get-the-average-right"/>
        <id>https://somethingorotherwhatever.com/items/get-the-average-right</id>
        <updated>2018-06-17T07:07:41.376000Z</updated>
        <summary type="html"><![CDATA[<p>I think the gist of the game would be that in each round, everyone guesses a number, and at the end the closest guess to the average of everyone's guesses wins. It didn't really work.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/get-the-average-right/main.png" />
                
                
                    <p>I think the gist of the game would be that in each round, everyone guesses a number, and at the end the closest guess to the average of everyone's guesses wins. It didn't really work.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Spinny squares</title>
        <link href="https://somethingorotherwhatever.com/items/spinny-squares"/>
        <id>https://somethingorotherwhatever.com/items/spinny-squares</id>
        <updated>2018-06-15T13:23:50.913000Z</updated>
        <summary type="html"><![CDATA[<p>Spinny squares</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <video autoplay src="https://somethingorotherwhatever.com/items/spinny-squares/main.mp4"></video>
                
                
                    <p>Spinny squares</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>I can name your polynomial</title>
        <link href="https://somethingorotherwhatever.com/items/i-can-name-your-polynomial"/>
        <id>https://somethingorotherwhatever.com/items/i-can-name-your-polynomial</id>
        <updated>2018-05-23T10:02:23Z</updated>
        <summary type="html"><![CDATA[<p>I can name your polynomial</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/i-can-name-your-polynomial/main.png" />
                
                
                    <p>Based on a trick I saw David Bedford perform.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Polar fractions</title>
        <link href="https://somethingorotherwhatever.com/items/polar-fractions"/>
        <id>https://somethingorotherwhatever.com/items/polar-fractions</id>
        <updated>2018-05-15T08:15:23Z</updated>
        <summary type="html"><![CDATA[<p>Show every fraction in the range [0,1] on a polar plot, using the Calkin-Wilf sequence</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <video autoplay src="https://somethingorotherwhatever.com/items/polar-fractions/main.mp4"></video>
                
                
                    <p>Show every fraction in the range [0,1] on a polar plot, using <a href="https://en.wikipedia.org/wiki/Calkin%E2%80%93Wilf_tree#Breadth_first_traversal">the Calkin-Wilf sequence</a>.</p>
<p>Inspired by <a href="https://mathstodon.xyz/@birdman/100002434085349582">@birdman@mathstodon.xyz's toot</a>.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>The incredible palindromic hat-trick</title>
        <link href="https://somethingorotherwhatever.com/items/the-incredible-palindromic-hat-trick"/>
        <id>https://somethingorotherwhatever.com/items/the-incredible-palindromic-hat-trick</id>
        <updated>2018-04-29T15:21:04Z</updated>
        <summary type="html"><![CDATA[<p>Demonstrating the incredible fact that every integer can be written as the sum of 3 palindromes.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <video autoplay src="https://somethingorotherwhatever.com/items/the-incredible-palindromic-hat-trick/main.mp4"></video>
                
                
                    <p>Demonstrating the incredible fact that every integer can be written as the sum of 3 palindromes.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Stecklegram</title>
        <link href="https://somethingorotherwhatever.com/items/stecklegram"/>
        <id>https://somethingorotherwhatever.com/items/stecklegram</id>
        <updated>2018-04-22T23:00:00Z</updated>
        <summary type="html"><![CDATA[<p>A thing to help Katie Steckles decode the secret message in her birthday card.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/stecklegram/main.png" />
                
                
                    <p>A thing to help Katie Steckles decode the secret message in her birthday card.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>The never-ending sum</title>
        <link href="https://somethingorotherwhatever.com/items/the-never-ending-sum"/>
        <id>https://somethingorotherwhatever.com/items/the-never-ending-sum</id>
        <updated>2018-03-06T17:32:26Z</updated>
        <summary type="html"><![CDATA[<p>A never ending series of sums, where the answer from the last question is part of the next question.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <video autoplay src="https://somethingorotherwhatever.com/items/the-never-ending-sum/main.mp4"></video>
                
                
                    <p>A never ending series of sums, where the answer from the last question is part of the next question.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>time</title>
        <link href="https://somethingorotherwhatever.com/items/time"/>
        <id>https://somethingorotherwhatever.com/items/time</id>
        <updated>2018-02-19T20:43:52Z</updated>
        <summary type="html"><![CDATA[<p>I had an idea about a way of modelling intervals of time and doing arithmetic with them, prompted by the question of what 'one month from now' means. It didn't really work.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                
                    <p>I had an idea about a way of modelling intervals of time and doing arithmetic with them, prompted by the question of what 'one month from now' means. It didn't really work.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Dudeney puzzle 403</title>
        <link href="https://somethingorotherwhatever.com/items/dudeney-puzzle-403"/>
        <id>https://somethingorotherwhatever.com/items/dudeney-puzzle-403</id>
        <updated>2018-01-25T11:19:33Z</updated>
        <summary type="html"><![CDATA[<p>An interactive version of <a href="https://www.gutenberg.org/files/16713/16713-h/16713-h.htm#X_403_THE_SPANISH_DUNGEONa">Puzzle 403 from Henry Ernest Dudeney's <em>Amusements in Mathematics</em></a>.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/dudeney-puzzle-403/main.png" />
                
                
                    <p>An interactive version of <a href="https://www.gutenberg.org/files/16713/16713-h/16713-h.htm#X_403_THE_SPANISH_DUNGEONa">Puzzle 403 from Henry Ernest Dudeney's <em>Amusements in Mathematics</em></a>.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>asciimath2tex</title>
        <link href="https://somethingorotherwhatever.com/items/asciimath2tex"/>
        <id>https://somethingorotherwhatever.com/items/asciimath2tex</id>
        <updated>2017-12-13T10:58:53Z</updated>
        <summary type="html"><![CDATA[<p>JavaScript library to convert AsciiMath to TeX</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                
                    <h1>asciimath2tex</h1>
<p>JavaScript library to convert AsciiMath to TeX.</p>
<p>I wrote this so I could use KaTeX to render AsciiMath.</p>
<h2>Usage</h2>
<p>The library is written as an ECMAScript module but is also distributed as CommonJS and UMD modules.</p>
<p>The file <code>asciimath2tex.js</code> is an ES6 module which can be used in browsers that support it.</p>
<h3>In a browser</h3>
<p>If you can use ES6 modules, use <code>asciimath2tex.js</code> as-is:</p>
<p>```js
import AsciiMathParser from 'asciimath2tex';</p>
<p>const parser = new AsciiMathParser();
const tex = parser.parse("int_(i=1)^10 x^2/2 dx");
```</p>
<p><code>parser.parse</code> returns a string of TeX.</p>
<p>If you can't use ES6 modules, there is a UMD version.
You can load it from unpkg.com, or create it yourself.</p>
<h4>To load from unpkg</h4>
<p>```html</p>
<script src="https://unpkg.com/asciimath2tex@1.2.1/dist/asciimath2tex.umd.js"></script>
<p>```</p>
<h4>To create the file locally</h4>
<p>Clone this repository, and run:</p>
<p><code>npm install
npm run-script build</code></p>
<p>Copy the file <code>dist/asciimath2tex.umd.js</code> into your project.</p>
<h3>Node.js / CommonJS</h3>
<p>Install the package using npm:</p>
<p><code>npm install asciimath2tex</code></p>
<p>You can then load the package in your script:</p>
<p>```js
const AsciiMathParser = require('asciimath2tex');</p>
<p>const parser = new AsciiMathParser();
const tex = parser.parse("int_(i=1)^10 x^2/2 dx");
```</p>
<h2>Tests</h2>
<p>There are some unit tests in <code>test.html</code>, copied from <a href="https://github.com/asciimath/asciimathml/blob/master/test/unittests.js">the asciimath repository</a>. </p>
<p>All of the tests are rendered correctly by KaTeX, apart from <code>\twoheadrightarrowtail</code>, which it apparently doesn't support.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Circular lights out</title>
        <link href="https://somethingorotherwhatever.com/items/circular-lights-out"/>
        <id>https://somethingorotherwhatever.com/items/circular-lights-out</id>
        <updated>2017-12-09T16:35:59Z</updated>
        <summary type="html"><![CDATA[<p>A circular version of the Lights Out puzzle. The aim of the game is to turn all of the lights off. When there is an evenly-spaced sequence of bulbs all turned off or all turned on, you may switch them all on or off by clicking two consecutive lights in the sequence.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/circular-lights-out/main.png" />
                
                
                    <h1>circular-lights-out</h1>
<p>A one-dimensional "lights out" variant, played on a circle. You can toggle the state of a bulb, as long as you also toggle every d^th bulb after it, where d is a divisor of the total number of bulbs.</p>
<p>You start with one light turned on. Can you turn all the lights out?</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Lights modular out</title>
        <link href="https://somethingorotherwhatever.com/items/lights-modular-out"/>
        <id>https://somethingorotherwhatever.com/items/lights-modular-out</id>
        <updated>2017-11-29T08:44:26Z</updated>
        <summary type="html"><![CDATA[<p>A move in the classic Lights Out puzzle could be viewed as addition mod 2. This lets you set up a version of the puzzle where it's addition modulo something else.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/lights-modular-out/main.png" />
                
                
                    <h1>lights-modular-out</h1>
<p>A lights-out game, with N states instead of just 2.</p>
<p>The URL of the page always represents the state of the game, so you can link to a particular state by copying the URL.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Exploding dots counter</title>
        <link href="https://somethingorotherwhatever.com/items/exploding-dots-counter"/>
        <id>https://somethingorotherwhatever.com/items/exploding-dots-counter</id>
        <updated>2017-10-03T07:43:30Z</updated>
        <summary type="html"><![CDATA[<p>An animated counter showing the <a href="https://www.explodingdots.org/">Exploding Dots</a> 1 → 10 machine.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <video autoplay src="https://somethingorotherwhatever.com/items/exploding-dots-counter/main.mp4"></video>
                
                
                    <h1>Exploding Dots counter</h1>
<p><a href="http://gdaymath.com/courses/exploding-dots/">Exploding Dots</a> is James Tanton's thing.</p>
<p>It just keeps counting.</p>
<h2>Building</h2>
<p>I've used some ES2015 features, so to make it work in older browsers you need to use BabelJS.</p>
<p>Install babel with</p>
<p><code>npm install</code></p>
<p>and then run</p>
<p><code>babel thing.js -o thing.compiled.js</code></p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Random person extension for Numbas</title>
        <link href="https://somethingorotherwhatever.com/items/random-person-extension-for-numbas"/>
        <id>https://somethingorotherwhatever.com/items/random-person-extension-for-numbas</id>
        <updated>2017-07-13T14:12:54Z</updated>
        <summary type="html"><![CDATA[<p>A Numbas extension providing a collection of functions to generate random people, for use in word problems.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                
                    <h1>Random person extension for Numbas</h1>
<p>A <a href="http://www.numbas.org.uk">Numbas</a> extension providing a collection of functions to generate random people, for use in word problems.</p>
<p><strong>Demo: https://numbas.mathcentre.ac.uk/question/23094/the-random-person-extension/</strong></p>
<p>It doesn't really matter what people are called in word problems, but it can have a bad effect on students' perceptions of the world if the plumber's always called Gary and the nurse is always called Julie.</p>
<p>An easy fix is to flip a coin each time you need a name, and choose a male name if it's heads, and a female name if it's tails.</p>
<p>But names come with much more baggage than gender! Social class, age and cultural heritage are just a few of the things you can have a stab at guessing based on someone's name.</p>
<p>So, this extension makes it really easy to randomly pick a name for a representative citizen of England and Wales born between 1996 and 2015, using the ONS's dataset of baby name frequencies in England and Wales, 1996 to 2015.</p>
<p>Names which were given to more than 100 each of males and females are classed as gender-neutral.
Additionally, when picking names without specifiying a gender, occasionally a name that would be returned as "male" or "female" is instead returned as "neutral", representing a person who identified as non-binary.
The proportion of the time that this happens is controlled by the JavaScript variable <code>Numbas.extensions.random_person.PROB_NONBINARY</code>, which is 1/100 by default.</p>
<h2>Providing your own name data</h2>
<p>The extension contains some built-in JavaScript objects with the data for name frequencies, and pronouns associated with each gender.
You can replace these objects with your own data.</p>
<p>There are some other datasets in <code>Numbas.extensions.random_person.datasets</code>.</p>
<p>To switch to another dataset, put something like this in your question's Javascript preamble:</p>
<p><code>var random_person = Numbas.extensions.random_person;
random_person.data = random_person.datasets.fr;</code></p>
<p>The name frequencies are stored in an object at <code>Numbas.extensions.random_person.data</code>.</p>
<p>This object has the form:</p>
<p><code>{
    "names": { gender: list of objects {"name": string, "count": integer} },
    "totals": { gender: integer }
}</code></p>
<p>(<code>gender</code> stands for a key representing each gender. In the built-in data set, these are <code>"male"</code>, <code>"female"</code> and <code>"neutral"</code>.)</p>
<p>There is also an object giving pronouns for each gender, stored at <code>Numbas.extensions.random_person.pronouns</code>.</p>
<p>This object has the form:</p>
<p><code>{ gender: pronoun_map }</code></p>
<p>The built-in <code>pronoun_map</code> is an object mapping each of the strings <code>"they"</code>, <code>"their"</code>, <code>"theirs"</code>, <code>"them"</code>, <code>"themself"</code> to the corresponding pronouns for that gender.
Each of these keys is added to the object returned for a randomly-generated person, so if you are using a language other than English, you could provide a different set of keys.</p>
<h2>Ways this can be improved</h2>
<ul>
<li>Apart from names, what else should be randomised? Jobs?</li>
<li>Gender's a complicated topic, so I'm very open to suggestions for improvements in the way it's handled.</li>
<li>A function which populates the scope with variables for the pronouns, and verb conjugation, so you don't have to set them up yourself in each question. Or maybe functions like <code>they(person)</code>, equivalent to <code>person['pronouns']['they']</code>.</li>
</ul>
<h2>Copyright</h2>
<p>The name frequency data is Crown Copyright, reproduced under the <a href="http://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/">Open Government Licence</a>.</p>
<p>The rest of this package is released under the terms of the Apache License 2.0. See the <code>LICENSE</code> file for more information.</p>
<h2>The data structure</h2>
<p>The code returns dictionaries representing people, of the form</p>
<p><code>{
    "gender": string, //("male", "female", or "neutral" at the moment)
    "name": string,
    "pronouns": {
        "they": the subjective personal pronoun, e.g. 'he' or 'she',
        "their": the possessive determiner, e.g. 'his' or 'her',
        "theirs": the possessive pronoun, e.g. 'his' or 'hers',
        "them": the objective personal pronoun, e.g. 'him' or 'her',
        "themself": the reflexive pronoun, e.g. 'himself' or 'herself'
    }
}</code></p>
<h2>How to use this</h2>
<p>Generate a random person, or people, using the JME functions described below.. Each time you need to use their name, or a pronoun referring to them, use the corresponding entry from their dictionary, as described above.</p>
<p>Here's an example:</p>
<p>```
{person['name']} puts {person['pronouns']['their']} things where {person['pronouns']['they']} like{if(person['gender']='neutral','','s')}.</p>
<p>When people show things to {person['pronouns']['them']}, {person['pronouns']['they']} want{if(person['gender']='neutral','','s')} them for {person['pronouns']['themself']}.
```</p>
<p>The singular "they" is used for gender-neutral people. Don't forget that verb conjugation is different for singular "they": for example, "Charlie likes to read while they walk" compared to "Charlie likes to read while he walks".</p>
<p>If you've only got one person, it can be more convenient to set variables for 'they', 'their', etc. and for verb conjugation, so you don't have to type <code>person['pronouns']['their']</code> each time.</p>
<p>Here's that example again:</p>
<p>```
{name} put{s} {their} things where {they} like{s}.</p>
<p>When people show things to {them}, {they} want{s} them for {themself}.
```</p>
<p>If you need more than one person, use <code>random_people</code> to ensure that you don't have any repeated names, which could lead to confusion.</p>
<h2>JME functions</h2>
<h3><code>random_person()</code></h3>
<p>A person with random name and gender.</p>
<h3><code>random_person_with_gender(gender)</code></h3>
<p>A person with random name and the given gender.</p>
<h3><code>random_people(n)</code></h3>
<p><code>n</code> unique people with random names and genders. If you need more than one person in your question, use this to make sure that no names are repeated.</p>
<h3><code>random_people_with_gender(gender,n)</code></h3>
<p><code>n</code> unique people with random names and the given gender.</p>
<h3><code>random_person_with_initial(letter)</code></h3>
<p>A person with random name and gender, whose name starts with the given letter.</p>
<h3><code>random_people_with_different_initials(n)</code></h3>
<p><code>n</code> unique people with random names, whose names each start with distinct letters.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>The curious mathmo talks to David Roberts</title>
        <link href="https://somethingorotherwhatever.com/items/the-curious-mathmo-talks-to-david-roberts"/>
        <id>https://somethingorotherwhatever.com/items/the-curious-mathmo-talks-to-david-roberts</id>
        <updated>2017-06-23T17:15:01Z</updated>
        <summary type="html"><![CDATA[<p>Way back at the end of last year I put out a call to mathematicians I know: hop on Skype and chat to me for a while about the work you’re doing at the moment. The first person to answer was D…</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/the-curious-mathmo-talks-to-david-roberts/main.png" />
                
                
                    <p>Way back at the end of last year I put out a call to mathematicians I know: hop on Skype and chat to me for a while about the work you’re doing at the moment. The first person to answer was D…</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Some maths jokes</title>
        <link href="https://somethingorotherwhatever.com/items/some-maths-jokes"/>
        <id>https://somethingorotherwhatever.com/items/some-maths-jokes</id>
        <updated>2017-06-13T23:00:00Z</updated>
        <summary type="html"><![CDATA[<p>A collection of maths jokes and explanations of why they're funny.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/some-maths-jokes/main.png" />
                
                
                    <p>A collection of maths jokes and explanations of why they're funny.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Linear algebra extension for Numbas</title>
        <link href="https://somethingorotherwhatever.com/items/linear-algebra-extension-for-numbas"/>
        <id>https://somethingorotherwhatever.com/items/linear-algebra-extension-for-numbas</id>
        <updated>2017-05-25T11:29:51Z</updated>
        <summary type="html"><![CDATA[<p>A Numbas extension providing functions to work with linear algebra</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                
                    <h1>Linear algebra extension for Numbas</h1>
<p>This extension provides a few functions which make working with linear algebra easier.</p>
<p>The three kinds of permitted row operation are:</p>
<ul>
<li>Swap two rows.</li>
<li>Multiply a row by a scalar.</li>
<li>Subtract <code>k</code> times one row from another.</li>
</ul>
<p>This extension works with matrices over the rationals: before any operations are performed, the matrix's cells are converted to fractions.</p>
<h2>JME functions</h2>
<h3><code>row_echelon_form(matrix)</code></h3>
<p>Uses row operations to put the given matrix in row echelon form. A matrix is in row echelon form if the leading non-zero entry in each row is strictly to the right of the leading non-zero entries in all of the rows above.</p>
<h3><code>row_echelon_form_display(matrix)</code></h3>
<p>Returns a passage of HTML describing the steps involved in transforming the given matrix into row echelon form.</p>
<h3><code>row_echelon_form_display_determinant(matrix)</code></h3>
<p>Returns a passage of HTML describing the steps involved in transforming the given matrix into row echelon form, while describing how the determinant of the matrix changes at each step.</p>
<h3><code>is_row_echelon_form(matrix)</code></h3>
<p>Returns <code>true</code> if the matrix is in row echelon form.</p>
<h3><code>describe_why_row_echelon_form(matrix)</code></h3>
<p>Returns a string describing why the matrix is not in row echelon form, or "The matrix is in row echelon form." if it is.</p>
<h3><code>reduced_row_echelon_form(matrix)</code></h3>
<p>Uses row operations to put the given matrix in reduced row echelon form. A matrix in row echelon form is reduced if every leading non-zero entry is 1 and is the only non-zero entry in its column.</p>
<h3><code>reduced_row_echelon_form_display(matrix)</code></h3>
<p>Returns a passage of HTML describing the steps involved in transforming the given matrix into reduced row echelon form.</p>
<h3><code>is_reduced_row_echelon_form(matrix)</code></h3>
<p>Returns <code>true</code> if the matrix is in reduced row echelon form.</p>
<h3><code>describe_why_reduced_row_echelon_form(matrix)</code></h3>
<p>Returns a string describing why the matrix is not in reduced row echelon form, or "The matrix is in reduced row echelon form." if it is.</p>
<h3><code>rank(matrix)</code></h3>
<p>Computes the rank of the matrix, by returning the number of rows of the reduced row echelon form of the matrix, with all zero rows removed.</p>
<h3><code>is_linearly_independent(matrix)</code></h3>
<p>Returns <code>true</code> if the rows of the matrix are linearly independent.</p>
<h3><code>adjoin(matrix,vector)</code></h3>
<p>Add the given column vector to the right of the given matrix.</p>
<h3><code>subset_with_dimension(vectors,n,d)</code></h3>
<p>Return a subset of <code>n</code> of the given vectors, with dimension <code>d</code>.</p>
<p>This is not always possible - if the vectors have length <code>k</code>, you can't have <code>d&gt;k</code>. 
This is not If the input list has dimension less than <code>d</code>, it can't be done.
This is not Likewise with extra dependent vectors - if there aren't enough, it'll fail.</p>
<p>The vectors are processed in order, so if you want a random subset you should shuffle the list first.</p>
<h3><code>as_sum_of_basis(basis,v)</code></h3>
<p>Express the vector <code>v</code> as the sum of the given list of basis vectors.
Returns a list of coefficients corresponding to the basis vectors.</p>
<h2>JavaScript functions</h2>
<p>All JavaScript functions are members of the <code>Numbas.extensions.linearalgebra</code> object.</p>
<h3><code>Fraction(n)</code></h3>
<p>A constructor for a fraction. <code>n</code> is either a number, in which case a rational approximation is computed, or an object <code>{n: numerator, d:denominator}</code>.</p>
<p>Example:</p>
<p><code>var two = new Fraction(2);
var third = new Fraction(1/3);
var two_thirds = two.mul(third);</code></p>
<h3><code>fraction_matrix(matrix)</code></h3>
<p>Convert all the entries in the given matrix to <code>Fraction</code> objects. Returns a new matrix - doesn't modify the original.</p>
<h3><code>unfraction_matrix(matrix)</code></h3>
<p>Convert all the entries in the given matrix from <code>Fraction</code> objects to normal numbers. Returns a new matrix - doesn't modify the original.</p>
<h3><code>row_echelon_form(matrix)</code></h3>
<p>Transforms the given matrix into row echelon form. Returns an object <code>{matrix: matrix, operations: [list of descriptions of the steps]}</code>.</p>
<h3><code>reduced_row_echelon_form(matrix)</code></h3>
<p>Transforms the given matrix into reduced row echelon form. Returns an object <code>{matrix: matrix, operations: [list of descriptions of the steps]}</code>.</p>
<h3><code>is_row_echelon_form(matrix)</code></h3>
<p>Returns <code>true</code> if the given matrix is in row echelon form. If not, throws an error whose message is an explanation of why the matrix isn't in row echelon form.</p>
<h3><code>is_reduced_row_echelon_form(matrix)</code></h3>
<p>Returns <code>true</code> if the given matrix is in reduced row echelon form. If not, throws an error whose message is an explanation of why the matrix isn't in reduced row echelon form.</p>
<h3><code>rank(matrix)</code></h3>
<p>Returns the rank of the given matrix.</p>
<h3><code>is_linearly_independent(vectors)</code></h3>
<p>Returns <code>true</code> if the given list of vectors is linearly independent.</p>
<h3><code>adjoin(matrix,vector)</code></h3>
<p>Add the given column vector to the right of the given matrix.</p>
<h3><code>subset_with_dimension(vectors,n,d)</code></h3>
<p>Returns a subset of <code>n</code> of the given vectors with dimension <code>d</code>.</p>
<h3><code>as_sum_of_basis(basis,v)</code></h3>
<p>Express the vector <code>v</code> as the sum of the given basis vectors.
Returns a list of coefficients corresponding to the basis vectors.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Hexaflex yourself</title>
        <link href="https://somethingorotherwhatever.com/items/hexaflex-yourself"/>
        <id>https://somethingorotherwhatever.com/items/hexaflex-yourself</id>
        <updated>2017-05-11T15:03:37Z</updated>
        <summary type="html"><![CDATA[<p>Makes a printable template for a hexaflexagon containing a picture from your camera, or any image you upload. Made for outreach purposes at work.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/hexaflex-yourself/main.png" />
                
                
                    <p>Makes a printable template for a hexaflexagon containing a picture from your camera, or any image you upload. Made for outreach purposes at work.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>mathsjam.com</title>
        <link href="https://somethingorotherwhatever.com/items/mathsjam-com"/>
        <id>https://somethingorotherwhatever.com/items/mathsjam-com</id>
        <updated>2017-05-02T23:00:00Z</updated>
        <summary type="html"><![CDATA[<p>The homepage for MathsJam. As of 2017, it's my design.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/mathsjam-com/main.png" />
                
                
                    <h1><a href="https://mathsjam.com">The MathsJam website</a></h1>
<p>This repository contains the source files to generate the MathsJam website.</p>
<h2>Changing something</h2>
<ul>
<li>You need a GitHub account to edit the site. If you don't have one, <a href="https://github.com/join">sign up</a> first - it's free!</li>
<li>Find the file you want to edit, and click the <code>Edit this file</code> button (it's a little pencil icon in the top right). The files for individual Jams are in the <a href="https://github.com/MathsJam/mathsjam-site/tree/master/cities"><code>cities</code></a> folder. Alternatively, each page on the site has an "edit this page" link at the bottom; clicking this will take you to the corresponding GitHub page.</li>
<li>Make your changes, then describe what you've done in the text field at the bottom and click "Propose file change".</li>
<li>This will allow you to create a <em>pull request</em>, which one of the admins has to approve. They might request further changes or make their own edits. When the pull request is approved, the change will be published to the site.</li>
</ul>
<h2>Organisation of the repository</h2>
<p>Information about each city is stored in a file in the <code>cities</code> folder. </p>
<p>Other pages are generated from <code>.md</code> files in the repository. The front page is generated from <code>index.md</code>.</p>
<h3>To add a city</h3>
<p>Create a file <code>cities/cityname.md</code>, following this template:</p>
<h2>```</h2>
<p>layout: city                                         <br />
city_name: CityName
local_jam_type: MathsJam (for jams in the US this is "MathJam")
jam_name: CityName MathsJam
email: cityname@mathsjam.com
twitter: CityNameMathsJam
facebook: https://www.facebook.com/groups/000000000000/
organiser:
    name: Organiser's name
    email: cityname@mathsjam.com
location:
    group: england/rest-of-uk/north-america/rest-of-world
    pub_name: "Ye Pub"
    description: " on X Street"
    url: http://www.yepub.website
    lon: 1.00000000 (get the lat and long from google maps)
    lat: 50.0000000
hiatus: False (change to True if the Jam is not currently running)
hiatus_months: (add this field if the Jam doesn't run for one or two months)
    - 2016-01
    - 2016-02
changed_dates: (add this field if the Jam is running on a different day one month - give the date the Jam will happen)
    - 2015-03-23
    - 2016-09-28
jam_date_rule: second-last Tuesday
december_jam_date_rule: third-last Tuesday
start_time: 7pm in the evening
lang: language code (for British jams, this is "en_GB")
poster_text: |
    Some custom body text
    for the poster
    (Only if you want)
    Maximum seven lines.</p>
<hr />
<p>```</p>
<p>All the data from this file will be used to create the page for the Jam, and all other references to the city throughout the site.</p>
<p>If your Jam doesn't meet on the second-last Tuesday of the month, you can add a line for 'jam_date_rule' and follow the convention of 'first/second/third/fourth(-last) Weekday', e.g. fourth Thursday, third-last Saturday. If you can't work out how to word it, do your best and we can fix it before merging.</p>
<p>Most Jams run on a different date in December to avoid Christmas, so there's a separate <code>december_jam_date_rule</code> line, with a default of 'third-last Tuesday'.</p>
<p>If you need to put your MathsJam on hiatus for a single month, this is also possible - add the 'hiatus_months' field, and then on successive lines add the months for which you won't be meeting, in the format YYYY-MM, as in the example above. This will automatically add a note to the site and remove it again afterwards. A similar procedure is available using the 'changed_dates' field for if your MathsJam is running on a different date for one particular month.</p>
<p>If you want your poster to be in a different language, set the <code>lang</code> and <code>poster_text</code> fields.</p>
<h2>Responsible people</h2>
<ul>
<li>Christian Lawson-Perfect (<a href="http://github.com/christianp">@christianp</a>)</li>
<li>Katie Steckles (<a href="http://github.com/katiesteckles">@katiesteckles</a>)</li>
</ul>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Nul points!</title>
        <link href="https://somethingorotherwhatever.com/items/nul-points"/>
        <id>https://somethingorotherwhatever.com/items/nul-points</id>
        <updated>2017-05-01T16:56:45Z</updated>
        <summary type="html"><![CDATA[<p>A thing to tot up everyone's ratings while watching Eurovision.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/nul-points/main.png" />
                
                
                    <h1>Nul points!</h1>
<p>A thing to tot up everyone's ratings while watching Eurovision.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>tootbib</title>
        <link href="https://somethingorotherwhatever.com/items/tootbib"/>
        <id>https://somethingorotherwhatever.com/items/tootbib</id>
        <updated>2017-04-22T10:39:36Z</updated>
        <summary type="html"><![CDATA[<p>A tool to toot a description of an entry from a bibtex file</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                
                    <p>A command-line tool to toot a random entry from <a href="https://github.com/christianp/bib-site">bib-site</a>.</p>
<p>Requires Python 3.</p>
<h2>To set up:</h2>
<ul>
<li>Register a new app with the Mastodon instance: <code>tootbib register --mastodon &lt;URL of your Mastodon instance&gt;</code></li>
<li>Log in to Mastodon: <code>tootbib login --mastodon &lt;URL of your Mastodon instance&gt; --email &lt;your Mastodon account's email address&gt; --password &lt;your Mastodon account's password&gt;</code></li>
</ul>
<h2>To use:</h2>
<p><code>tootbib --api_base_url &lt;URL of your Mastodon instance&gt; --bibsite &lt;URL of your bib-site instance&gt;</code> will pick a random entry and create a toot.</p>
<h2>Other options:</h2>
<ul>
<li><code>--order &lt;piece names separated by spaces&gt;</code> - specify the order in which the pieces of the toot should be assembled. Default is <code>"title author collections abstract url pdf view"</code></li>
<li><code>--appfile &lt;filename&gt;</code> - path to the file in which to store the token for your Mastodon app.</li>
<li><code>--userfile &lt;filename&gt;</code> - path to the file in which to store the access token for your Mastodon account.</li>
</ul>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>The MathJax URL</title>
        <link href="https://somethingorotherwhatever.com/items/the-mathjax-url"/>
        <id>https://somethingorotherwhatever.com/items/the-mathjax-url</id>
        <updated>2017-04-04T23:00:00Z</updated>
        <summary type="html"><![CDATA[<p>From the time when I needed it lots, and the main MathJax site didn't make it easy to find, I made this page with just the URL to load MathJax.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                
                    <p>From the time when I needed it lots, and the main MathJax site didn't make it easy to find, I made this page with just the URL to load MathJax.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>A day in the life of a maths e-learning officer</title>
        <link href="https://somethingorotherwhatever.com/items/a-day-in-the-life-of-a-maths-e-learning-officer"/>
        <id>https://somethingorotherwhatever.com/items/a-day-in-the-life-of-a-maths-e-learning-officer</id>
        <updated>2017-03-15T09:17:27Z</updated>
        <summary type="html"><![CDATA[<p>My wife’s school recently sent round a form with questions about “a day in the life” of people working in STEM careers, to show to their year 6 children. My job involves the M in …</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/a-day-in-the-life-of-a-maths-e-learning-officer/main.png" />
                
                
                    <p>My wife’s school recently sent round a form with questions about “a day in the life” of people working in STEM careers, to show to their year 6 children. My job involves the M in …</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>JME marking algorithms</title>
        <link href="https://somethingorotherwhatever.com/items/jme-marking-algorithms"/>
        <id>https://somethingorotherwhatever.com/items/jme-marking-algorithms</id>
        <updated>2017-02-02T15:59:09Z</updated>
        <summary type="html"><![CDATA[<p>A repository I used to develop the marking algorithms feature in Numbas.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                
                    <h1>A language for defining marking algorithms</h1>
<h3><a href="https://christianp.github.io/marking-algorithms/state.html">Demo</a></h3>
<p>A marking algorithm is a set of <em>notes</em>.</p>
<p>A note is a name, an optional description, and a list of procedures.</p>
<p>Applying a procedure returns a JME value <em>or</em> an operation on the state.</p>
<p>The state is a stack of credit/validation/feedback instructions. 
The only operation is to append instructions to the stack.</p>
<p>Evaluating a note consists of applying all of its procedures, and storing the final JME value and state.</p>
<p>Execution order of the notes is determined by dependency.</p>
<blockquote>
<p>(Some context: 'JME' is the name for the scripting language used by the e-assessment system <a href="https://www.github.com/numbas/Numbas">Numbas</a>. Here's <a href="http://numbas-editor.readthedocs.io/en/latest/jme-reference.html">a reference for the JME language</a>.)</p>
</blockquote>
<h2>Special notes</h2>
<p>The following notes are required:</p>
<ul>
<li><code>mark</code> - The state at the end of this note will be used to find the student's final score and feedback.</li>
<li><code>as_jme</code> - The student's answer, as a JME value which can be used in adaptive marking or by other parts.</li>
</ul>
<h2>State operations</h2>
<p>These operations are implemented as functions which return a list of state instruction tokens.</p>
<ul>
<li><code>set_credit(n,message)</code> - Set the credit to n, and add a feedback message explaining why</li>
<li><code>multiply_credit(n,message)</code> - Multiply the credit by n, and add a feedback message explaining why</li>
<li><code>add_credit(n,message)</code> - Add n to the credit, and add a feedback message explaining why</li>
<li><code>sub_credit(n,message)</code> - Subtract n from the credit, and add a feedback message explaining why</li>
<li><code>correct(message)</code> - Set the credit to 1, and add a feedback message explaining why</li>
<li><code>incorrect(message)</code> - Set the credit to 0, and add a feedback message explaining why</li>
<li><code>end</code> - End the evaluation here, and don't continue evaluating any other notes which depend on this one</li>
<li><code>fail(message)</code> - End the evaluation here, set credit to 0, mark the student's answer as invalid, and add a feedback message explaining why</li>
<li><code>assert(test, otherwise)</code> - If <code>test</code> is false, apply <code>otherwise</code></li>
<li><code>warn(message)</code> - Display a warning next to the input box</li>
<li><code>get_answer(part)</code> - Get the student's answer to the given part. The reference can be relative, e.g. <code>g0</code> will get this part's first gap, while <code>p0g0</code> will get the first gap in the first part in the question.</li>
<li><code>mark_part(part)</code> - Apply the given part's marking algorithm, and return its final state.</li>
<li><code>feedback(message)</code> - Give the student some feedback</li>
<li><code>apply(state, [title])</code> - Append the given state (from another note, for example) to the current state. If a title is given, all the applied feedback messages will be grouped under that title.</li>
</ul>
<h2>Inputs</h2>
<p>The following variables are available at any point:</p>
<ul>
<li><code>studentAnswer</code> - the student's answer, exactly as they entered it</li>
<li><code>settings[name]</code> - get the part setting with the given name, e.g. <code>correctAnswer</code>, <code>maxLength</code>.</li>
</ul>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Jupyter Interactions</title>
        <link href="https://somethingorotherwhatever.com/items/jupyter-interactions"/>
        <id>https://somethingorotherwhatever.com/items/jupyter-interactions</id>
        <updated>2017-01-17T16:36:22Z</updated>
        <summary type="html"><![CDATA[<p>A site to show off interactions in Jupyter notebooks, which were new at the time.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/jupyter-interactions/main.png" />
                
                
                    <p>A site to show off interactions in Jupyter notebooks, which were new at the time.</p>
<p>This was built during a hackathon session at the Computational Mathematics with Jupyter Workshop in Edinburgh, with Mike Croucher and a few others.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>cp&#39;s betablog</title>
        <link href="https://somethingorotherwhatever.com/items/cp-s-betablog"/>
        <id>https://somethingorotherwhatever.com/items/cp-s-betablog</id>
        <updated>2017-01-08T18:18:12Z</updated>
        <summary type="html"><![CDATA[<p>I tried out making a static blog very slightly before they were cool.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                
                    <p>I tried out making a static blog very slightly before they were cool.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>checkmyworking.com in spress</title>
        <link href="https://somethingorotherwhatever.com/items/checkmyworking-com-in-spress"/>
        <id>https://somethingorotherwhatever.com/items/checkmyworking-com-in-spress</id>
        <updated>2016-11-27T15:26:19Z</updated>
        <summary type="html"><![CDATA[<p>A spress site to create a static version of checkmyworking.com</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                
                    <p>A spress site to create a static version of checkmyworking.com</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Staticize WordPress</title>
        <link href="https://somethingorotherwhatever.com/items/staticize-wordpress"/>
        <id>https://somethingorotherwhatever.com/items/staticize-wordpress</id>
        <updated>2016-11-25T15:41:03Z</updated>
        <summary type="html"><![CDATA[<p>A tool to convert a WordPress blog to a static site with Spress. Used on checkmyworking.com</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                
                    <h1>wordpress-staticize</h1>
<p>Render a WordPress blog as static files</p>
<p>At the moment, it creates files which can be used by <a href="http://spress.yosymfony.com/">Spress</a> to create the static pages. Eventually I want to get it to trigger Spress each time it updates.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Zeta plot</title>
        <link href="https://somethingorotherwhatever.com/items/zeta-plot"/>
        <id>https://somethingorotherwhatever.com/items/zeta-plot</id>
        <updated>2016-11-11T16:48:41Z</updated>
        <summary type="html"><![CDATA[<p>Build up a plot of the Riemann zeta function by spray paint.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/zeta-plot/main.png" />
                
                
                    <p>Build up a plot of the Riemann zeta function by spray paint.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>A clever horse - Theory and applications</title>
        <link href="https://somethingorotherwhatever.com/items/a-clever-horse-theory-and-applications"/>
        <id>https://somethingorotherwhatever.com/items/a-clever-horse-theory-and-applications</id>
        <updated>2016-11-05T00:00:00Z</updated>
        <summary type="html"><![CDATA[<p>Clever Hans was a famous horse who could answer maths questions. I made my own.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/a-clever-horse-theory-and-applications/main.png" />
                
                
                    <p>Clever Hans was a famous horse who could answer maths questions. I made my own.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Grammars for informal notation</title>
        <link href="https://somethingorotherwhatever.com/items/grammars-for-informal-notation"/>
        <id>https://somethingorotherwhatever.com/items/grammars-for-informal-notation</id>
        <updated>2016-09-22T14:56:17Z</updated>
        <summary type="html"><![CDATA[<p>An attempt to produce grammars to describe informal mathematician, which is often ambiguous and inconsistent.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                
                    <p>We're working on a system which can parse student's ambiguous mathematical notation.</p>
<ol>
<li>Offer suggestions or decided what is meant based on context.</li>
<li>Flexible parsing rules based on commonly used mathematical contexts. </li>
<li>Output the resulting parse-trees in a variety of languages, e.g. LaTeX, Maxima.</li>
</ol>
<p>The longer term goal of this work is to use the resulting parser in an online assessment system with students.</p>
<h2>To run the tests</h2>
<ul>
<li>Install <a href="https://www.npmjs.com/">npm</a></li>
<li>Install nearley: <code>npm install nearley</code></li>
<li>Compile the grammar to JavaScript: <code>make jme-nearley.js</code></li>
<li>Now <a href="test.html">test.html</a> should work.</li>
</ul>
<h2>Parsing libraries</h2>
<ul>
<li><a href="https://pegjs.org/">PEGjs</a> - creates simple, unambiguous parsers.</li>
<li><a href="http://nearley.js.org/">Nearley</a> - creates very versatile parsers, and returns multiple results for ambiguous grammars. </li>
</ul>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Numbro extension for Numbas</title>
        <link href="https://somethingorotherwhatever.com/items/numbro-extension-for-numbas"/>
        <id>https://somethingorotherwhatever.com/items/numbro-extension-for-numbas</id>
        <updated>2016-07-28T12:18:55Z</updated>
        <summary type="html"><![CDATA[<p>Format numbers and currency amounts with numbro.js</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                
                    <h1>Numbro extension for Numbas</h1>
<p><a href="http://numbrojs.com/">numbro.js</a> provides functions to format numbers and currency amounts.</p>
<p>It uses its own format specification language, which is defined by example. See <a href="http://numbrojs.com/format.html">the numbro.js docs</a> for examples of what's possible.</p>
<p>At the moment, numbro keeps the language setting in a global variable, which makes it difficult to provide formatting functions which take a language/culture parameter without affecting other calls to numbro.</p>
<p>To set the language/culture for a question, call <code>numbro.culture</code> in the question preamble, e.g. <code>numbro.culture('nb-NO')</code>.</p>
<p>There's a question showing how to use this extension at https://numbas.mathcentre.ac.uk/question/15000/format-numbers-and-currency-amounts-with-numbro-js/</p>
<h2>JME functions</h2>
<h3><code>format(n,format)</code></h3>
<p>Format the number <code>n</code> following the given format.</p>
<p><strong>Example</strong>: <code>format(1234.5,'0,0.00')</code> → <code>"1,234.50"</code></p>
<h3><code>formatcurrency(n,format)</code></h3>
<p>Format <code>n</code> as a currency amount, following the given format.</p>
<p><strong>Example</strong>: <code>formatcurrency(12345,'0a')</code> → <code>$12k</code> (when the language is the default value, <code>en-US</code>)</p>
<h3><code>formatcurrency(n,format,currencySymbol)</code></h3>
<p>Format <code>n</code> as a currency amount, following the given format and with the given currency symbol.</p>
<p><strong>Example</strong>: <code>formatcurrency(12345,'0a','£')</code>  → <code>£12k</code></p>
<h1>Licence</h1>
<p>numbro.js is © 2014 Adam Draper, © 2015 Företagsplatsen AB, and released under the MIT licence.</p>
<p>This extension is © 2016 Newcastle University.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Interactive Puzzlebomb puzzles</title>
        <link href="https://somethingorotherwhatever.com/items/interactive-puzzlebomb-puzzles"/>
        <id>https://somethingorotherwhatever.com/items/interactive-puzzlebomb-puzzles</id>
        <updated>2016-07-15T07:35:31Z</updated>
        <summary type="html"><![CDATA[<p>Interactive versions of the early <a href="https://www.puzzlebomb.co.uk">Puzzlebomb</a> puzzle sheets. Made in Elm.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/interactive-puzzlebomb-puzzles/main.png" />
                
                
                    <h1>Interactive Puzzlebomb</h1>
<p>Interactive versions of the <a href="http://www.puzzlebomb.co.uk">Puzzlebomb</a> puzzle sheets</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>GeoGebra extension for Numbas</title>
        <link href="https://somethingorotherwhatever.com/items/geogebra-extension-for-numbas"/>
        <id>https://somethingorotherwhatever.com/items/geogebra-extension-for-numbas</id>
        <updated>2016-07-07T14:37:58Z</updated>
        <summary type="html"><![CDATA[<p>An extension for Numbas which integrates GeoGebra materials</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/geogebra-extension-for-numbas/main.png" />
                
                
                    <h1>GeoGebra extension for Numbas</h1>
<p>An extension for Numbas which integrates <a href="https://www.geogebra.org">GeoGebra</a> materials. </p>
<p>To use this extension in a question, tick the "GeoGebra" option on the <em>Extensions and Scripts</em> tab.</p>
<p>All the GeoGebra resources are loaded from <a href="https://geogebra.org">geogebra.org</a>, so this extension <em>WILL NOT</em> work offline, or in environments where that domain is blocked or otherwise inaccessible.</p>
<p><strong>Warning: At the moment, there's no way for this code to detect when the GeoGebra embedding fails, either due to an incorrect ID or a network issue. If you just get "geogebra applet loading..." for a long time, check your browser's console.</strong></p>
<h2>JME functions</h2>
<h3><code>geogebra_applet(id or dimensions, [object definitions], [object-part links])</code> → ggbapplet</h3>
<p><em>Load a GeoGebra material or create a blank worksheet, and optionally modify or create some objects and set up links between objects and question parts</em></p>
<p>The parameters begin with either the ID of a material to load from geogebra.org, or a pair of numbers representing the width and height of a blank applet worksheet.
The material ID is or the URL of the material, such as <code>https://www.geogebra.org/m/jJ3zQ29z</code> or <code>http://ggbm.at/jJ3zQ29z</code>, or just the random-looking bit, e.g. <code>jJ3zQ29z</code>.</p>
<p>The next parameter is an optional dictionary of definitions (or re-definitions) of objects. The definition can be a value on its own, or a dictionary of properties to set.</p>
<p>If you give a dictionary of properties, the following properties are understood:</p>
<ul>
<li><code>definition</code> (a value for the object, or a GeoGebra command)</li>
<li><code>caption</code></li>
<li><code>color</code> (any valid CSS color is accepted)</li>
<li><code>visible</code></li>
<li><code>label_visible</code></li>
<li><code>label_style</code></li>
<li><code>fixed</code></li>
<li><code>trace</code></li>
<li><code>rename</code></li>
<li><code>layer</code></li>
<li><code>line_style</code></li>
<li><code>line_thickness</code></li>
<li><code>point_style</code></li>
<li><code>point_size</code></li>
<li><code>display_style</code></li>
<li><code>filling</code></li>
</ul>
<p>The definition can be:</p>
<ul>
<li>a number;</li>
<li>a vector, which produces a point in the GeoGebra applet;</li>
<li>a string, which is interpreted as a <a href="https://www.geogebra.org/manual/en/Commands">GeoGebra command</a>;</li>
<li>a list of any of the above types of value.</li>
</ul>
<p>If the object with the given name is already defined in the applet, then it is updated with the new definition you give. So you can set up your whole worksheet in the GeoGebra editor with placeholder values, and then replace them with the values generated by your question when it runs.</p>
<p>The optional final parameter is a list of links between GeoGebra objects and Numbas parts, in the format <code>[object or exercise name, part id]</code>. When the object changes in GeoGebra, the answer input for the corresponding part is updated, and vice versa. </p>
<p>Be careful about linking dependent objects to part answers: if the student changes the part's answer input, the GeoGebra worksheet can't be updated to reflect that. So only link independent objects to part answers.
If you want to use the position of a dependent object in the marking of a part, use an 'extension' type part and the functions detailed below to get the part's position in a custom marking algorithm.</p>
<p>The object returned by this function can be embedded in any content area just like an HTML value.</p>
<h5>Example usage</h5>
<p><code>geogebra_applet('https://www.geogebra.org/m/jJ3zQ29z',[A: vector(ax,ay), B: vector(bx,by), C: vector(cx,cy)])</code></p>
<p>Loads the given worksheet, and moves points A,B and C to the given positions.</p>
<p><code>geogebra_applet(800,500,[A: ["definition": vector(1,0), "color": red"]], [["A","p0"]])</code></p>
<p>Creates a blank worksheet with size 800 by 500 pixels, adds an object A at (1,0) and links the position of A with the answer to the first part in the question.</p>
<h3><code>geogebra_file(filename, [object definitions], [object-part links])</code> → ggbapplet</h3>
<p><em>Load a GeoGebra file from the given file.</em></p>
<p>The <code>filename</code> parameter can be the name of a resource attached to the question, or the URL of any .ggb file.</p>
<p>The 'object definitions' and 'object-part links' parameters work the same way as for <code>geogebra_applet</code>.</p>
<h3><code>geogebra_base64(base64, width, height, [object definitions], [object-part links])</code> → ggbapplet</h3>
<p><em>Create a GeoGebra applet from the given base64-encoded .ggb file, with the given width and height in pixels.</em></p>
<p>If you have the base64-encoded version of a .ggb file, this function will create a GeoGebra applet with the given dimensions and load the given worksheet in it.</p>
<p>One way of obtaining the base 64 string for a GeoGebra applet is to run <code>ggbApplet.getBase64()</code> on a page containing the applet. <strong>Note:</strong> the variable won't always be called <code>ggbApplet</code> - on geogebra.org, for example, a unique string of digits is appended to the variable name.</p>
<p>The 'object definitions' and 'object-part links' parameters work the same way as for <code>geogebra_applet</code>.</p>
<h3>Functions to obtain properties of objects</h3>
<p><strong>Warning: Because of the way GeoGebra loads, these functions only work once the applet has been displayed. That means they don't work during question variable generation. The intended use for these functions is in part marking algorithms.</strong></p>
<p>The following functions get properties of a named object from a GeoGebra applet created with one of the functions above. They are all have the calling signature <code>property(app,object name)</code>, e.g. <code>value(app,"A")</code>.</p>
<ul>
<li><code>value</code> - a representation of the object's value.</li>
<li><code>x</code> - the X coordinate</li>
<li><code>y</code> - the Y coordinate</li>
<li><code>z</code> - the Z coordinate</li>
<li><code>color</code> - the color of the object, as a hex string (e.g. <code>#4D4DFF</code>)</li>
<li><code>visible</code> - is the object visible?</li>
<li><code>value_string</code> - GeoGebra's string representation of the object.</li>
<li><code>definition_string</code> - the description of the object.</li>
<li><code>command_string</code> - the command of the object.</li>
<li><code>latex_string</code> - a string of LaTeX representing the object.</li>
<li><code>type</code> - the type of the object, e.g. <code>"point"</code>, <code>"numeric"</code>.</li>
<li><code>exists</code> - does the object exist in the applet?</li>
<li><code>defined</code> - is the object's value valid at the moment?</li>
<li><code>layer</code> - the layer the object is in.</li>
<li><code>line_style</code></li>
<li><code>line_thickness</code></li>
<li><code>point_style</code></li>
<li><code>point_size</code></li>
<li><code>caption</code></li>
<li><code>label_style</code></li>
</ul>
<h4>An example marking algorithm</h4>
<p>This marking algorithm marks the part as correct if the point <code>A</code> is positioned at the coordinates (1,2).
The GeoGebra applet has been defined in the variable <code>app</code>.</p>
<p>```
a_pos (The position of the object A, as a vector):
  value(app,"A")</p>
<p>mark:
  feedback("A is at $\var{latex(a_pos)}$");
  correctif(a_pos=target_position)</p>
<p>interpreted_answer:
  a_pos
```</p>
<h2>JavaScript functions</h2>
<h3><code>createGeogebraApplet(options,replacements,parts,question)</code></h3>
<p><code>options</code> is a dictionary of <a href="https://www.geogebra.org/manual/en/Reference:Applet_Parameters">GeoGebra applet parameters</a>. This function returns a <a href="https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise">Promise</a> object which resolves to an object <code>{app: &lt;GeoGebra applet&gt;, element: &lt;HTML element containing the applet&gt;}</code>.</p>
<p>You could use this function to load an applet and then manipulate it with the <a href="https://www.geogebra.org/manual/en/Reference:JavaScript">GeoGebra JavaScript API</a> before embedding it in the page.</p>
<p>Note that because this function returns a promise, the applet will not have finished loading at the time the question is displayed to the student. You'll have to insert the applet in the page yourself once the promise resolves.</p>
<h3><code>tokToGeoGebra(token)</code></h3>
<p>Convert a Numbas JME token to a GeoGebra command.</p>
<h2><code>geoGebraToTok(app,name)</code></h2>
<p>Get a JME token representing the value of a GeoGebra object.</p>
<p><code>app</code> is a <code>GGBApplet</code> object, and <code>name</code> is the name of the GeoGebra object to convert.</p>
<p>Objects of type 'point' are converted to vectors, 'numeric' to numbers, and everything else to strings.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Sierpinski dots</title>
        <link href="https://somethingorotherwhatever.com/items/sierpinski-dots"/>
        <id>https://somethingorotherwhatever.com/items/sierpinski-dots</id>
        <updated>2016-06-20T10:31:24Z</updated>
        <summary type="html"><![CDATA[<p>A thing to play the Chaos game on a triangle, making the Sierpiński triangle.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/sierpinski-dots/main.svg" />
                
                
                    <p>A thing to play the Chaos game on a triangle, making the Sierpiński triangle.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>emojiördinates</title>
        <link href="https://somethingorotherwhatever.com/items/emojiordinates"/>
        <id>https://somethingorotherwhatever.com/items/emojiordinates</id>
        <updated>2016-06-14T09:21:33Z</updated>
        <summary type="html"><![CDATA[<p>Because What3Words is stupid, I made this thing to convert lat/long coordinates into a sequence of four emoji.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/emojiordinates/main.png" />
                
                
                    <h1>emojiördinates</h1>
<p>Because <a href="http://what3words.com/">What3Words</a> is stupid, here's a thing that converts a lat/long into 4 emoji, and back. It doesn't do anything clever with projections or tilings - it just scales lat and longs linearly onto a 2×(766²)×(766²) grid, and maps that onto four emoji, picked from the set of 912 that emojiOne can render without any combining characters.</p>
<p>The encoding is completely dependent on the set of emoji I chose, and their order - I think they're in ascending Unicode order.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>A quiz in Elm</title>
        <link href="https://somethingorotherwhatever.com/items/a-quiz-in-elm"/>
        <id>https://somethingorotherwhatever.com/items/a-quiz-in-elm</id>
        <updated>2016-06-05T17:36:17Z</updated>
        <summary type="html"><![CDATA[<p>I wondered how much work it would be to write a quiz system like Numbas, in Elm. The hardest part was thinking about randomising, because I didn't have a good understanding of how Elm's randomisation works.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/a-quiz-in-elm/main.png" />
                
                
                    <h1>elm-quiz</h1>
<p>A toy quiz system written in Elm.</p>
<p>I'm just playing about with the Elm language. I thought a little quiz would be a good project to experiment with.</p>
<p>At the moment, the Elm standard library (and even the community packages) don't offer much, so this implements some very basic things.</p>
<p>To build it, run <code>elm-make quiz.elm --output=quiz.js</code>, then open <code>index.html</code>.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Katie&#39;s nail painting puzzle</title>
        <link href="https://somethingorotherwhatever.com/items/katie-s-nail-painting-puzzle"/>
        <id>https://somethingorotherwhatever.com/items/katie-s-nail-painting-puzzle</id>
        <updated>2016-05-21T10:07:14Z</updated>
        <summary type="html"><![CDATA[<p>A game based on Katie Steckles's binary nail-painting puzzle.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/katie-s-nail-painting-puzzle/main.png" />
                
                
                    <h1>Katie's nail-painting puzzle</h1>
<p>A game based on <a href="http://aperiodical.com/2016/05/katies-binary-nails-tutorial-and-a-puzzle/">Katie Steckles's binary nail-painting puzzle</a>. 
The aim is to add or remove varnish from your nails in a sequence such that every combination of painted/unpainted appears on your hand once, while minimising the number of times you remove paint from a finger (acetone isn't free).</p>
<p>Drag rows of the sequence to reorder them.
Your best score is shown in red; click it to restore the sequence that made that score.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>bib-site</title>
        <link href="https://somethingorotherwhatever.com/items/bib-site"/>
        <id>https://somethingorotherwhatever.com/items/bib-site</id>
        <updated>2016-05-20T10:33:35Z</updated>
        <summary type="html"><![CDATA[<p>An interface to browse and edit a .bib file</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                
                    <p>This is a set of PHP scripts which provide an interface to browse and edit a .bib file. Everything happens in the .bib file - no SQL database or anything like that needed.</p>
<p>Even if you don't need that, you might like <code>bib-parse.php</code>, which does a better job of parsing .bib files (or at least, <em>my</em> .bib files) than any other PHP parser I found.</p>
<p>I use this to run <a href="http://read.somethingorotherwhatever.com">read.somethingorotherwhatever.com</a></p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Interesting Esoterica</title>
        <link href="https://somethingorotherwhatever.com/items/interesting-esoterica"/>
        <id>https://somethingorotherwhatever.com/items/interesting-esoterica</id>
        <updated>2016-05-18T23:00:00Z</updated>
        <summary type="html"><![CDATA[<p>This site hosts my list of interesting and unusual papers that I have collected over the years. Many of the references are kept here so I can easily find them again when I want to tell someone about the really interesting idea they contain; others are here only because they caught my eye when I first came across them.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/interesting-esoterica/main.png" />
                
                
                    <p>This site hosts my list of interesting and unusual papers that I have collected over the years. Many of the references are kept here so I can easily find them again when I want to tell someone about the really interesting idea they contain; others are here only because they caught my eye when I first came across them.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Numbas LTI tool provider</title>
        <link href="https://somethingorotherwhatever.com/items/numbas-lti-tool-provider"/>
        <id>https://somethingorotherwhatever.com/items/numbas-lti-tool-provider</id>
        <updated>2016-05-02T19:08:47Z</updated>
        <summary type="html"><![CDATA[<p>An LTI tool provider to run Numbas exams</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                
                    <p><img src="http://numbas.org.uk/numbas-logo.svg" width="100%" alt="Numbas logo"></p>
<h1>LTI tool provider</h1>
<p>This is a Basic LTI 1.1 tool provider, to run <a href="http://www.numbas.org.uk">Numbas</a> exams in any LTI-compatible virtual learning environment.</p>
<p>The tool handles attempt data, and as well as offering CSV exports of student scores can report scores back to the host VLE's gradebook.</p>
<h2>What do I need in order to use this?</h2>
<p>You must run your own instance of this tool - as well as using a fair amount of server resources, we don't want to keep other people's student data!</p>
<p>To install the tool, you need:</p>
<ul>
<li>A dedicated server to install the software on, which will communicate with your virtual learning environment. At Newcastle, we use servers running Ubuntu. </li>
<li>The ability to add a link to an LTI tool to your virtual learning environment. In Blackboard and Moodle, only administrators can do this.</li>
</ul>
<p>At most institutions, this will require the help of your IT team.</p>
<p>If you're unsure whether you can use the LTI tool provider, or want help setting it up, <a href="mailto:numbas@ncl.ac.uk">email the Numbas team</a>.</p>
<h2>How to use</h2>
<p>The set-up process looks like this:</p>
<ul>
<li>Install the software on your own server, or on the cloud platform Heroku.</li>
<li>Complete the initial set-up, creating an admin account and an LTI consumer key.</li>
<li>Add the LTI tool to your VLE using the details provided.</li>
<li>When you access the tool from your VLE, upload a Numbas SCORM package, and you're done!</li>
</ul>
<h2>Documentation</h2>
<p>See <a href="https://docs.numbas.org.uk/lti">full documentation at docs.numbas.org.uk/lti</a>.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Approximate a ratio by folding a piece of paper</title>
        <link href="https://somethingorotherwhatever.com/items/approximate-a-ratio-by-folding-a-piece-of-paper"/>
        <id>https://somethingorotherwhatever.com/items/approximate-a-ratio-by-folding-a-piece-of-paper</id>
        <updated>2016-04-23T12:54:47Z</updated>
        <summary type="html"><![CDATA[<p>Warning: you could make a very strong argument I’ve thought far too much about something inconsequential. If that makes your stomach turn, look away now. This morning in the shower, I had an …</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/approximate-a-ratio-by-folding-a-piece-of-paper/main.png" />
                
                
                    <p>Warning: you could make a very strong argument I’ve thought far too much about something inconsequential. If that makes your stomach turn, look away now. This morning in the shower, I had an …</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Prime tapestry</title>
        <link href="https://somethingorotherwhatever.com/items/prime-tapestry"/>
        <id>https://somethingorotherwhatever.com/items/prime-tapestry</id>
        <updated>2016-04-06T20:37:51Z</updated>
        <summary type="html"><![CDATA[<p>Inspired by <a href="https://sites.google.com/site/geometryoftheprimes/">Barry Dalgarno</a> (ignore the nonsense)</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/prime-tapestry/main.png" />
                
                
                    <p>Inspired by https://sites.google.com/site/geometryoftheprimes/ (ignore the nonsense)</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Eat something or other, whatever</title>
        <link href="https://somethingorotherwhatever.com/items/eat-something-or-other-whatever"/>
        <id>https://somethingorotherwhatever.com/items/eat-something-or-other-whatever</id>
        <updated>2016-03-29T23:00:00Z</updated>
        <summary type="html"><![CDATA[<p>A site for me to collect recipes I like. I tried doing something clever with natural language processing to highlight the measurements in the ingredients, but it doesn't work very well.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/eat-something-or-other-whatever/main.png" />
                
                
                    <p>A site for me to collect recipes I like. I tried doing something clever with natural language processing to highlight the measurements in the ingredients, but it doesn't work very well.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>π - It&#39;s complicated</title>
        <link href="https://somethingorotherwhatever.com/items/it-s-complicated"/>
        <id>https://somethingorotherwhatever.com/items/it-s-complicated</id>
        <updated>2016-03-14T00:00:00Z</updated>
        <summary type="html"><![CDATA[<p>A talk about calculating π, given at Durham University for π day 2016. Contains lots of animations.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/it-s-complicated/main.png" />
                
                
                    <p>A talk about calculating π, given at Durham University for π day 2016. Contains lots of animations.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>isthisprime.com</title>
        <link href="https://somethingorotherwhatever.com/items/isthisprime-com"/>
        <id>https://somethingorotherwhatever.com/items/isthisprime-com</id>
        <updated>2016-03-08T21:27:51Z</updated>
        <summary type="html"><![CDATA[<p>It's just a website that does one thing: tells you if a number is prime or not. It's been useful surprisingly often!</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/isthisprime-com/main.png" />
                
                
                    <h1>isthisprime.com</h1>
<p>This is the code which runs the website isthisprime.com. </p>
<p>Copyright 2016 Christian Lawson-Perfect</p>
<p>Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at</p>
<p>http://www.apache.org/licenses/LICENSE-2.0</p>
<p>Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>The Is this prime? game</title>
        <link href="https://somethingorotherwhatever.com/items/the-is-this-prime-game"/>
        <id>https://somethingorotherwhatever.com/items/the-is-this-prime-game</id>
        <updated>2016-03-07T00:00:00Z</updated>
        <summary type="html"><![CDATA[<p>All you have to do is say whether each number is prime.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <video autoplay src="https://somethingorotherwhatever.com/items/the-is-this-prime-game/main.mp4"></video>
                
                
                    <p>All you have to do is say whether each number is prime.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Code Clicker</title>
        <link href="https://somethingorotherwhatever.com/items/code-clicker"/>
        <id>https://somethingorotherwhatever.com/items/code-clicker</id>
        <updated>2016-02-27T11:42:31Z</updated>
        <summary type="html"><![CDATA[<p>A clicker game where each click runs a program you've written. You get points for completing challenges, but each operation in your program costs points. It works OK, but I didn't have the motivation to finish it.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/code-clicker/main.png" />
                
                
                    <p>A clicker game where each click runs a program you've written. You get points for completing challenges, but each operation in your program costs points. It works OK, but I didn't have the motivation to finish it.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Maths Objects</title>
        <link href="https://somethingorotherwhatever.com/items/maths-objects"/>
        <id>https://somethingorotherwhatever.com/items/maths-objects</id>
        <updated>2016-02-20T00:00:00Z</updated>
        <summary type="html"><![CDATA[<p>A series of videos about mathematical objects.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/maths-objects/main.png" />
                
                
                    <p>A series of videos about mathematical objects.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Pancake flipping</title>
        <link href="https://somethingorotherwhatever.com/items/pancake-flipping"/>
        <id>https://somethingorotherwhatever.com/items/pancake-flipping</id>
        <updated>2016-02-06T18:05:38Z</updated>
        <summary type="html"><![CDATA[<p>An interactive toy for the pancake-flipping problem, to go with a post by Katie Steckles on The Aperiodical. By repeatedly flipping the top part of a stack of pancakes, can you sort them by size?</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <video autoplay src="https://somethingorotherwhatever.com/items/pancake-flipping/main.mp4"></video>
                
                
                    <p>An interactive toy for the pancake-flipping problem, to go with a post by Katie Steckles on The Aperiodical. By repeatedly flipping the top part of a stack of pancakes, can you sort them by size?</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Circle designs</title>
        <link href="https://somethingorotherwhatever.com/items/circle-designs"/>
        <id>https://somethingorotherwhatever.com/items/circle-designs</id>
        <updated>2016-02-04T09:51:12Z</updated>
        <summary type="html"><![CDATA[<p>Generates nice designs made of subdivided circle quadrants.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/circle-designs/main.png" />
                
                
                    <p>Generates nice designs made of subdivided circle quadrants.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Blackboard Numbas SCORM analysis</title>
        <link href="https://somethingorotherwhatever.com/items/blackboard-numbas-scorm-analysis"/>
        <id>https://somethingorotherwhatever.com/items/blackboard-numbas-scorm-analysis</id>
        <updated>2016-02-01T13:52:11Z</updated>
        <summary type="html"><![CDATA[<p>Because Blackboard's built-in SCORM player is so rubbish, I made this tool to give a better presentation of data from Numbas SCORM packages.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/blackboard-numbas-scorm-analysis/main.png" />
                
                
                    <h1>Blackboard SCORM analysis</h1>
<p><img alt="Part of a report" src="http://numbas.github.io/blackboard-scorm-analysis/blackboard-report.png" /></p>
<p>Blackboard doesn't make it easy to analyse data to do with SCORM packages: the built-in SCORM reports don't give much useful information and are tedious to generate, and it's unclear where in the database the SCORM data lies.</p>
<p>We discovered that the <em>Export/Archive Course</em> tool collects together all of the attempt data for SCORM packages in a way that can be easily interpreted.</p>
<p>This tool allows you to analyse all of the information held by Blackboard about SCORM packages in your course, by presenting the data from a course archive nicely. It's designed to work with SCORM packages generated using <a href="http://www.numbas.org.uk">Numbas</a>; other packages might work, but we don't guarantee it.</p>
<h2>First, a warning</h2>
<p>We've found that Blackboard often loses data, or saves inconsistent data. That can mean that a student's attempt is missing, or the question scores don't tally up with the part scores, or the suspend data and correct answers don't match what the student saw.</p>
<p>This happens in a small but significant number of cases. It should be obvious on looking at an individual attempt whether there's something wrong, but bear in mind that inconsistencies can appear if you try to do analyse the set of attempts as a whole.</p>
<p>We've also had a report that if any student has unenrolled from a course, the export will stop as soon as it tries to match an attempt by that student with their Grade Centre entry. This means that tests will appear to have far fewer attempts in the analysis tool than are shown in the Grade Centre.</p>
<p>Finally, the reported durations of attempts only rarely match up with reality. Best not to try to draw any conclusions from those.</p>
<h2>Installation</h2>
<p>The tool is a self-contained Python Flask server, which you can run on your own PC. Install <a href="https://www.python.org/downloads/">Python 3</a>, and then install the required Python packages by running the following command:</p>
<pre><code>pip install -r requirements.txt
</code></pre>
<p>Obtain a copy of the Blackboard SCORM analysis server (either clone this repository or <a href="https://github.com/numbas/blackboard-scorm-analysis/archive/master.zip">download a .zip</a>) and extract it into a directory on your PC.</p>
<p>To start the server, run</p>
<pre><code>python server.py
</code></pre>
<p>And open <code>http://localhost:5000</code> in your browser.</p>
<h2>Uploading a course</h2>
<ul>
<li>Go to your Blackboard course, and click on <em>Packages and Utilities</em>, then <em>Export/Archive Course</em>.</li>
<li>Click on the <em>Archive Course</em> button.</li>
<li>In the following form, make sure <em>Include Grade Centre History</em> is ticked, then click <em>Submit</em>.</li>
<li>It takes a while to create the archive. You'll get an email when it's ready - once that happens, go back to the <em>Export/Archive Course</em> page and click on the .zip file to download it.</li>
<li>In the Blackboard SCORM analysis tool, click on <em>Upload a zip file</em>, and then upload the file you just got from Blackboard.</li>
</ul>
<p>You can update a course's data by generating another archive and uploading that. The old version will be automatically rewritten.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>The Great Intersectionator</title>
        <link href="https://somethingorotherwhatever.com/items/the-great-intersectionator"/>
        <id>https://somethingorotherwhatever.com/items/the-great-intersectionator</id>
        <updated>2016-01-22T12:06:27Z</updated>
        <summary type="html"><![CDATA[<p>I found a load of corpuses of words. I made this to show the words that are in the intersections of several corpuses.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/the-great-intersectionator/main.png" />
                
                
                    <p>I found a load of corpuses of words. I made this to show the words that are in the intersections of several corpuses.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Duopoly</title>
        <link href="https://somethingorotherwhatever.com/items/duopoly"/>
        <id>https://somethingorotherwhatever.com/items/duopoly</id>
        <updated>2016-01-15T20:00:26Z</updated>
        <summary type="html"><![CDATA[<p>A game about drawing lines</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/duopoly/main.png" />
                
                
                    <h1>duopoly</h1>
<p>A game about drawing lines</p>
<ul>
<li>Take turns drawing lines on the board.</li>
<li>Each player must place two lines per turn.</li>
<li>When you connect two lines, you score the difference in their lengths.</li>
<li>The game ends when the board is full.</li>
</ul>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>punchcards</title>
        <link href="https://somethingorotherwhatever.com/items/punchcards"/>
        <id>https://somethingorotherwhatever.com/items/punchcards</id>
        <updated>2015-12-07T06:57:19Z</updated>
        <summary type="html"><![CDATA[<p>I never used real computer punchcards, so this is a simulation of how I think they worked. Click bits to turn them on or off, or in Lovelace mode you can't unpunch a hole! Shows the ASCII decoding of the card on the top.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <video autoplay src="https://somethingorotherwhatever.com/items/punchcards/main.mp4"></video>
                
                
                    <p>I never used real computer punchcards, so this is a simulation of how I think they worked. Click bits to turn them on or off, or in Lovelace mode you can't unpunch a hole! Shows the ASCII decoding of the card on the top.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Unfurl an image</title>
        <link href="https://somethingorotherwhatever.com/items/unfurl-an-image"/>
        <id>https://somethingorotherwhatever.com/items/unfurl-an-image</id>
        <updated>2015-12-02T09:52:44Z</updated>
        <summary type="html"><![CDATA[<p>A thing to do a coordinate transformation on an image. The example it loads with transforms from polar to cartesian coordinates.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/unfurl-an-image/main.png" />
                
                
                    <p>A thing to do a coordinate transformation on an image. The example it loads with transforms from polar to cartesian coordinates.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Ask Clever Hans a question</title>
        <link href="https://somethingorotherwhatever.com/items/ask-clever-hans-a-question"/>
        <id>https://somethingorotherwhatever.com/items/ask-clever-hans-a-question</id>
        <updated>2015-11-21T17:10:52Z</updated>
        <summary type="html"><![CDATA[<p>Before I made the physical Clever Hans, I made this page which uses speech recognition and a formal grammar to answer arithmetic questions. Featuring the pixelated horse from my horsey game.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/ask-clever-hans-a-question/main.png" />
                
                
                    <p>It's a clever horse who can answer maths questions.</p>
<p>The code for the real-life Clever Hans is in the <code>robot</code> branch.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Traffic thingy</title>
        <link href="https://somethingorotherwhatever.com/items/traffic-thingy"/>
        <id>https://somethingorotherwhatever.com/items/traffic-thingy</id>
        <updated>2015-11-08T14:09:53Z</updated>
        <summary type="html"><![CDATA[<p>A little tool to help Cushing try out the birthday problem with cars - how many cars should you expect to drive past before having a 50% chance of seeing the same string of final 3 letters twice?</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                
                    <h1>Traffic tracker</h1>
<p>A little tool to help Cushing try out the birthday problem with cars - how many cars should you expect to drive past before having a 50% chance of seeing the same string of final 3 letters twice?</p>
<p>Type the registration of each car you see (or just the last three letters), and it'll tell you when you see a double.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Droste Dobble</title>
        <link href="https://somethingorotherwhatever.com/items/droste-dobble"/>
        <id>https://somethingorotherwhatever.com/items/droste-dobble</id>
        <updated>2015-11-06T11:14:28Z</updated>
        <summary type="html"><![CDATA[<p>Exploiting a fact about projective planes</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/droste-dobble/main.png" />
                
                
                    <p>This goes with a <a href="https://mathsjam.com/assets/talks/2015/ChristianPerfect-DrosteDobble/">Big MathsJam talk from 2015</a>.</p>
<p>Dobble cards are points on a projective plane.</p>
<p>Each line contains all of the cards with a given symbol.</p>
<p>But a projective plane is its own dual: ifyou swap the lines and points, you get the same structure!</p>
<p>So there's no reason you shouldn't replace the symbols on a Dobble card with more Dobble cards.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Optimisation problems extension for Numbas</title>
        <link href="https://somethingorotherwhatever.com/items/optimisation-problems-extension-for-numbas"/>
        <id>https://somethingorotherwhatever.com/items/optimisation-problems-extension-for-numbas</id>
        <updated>2015-09-28T14:34:23Z</updated>
        <summary type="html"><![CDATA[<p>An extension for Numbas providing functions to help with optimisation problems</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                
                    <h1>Optimisation problems extension for Numbas</h1>
<p>This extension provides functions to work with linear programs and other optimisation problems.</p>
<h2>JME functions</h2>
<h3><code>random_partition(n,k,[minimum=1])</code></h3>
<p>Generate a random partition of <code>n</code> into <code>k</code> parts, with smallest part at least <code>minimum</code>.</p>
<h3><code>best_point(program)</code></h3>
<p>Solve a linear program with minimum constraints for each product, maximum constraints for each resource, numbers of each resource used in each product, and a straight line objective function</p>
<ul>
<li>minimum_x, minimum_y: minimum allocations for each product</li>
<li>resources_x, resources_y: numbers of each resource used to make 1 unit of each product</li>
<li>max_resource_1, max_resource_2: available quantities of each resource</li>
<li>profit_x, profit_y: profit per unit of each product</li>
</ul>
<p>Looks at the following intersection points:</p>
<ul>
<li>0 - resource 1 with minimum x</li>
<li>1 - resource 2 with minimum x</li>
<li>2 - resource 1 with minimum y</li>
<li>3 - resource 2 with minimum y</li>
<li>4 - resource 1 with resource 2</li>
</ul>
<p>Returns the index of the intersection point giving maximum profit</p>
<h3><code>best_coords(program)</code></h3>
<p>With program encoded as above, returns the coordinates <code>[x,y]</code> of the point giving the maximum profit</p>
<h3><code>binding_lines(program)</code></h3>
<p>With program encoded as above, returns an array of booleans specifying which lines are binding (touching the optimal solution), from the following: <code>[resource 1, resource 2, minimum x, minimum y]</code></p>
<h3><code>nw_corner(supplies,demands)</code></h3>
<p>Use the NW corner algorithm to generate a first guess at an optimal solution to a transportation problem. <code>supplies</code> specifies the number of units supplied by each source, and <code>demand</code> specifies the number of units demanded by each destination.</p>
<p>Returns a matrix of the number of units to transport from each source to each destination.</p>
<h3><code>nw_corner_display(supplies,demands)</code></h3>
<p>HTML representation of the stages of the NW corner algorithm</p>
<h3><code>minimum_cost(supplies,demands,costs)</code></h3>
<p>Find the solution to the transportation problem which minimises total cost. </p>
<p>Returns a matrix of the number of units to transport from each source to each destination.</p>
<h3><code>minimum_cost_display(supplies,demands,costs)</code></h3>
<p>HTML representation of the stages of the minimum cost algorithm.</p>
<h3><code>shadow_costs(assignments,allocated,costs)</code></h3>
<p>Returns a list <code>[m,rows,columns]</code>, where <code>m</code> is the shadow cost of each cell in the assignment matrix, and <code>rows</code> and <code>columns</code> give the shadow costs for each row and column, respectively.</p>
<h3><code>assignment_is_optimal(assignments,costs)</code></h3>
<p>Returns <code>true</code> if the given assignment (matrix of number of units to deliver from each source to each destination) minimises the total cost.</p>
<h3><code>assignment_is_valid(assignments,supplies,demands)</code></h3>
<p>Returns <code>true</code> if the given assignment is valid - the amount supplied from each source doesn't exceeed the available supply, and the amount delivered to each destination doesn't exceed the demand.</p>
<h3><code>stepping_stone_works(assignments,costs)</code></h3>
<p>Returns <code>true</code> if the stepping stone algorithm to find an optimal assignment terminates.</p>
<h3><code>stepping_stone(assignments,costs)</code></h3>
<p>Find an optimal solution to the given assignment problem, with the stepping stones method, starting with the given assignment.</p>
<p>Returns a matrix of assignments.</p>
<h3><code>stepping_stone_display(assignments,costs)</code></h3>
<p>HTML representation of the steps of the stepping stone method.</p>
<h3><code>assignment_cost(assignments,costs)</code></h3>
<p>Total cost of the given assignment</p>
<h3><code>cost_table(supply,demand,costs)</code></h3>
<p>A table showing the cost matrix for the given assignment problem</p>
<h3><code>assignment_table(assignments,supply,demand)</code></h3>
<p>A table showing the given assignment</p>
<h3><code>show_cost_calculation(assignments,costs)</code></h3>
<p>LaTeX description of the calculation of the total cost of the given assignment</p>
<h3><code>job_cost_table(costs,worker_name,job_name)</code></h3>
<p>A table showing the costs for each worker at each job. <code>worker_name</code> and <code>job_name</code> give the headings for workers and jobs, respectively (e.g., "Delivery driver" and "Route")</p>
<h3><code>hungarian(costs)</code></h3>
<p>Perform the Hungarian algorithm to assign workers to jobs, minimising the total cost. Returns a matrix with <code>1</code> in the cell <code>(worker,job)</code> when the corresponding worker is assigned to the corresponding job, and <code>0</code> otherwise.</p>
<h3><code>hungarian_display(costs)</code></h3>
<p>HTML representation of the steps of the Hungarian algorithm.</p>
<h3><code>utility_set(utility,actions)</code></h3>
<p>HTML graph showing the given set of points in a 2D decision problem. <code>utility</code> is a list of 2d coordinates <code>[x,y]</code>, and <code>actions</code> is a list of labels.</p>
<h3><code>show_expected_value_criteria(utility,labels,prob_state_1,prob_state_2)</code></h3>
<p>HTML graph showing the utility set, with the expected value criterion line defined by <code>prob_state_1</code> and <code>prob_state_2</code>.</p>
<h3><code>evpi(utility,probabilities)</code></h3>
<p>Expected value of perfect information in the given decision problem, with the given (vector or list of) probabilities.</p>
<h3><code>simplex(objective,equations)</code></h3>
<p>Solve the given linear programming problem with the simplex method</p>
<h3><code>simplex_optimal_tableau(objective,equations)</code></h3>
<p>Matrix representing the optimal tableau when the simplex algorithm terminates.</p>
<h3><code>simplex_find_bascs(tableau)</code></h3>
<p>List specifying which row each variable is basic in, in the given simplex tableau, or<code>-1</code> if the variable is not basic.</p>
<h3><code>simplex_display(objective,equations)</code></h3>
<p>HTML representation of the steps of the simplex method.</p>
<h3><code>simplex_final_tableau(objective,equations)</code></h3>
<p>HTML representation of an optimal simplex tableau for the given problem.</p>
<h3><code>convex_hull(points)</code></h3>
<p>The convex hull of the given list of points. Returns a list of points, in clockwise order.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Tennis graph</title>
        <link href="https://somethingorotherwhatever.com/items/tennis-graph"/>
        <id>https://somethingorotherwhatever.com/items/tennis-graph</id>
        <updated>2015-09-18T14:29:55Z</updated>
        <summary type="html"><![CDATA[<p>A state diagram of a complete tennis match</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/tennis-graph/main.png" />
                
                
                    <h1>A state diagram of a complete tennis match</h1>
<p>Released under the CC-BY 3.0 licence. Please give credit to Christian Lawson-Perfect.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>30 second challenge</title>
        <link href="https://somethingorotherwhatever.com/items/30-second-challenge"/>
        <id>https://somethingorotherwhatever.com/items/30-second-challenge</id>
        <updated>2015-07-19T17:48:58Z</updated>
        <summary type="html"><![CDATA[<p>Inspired by the newspaper puzzle my wife's grandma tests me with each time I visit.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/30-second-challenge/main.png" />
                
                
                    <p>Inspired by the puzzle that my wife's grandma tests me with each time I visit.</p>
<p>Start with the number in the first box and follow the instructions until you get to the end. Enter your answer and press enter (or click on the timer).</p>
<h2>Licence</h2>
<p>Copyright 2015 Christian Lawson-Perfect</p>
<p>Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at</p>
<pre><code>http://www.apache.org/licenses/LICENSE-2.0
</code></pre>
<p>Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Write maths with JME</title>
        <link href="https://somethingorotherwhatever.com/items/write-maths-with-jme"/>
        <id>https://somethingorotherwhatever.com/items/write-maths-with-jme</id>
        <updated>2015-07-14T23:00:00Z</updated>
        <summary type="html"><![CDATA[<p>Write maths, see maths applied to JME expressions from Numbas.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                
                    <p>Write maths, see maths applied to JME expressions from Numbas.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Sequences</title>
        <link href="https://somethingorotherwhatever.com/items/sequences"/>
        <id>https://somethingorotherwhatever.com/items/sequences</id>
        <updated>2015-06-04T15:35:01Z</updated>
        <summary type="html"><![CDATA[<p>a numbers-in-a-grid game</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/sequences/main.png" />
                
                
                    <h1>sequences</h1>
<p>A numbers-in-a-grid game.</p>
<h2>Licence</h2>
<p>Copyright 2015 Christian Lawson-Perfect</p>
<p>Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at</p>
<pre><code>http://www.apache.org/licenses/LICENSE-2.0
</code></pre>
<p>Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>three.onefouronefivenine.com</title>
        <link href="https://somethingorotherwhatever.com/items/three-onefouronefivenine-com"/>
        <id>https://somethingorotherwhatever.com/items/three-onefouronefivenine-com</id>
        <updated>2015-03-14T00:00:00Z</updated>
        <summary type="html"><![CDATA[<p>A page that scrolls the digits of π endlessly, using Gosper's spigot algorithm.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <video autoplay src="https://somethingorotherwhatever.com/items/three-onefouronefivenine-com/main.mp4"></video>
                
                
                    <p>A page that scrolls the digits of π endlessly, using Gosper's spigot algorithm.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Wolfram|Alpha can’t. But CP can!</title>
        <link href="https://somethingorotherwhatever.com/items/wolfram-alpha-cant-but-cp-can"/>
        <id>https://somethingorotherwhatever.com/items/wolfram-alpha-cant-but-cp-can</id>
        <updated>2015-03-02T16:46:53Z</updated>
        <summary type="html"><![CDATA[<p>Christian Perfect has turned into a one-man plug for the holes in Wolfram|Alpha.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/wolfram-alpha-cant-but-cp-can/main.png" />
                
                
                    <p>Christian Perfect has turned into a one-man plug for the holes in Wolfram|Alpha.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Word Lock</title>
        <link href="https://somethingorotherwhatever.com/items/word-lock"/>
        <id>https://somethingorotherwhatever.com/items/word-lock</id>
        <updated>2015-02-02T09:53:17Z</updated>
        <summary type="html"><![CDATA[<p>The Word Lock puzzle from February 2015's puzzlebomb</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/word-lock/main.png" />
                
                
                    <p>The Word Lock puzzle from February 2015's puzzlebomb</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Polynomials extension for Numbas</title>
        <link href="https://somethingorotherwhatever.com/items/polynomials-extension-for-numbas"/>
        <id>https://somethingorotherwhatever.com/items/polynomials-extension-for-numbas</id>
        <updated>2015-01-20T16:40:55Z</updated>
        <summary type="html"><![CDATA[<p>An extension for Numbas which provides a "polynomial" data type and associated operations</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                
                    <h1>Polynomials extension for Numbas</h1>
<p>This extension provides a new data type and some functions to deal with polynomials</p>
<h2>JME data type</h2>
<p>This extension adds a new JME data type <code>Numbas.jme.types.polynomial</code>, representing a polynomial in a given variable.</p>
<h2>JME functions</h2>
<h3><code>polynomial(expression in one variable)</code></h3>
<p>Create a polynomial, automatically detecting the variable name from the expression. 
This is quite strict about what it accepts - only one variable name, and coefficients and degrees have to be literal numbers, not calculations or references to other variables.</p>
<p>You can either write a literal expression, or pass a string.
Note that if you use a literal expression, variables defined in the scope are substituted in. It's safer to use a string.</p>
<h4>Examples</h4>
<ul>
<li><code>polynomial(x^2-2x+3)</code></li>
<li><code>polynomial("5*x^4 + 2*x")</code></li>
</ul>
<h3><code>polynomial(variable_name,coefficients)</code></h3>
<p>Create a polynomial in the given variable, with the given coefficients (<code>coefficients[i]</code> is the coefficient of <code>variable_name^i</code>). Example: <code>polynomial(x,[-1,0,1])</code> represents the polynomial <code>x^2-1</code>.</p>
<h3><code>mod_polynomial(expression,m)</code> or <code>mod_polynomial(variable_name,coefficients,m)</code></h3>
<p>As above, but all operations on this polynomial will be calculated modulo <code>m</code>. </p>
<h3><code>p1+p2</code></h3>
<p>Add two polynomials</p>
<h3><code>p1+n</code> or <code>n+p1</code></h3>
<p>Add a constant to a polynomial - more convenient than <code>p+polynomial(n)</code>.</p>
<h3><code>p1-p2</code></h3>
<p>Subtract <code>p2</code> from <code>p1</code></p>
<h3><code>p1-n</code> or <code>n-p1</code></h3>
<p>Subtract a constant from a polynomial (or vice versa) - more convenient than <code>p-polynomial(n)</code>.</p>
<h3><code>p1*p2</code></h3>
<p>Multiply two polynomials</p>
<h3><code>p1*n or n*p1</code></h3>
<p>Multiply a polynomial by a constant - more convenient than <code>p*polynomial(n)</code>.</p>
<h3><code>p^n</code></h3>
<p>Take polynomial <code>p</code> to the <code>n</code>th (integer, non-negative) power.</p>
<h3><code>quotient(p1,p2)</code></h3>
<p>Divide <code>p1</code> by <code>p2</code>, and throw away the remainder (polynomial quotient of <code>p1</code> and <code>p2</code>)</p>
<h3><code>remainder(p1,p2)</code></h3>
<p>Remainder when dividing <code>p1</code> by <code>p2</code>.</p>
<h3><code>mod(p,n)</code></h3>
<p>Take each coefficient of <code>p</code> mod <code>n</code>.</p>
<h3><code>degree(p)</code></h3>
<p>Degree of <code>p</code> - highest power of the variable with a non-zero coefficient.</p>
<h3><code>p1=p2</code></h3>
<p>Are <code>p1</code> and <code>p2</code> equal? True if all the coefficients match.</p>
<h3><code>p[d]</code></h3>
<p>Coefficient of <code>x^d</code> in <code>p</code>.</p>
<h3><code>eval(p,x)</code></h3>
<p>Evaluate the polynomial at the given point.</p>
<h3><code>expr(p)</code></h3>
<p>A JME expression equivalent to the given polynomial; you can substitute this into the correct answer for a "Mathematical expression" part, for example.</p>
<h3><code>string(p)</code></h3>
<p>A string representation of the polynomial.</p>
<h3><code>latex(p)</code></h3>
<p>A LaTeX representation of the polynomial.</p>
<h3><code>long_division(p1,p2)</code></h3>
<p>LaTeX rendering of the long division of <code>p1</code> by <code>p2</code>.</p>
<h2>JavaScript functions</h2>
<p><strong>Base object: <code>Numbas.extensions.polynomials.Polynomial</code></strong> </p>
<p>(set it to a more convenient name, e.g. <code>var poly = Numbas.extensions.polynomials.Polynomial</code>)</p>
<h3><code>new Polynomial(variable_name,coefficients,[modulo])</code></h3>
<p><code>coefficients</code> is a dictionary of <code>degree → coefficient</code>. If <code>modulo</code> is given, all coefficients will be reduced modulo that number in any calculations using this polynomial.</p>
<h3><code>Polynomial.from_tree(tree,[modulo])</code></h3>
<p>Create a polynomial object from a compiled JME tree</p>
<h3><code>Polynomial.from_string(expr,[modulo])</code></h3>
<p>Create a polynomial object from a JME string</p>
<h2><code>Polynomial</code> object methods</h2>
<h3><code>p.evaluate(x)</code></h3>
<p>Evaluate at point <code>x</code> to a number</p>
<h3><code>p.toLaTeX()</code></h3>
<p>Render as a LaTeX string</p>
<h3><code>p.isZero()</code></h3>
<p>Is this polynomial zero?</p>
<h3><code>p.degree()</code></h3>
<p>Degree of highest power term in <code>p</code> with a non-zero coefficient</p>
<h3><code>p.negate()</code></h3>
<p>Negate every coefficient of <code>p</code> (returns a new polynomial)</p>
<h3><code>p1.add(p2)</code></h3>
<p>Add <code>p1</code> to <code>p2</code></p>
<h3><code>p1.sub(p2)</code></h3>
<p>Subtract <code>p2</code> from <code>p1</code></p>
<h3><code>p1.mul(p2)</code></h3>
<p>Mutliply <code>p1</code> by <code>p2</code></p>
<h3><code>p.pow(n)</code></h3>
<p><code>n</code>th power of <code>p</code></p>
<h3><code>p.scale(n)</code></h3>
<p>Multiply <code>p</code> by constant <code>n</code></p>
<h3><code>p.add_degree(n)</code></h3>
<p>Add <code>n</code> to the degree of each term of <code>p</code></p>
<h3><code>p1.div(p2)</code></h3>
<p>Divide <code>p1</code> by <code>p2</code>. Returns an object <code>{quotient: &lt;polynomial&gt;, remainder: &lt;polynomial&gt;}</code></p>
<h3><code>p.mod(n)</code></h3>
<p>Take each coefficient of <code>p</code> mod <code>n</code> (returns a new polynomial object)</p>
<h3><code>p1.eq(p2)</code></h3>
<p>Are <code>p1</code> and <code>p2</code> equal?</p>
<h3><code>p.coefficient(d)</code></h3>
<p>Coefficient of <code>x^d</code> in <code>p</code>.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Word game</title>
        <link href="https://somethingorotherwhatever.com/items/word-game"/>
        <id>https://somethingorotherwhatever.com/items/word-game</id>
        <updated>2015-01-16T15:24:08Z</updated>
        <summary type="html"><![CDATA[<p>A ripoff of a word game</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                
                    <p>A ripoff of a word game</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Wordsearch generator</title>
        <link href="https://somethingorotherwhatever.com/items/wordsearch-generator"/>
        <id>https://somethingorotherwhatever.com/items/wordsearch-generator</id>
        <updated>2014-12-16T11:34:31Z</updated>
        <summary type="html"><![CDATA[<p>Given a list of words, generates a wordsearch.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/wordsearch-generator/main.png" />
                
                
                    <p>Given a list of words, generates a wordsearch.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Watch out! I’m a blue whale and I’m about to land on you!</title>
        <link href="https://somethingorotherwhatever.com/items/watch-out-im-a-blue-whale-and-im-about-to-land-on-you"/>
        <id>https://somethingorotherwhatever.com/items/watch-out-im-a-blue-whale-and-im-about-to-land-on-you</id>
        <updated>2014-11-20T12:15:03Z</updated>
        <summary type="html"><![CDATA[<p>Christian investigates the possibility of a moving whale being able to warn you it’s coming.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/watch-out-im-a-blue-whale-and-im-about-to-land-on-you/main.png" />
                
                
                    <p>Christian investigates the possibility of a moving whale being able to warn you it’s coming.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Apparently I’m not a maths genius (or, On the Subject of Parcel Sizes)</title>
        <link href="https://somethingorotherwhatever.com/items/apparently-im-not-a-maths-genius-or-on-the-subject-of-parcel-sizes"/>
        <id>https://somethingorotherwhatever.com/items/apparently-im-not-a-maths-genius-or-on-the-subject-of-parcel-sizes</id>
        <updated>2014-11-19T14:30:19Z</updated>
        <summary type="html"><![CDATA[<p>Christian investigates the mystery of Hermes’ maximum parcel dimensions.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                
                    <p>Christian investigates the mystery of Hermes’ maximum parcel dimensions.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Linear codes extension for Numbas</title>
        <link href="https://somethingorotherwhatever.com/items/linear-codes-extension-for-numbas"/>
        <id>https://somethingorotherwhatever.com/items/linear-codes-extension-for-numbas</id>
        <updated>2014-11-13T14:43:13Z</updated>
        <summary type="html"><![CDATA[<p>This Numbas extension adds stuff to work with linear codes.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                
                    <h1>Linear codes extension for Numbas</h1>
<p>This extension provides a new data type and some functions to deal with linear codes.</p>
<p>A <a href="https://numbas.mathcentre.ac.uk/exam/2785/coding-theory/">collection of questions created using this extension</a> is available to reuse.</p>
<h2>JME data types</h2>
<p>This extension adds two new JME data types, <code>Numbas.jme.types.codeword</code> and <code>Numbas.jme.types.code</code>.</p>
<h2>JME functions</h2>
<h3><code>codeword(digits,field_size)</code></h3>
<p>Create a codeword from a list or vector of digits, in Z_{field_size}. For example, <code>codeword([1,1,0,1],2)</code></p>
<h3><code>codeword(word_string,field_size)</code></h3>
<p>Create a codeword from a string of digits, in Z_{field_size}. For example, <code>codeword("11001",2)</code></p>
<h3><code>zero(word_length,field_size)</code></h3>
<p>The zero word of the given length in the field Z_{field_size}.</p>
<h3><code>is_zero(word)</code></h3>
<p>Is <code>word</code> a zero word (are all its digits 0)?</p>
<h3><code>latex(codeword)</code></h3>
<p>A LaTeX rendering of the given codeword.</p>
<h3><code>word1+word2</code></h3>
<p>Add two codewords. </p>
<h3><code>word1-word2</code></h3>
<p>Subtract one codeword from another.</p>
<h3><code>n*word</code> or <code>word*n</code></h3>
<p>Multiply a codeword by a scalar.</p>
<h3><code>word[n]</code></h3>
<p>nth digit of codeword.</p>
<h3><code>word[m..n]</code></h3>
<p>List of mth to nth digits of codeword.</p>
<h3><code>weight(w)</code></h3>
<p>Hamming weight of the word.</p>
<h3><code>allwords(word_length,field_size)</code></h3>
<p>Generate a list of all codewords of given length in Z_{field_size}.</p>
<h3><code>random_word(word_length,field_size)</code></h3>
<p>Pick a random word of given length in Z_{field_size}.</p>
<h3><code>random_combination(words)</code></h3>
<p>A random linear combination of the given words (from the field <code>Z_p</code>), i.e. <code>a_0*w_0 + a_1*w_1 + ... + a_n*w_n</code> where the <code>a_i</code> are elements of the field <code>Z_p</code>.</p>
<h3><code>set_generated_by(basis)</code></h3>
<p>Returns the set of codewords generated by the given list of basis codewords.</p>
<h3><code>is_generated_by(basis,words)</code></h3>
<p>Can all of the given words be written as a linear combination of the words in <code>basis</code>?</p>
<h3><code>linearly_independent(basis)</code></h3>
<p>Are the given codewords linearly independent? (it checks that the set generated by the basis contains <code>(field_size)^(number of basis words)</code> words)</p>
<h3><code>coset_containing(word,basis)</code></h3>
<p>Generate the coset containing the given word, with respect to the given generating set.</p>
<h3><code>slepian_array(basis)</code></h3>
<p>Generate the Slepian array corresponding to the given basis set. Each row in the result is a coset, sorted by weight.</p>
<h3><code>is_coset_leader(word,basis)</code></h3>
<p>Is the given word a coset leader in its coset? That is, does it have the minimum weight?</p>
<h3><code>generator_matrix(words)</code></h3>
<p>A minimal set of generators for the linear code generated by the given words. If the words are linearly independent, you'll get the same number of words back, otherwise you'll get fewer.</p>
<h3><code>parity_check_matrix(basis)</code></h3>
<p>Create a parity check matrix for the given generating set, by putting it in reduced row-echelon form <code>I_n|A</code> and returning <code>-A_transpose|I_(m)</code>.</p>
<h3><code>lexicographic_parity_check_matrix(words)</code></h3>
<p>Create a parity check matrix for the given generating set, with columns in lexicographic order.</p>
<h3><code>hamming_parity_check_matrix(p,r)</code></h3>
<p>Create a parity check matrix for the Hamming code <code>Ham_p(r)</code>. (<code>p</code> must be prime)</p>
<h3><code>hamming_generating_matrix(p,r)</code></h3>
<p>Create a generating matrix for the Hamming code <code>Ham_p(r)</code>. (<code>p</code> must be prime)</p>
<h3><code>syndrome(word,pcm)</code></h3>
<p>Compute the syndrome of the given word with respect to the given parity check matrix.</p>
<h3><code>reduced_row_echelon_form(basis)</code></h3>
<p>Put the given list of words (interpreted as a matrix) into reduced row-echelon form.</p>
<h3><code>codeword_matrix(words)</code></h3>
<p>Returns a matrix whose rows are the given codewords.</p>
<h3><code>hamming_square_encode(word)</code></h3>
<p>Encode <code>word</code> using Hamming's square code.</p>
<h3><code>hamming_square_decode(word)</code></h3>
<p>Decode (and correct up to one error in) <code>word</code> using Hamming's square code.</p>
<h3><code>hamming_encode(word)</code></h3>
<p>Encode <code>word</code> using the general Hamming code.</p>
<h3><code>hamming_decode(word)</code></h3>
<p>Decode (and correct up to one error in) <code>word</code> using the general Hamming code.</p>
<h3><code>hamming_distance(word1,word2)</code></h3>
<p>Hamming distance between two codewords.</p>
<h3><code>hamming_ball(word,radius)</code></h3>
<p>All words within given Hamming distance of the given codeword.</p>
<h3><code>hamming_sphere(word,radius)</code></h3>
<p>All words at given Hamming distance from the given codeword.</p>
<h3><code>concat([words])</code></h3>
<p>Concatenate a list of codewords into one codeword.</p>
<h3><code>len(word)</code></h3>
<p>Length of a codeword.</p>
<h3><code>error(word,position)</code></h3>
<p>Introduce an error (change a digit) at the given position. Returns a new codeword.</p>
<h3><code>check_array(word)</code></h3>
<p>Returns a LaTeX check-array for the given word, from a Hamming square code.</p>
<h3><code>string(word)</code></h3>
<p>String representation of a codeword.</p>
<h3><code>latex(word)</code></h3>
<p>LaTeX representation of a codeword.</p>
<h3><code>code([words])</code></h3>
<p>Create a code from a complete set of codewords.</p>
<h3><code>allwords(code)</code></h3>
<p>All words belonging to the given code.</p>
<h3><code>minimum_distance(code)</code></h3>
<p>Minimum Hamming distance between words in code.</p>
<h3><code>information_rate(code)</code></h3>
<p>A code's information rate</p>
<h3><code>len(code)</code></h3>
<p>Number of words in code.</p>
<h3><code>code[n]</code></h3>
<p>nth word in code. (in the order used when you created the code object)</p>
<h3><code>code[m..n]</code></h3>
<p>List of the mth to nth words in code.</p>
<h3><code>positional_permutation(code,positions)</code></h3>
<p>Permute the positions of the digits in code's words, following the given order.</p>
<h3><code>symbolic_permutation(code,symbols)</code></h3>
<p>Permute the symbols in code's words, following the given order. <code>symbols</code> is a list giving a permutation for each digit. That is, <code>symbols[i][j]</code> says what symbol <code>j</code> should change to when in position <code>i</code>.</p>
<h3><code>equivalent(code1,code2)</code></h3>
<p>Can <code>code2</code> be obtained from <code>code1</code> by a combination of positional and symbolic permutations?</p>
<h3><code>find_equivalence(code1,code2)</code></h3>
<p>If <code>code1</code> is equivalent to <code>code2</code>, find a combination of positional and symbolic permutations that maps <code>code1</code> to <code>code2</code>.</p>
<p>Returns a dictionary with keys <code>"positional_permutation"</code> and <code>"symbolic_permutation"</code> when the codes are equivalent, and <code>nothing</code> if they're not.</p>
<h3><code>find_positional_equivalence(code1,code2)</code>.</h3>
<p>If <code>code1</code> is positionally equivalent to <code>code2</code>, find a positional permutation that maps <code>code1</code> to <code>code2</code>.</p>
<p>Returns a list representing a permutation of codeword digits when the codes are positionally equivalent, and <code>nothing</code> if they're not.</p>
<h3><code>find_symbolic_equivalence(code1,code2)</code>.</h3>
<p>If <code>code1</code> is symbolically equivalent to <code>code2</code>, find a symbolic permutation that maps <code>code1</code> to <code>code2</code>.</p>
<p>Returns a list representing a permutation of the symbols for each codeword digits when the codes are symbolically equivalent, and <code>nothing</code> if they're not.</p>
<h3><code>distance_equivalent(code1,code2)</code></h3>
<p>Is there an isomorphism between the Hamming distance tables of <code>code1</code> and <code>code2</code>?</p>
<p>Returns <code>true</code> if there is a permutation of the rows and columns of the Hamming distance table of <code>code1</code> that produces the table for <code>code2</code>.</p>
<h3><code>hamming_bound(field_size,word_length,errors_corrected)</code></h3>
<p>Hamming bound on the maximum number of codewords in a code with the given parameters.</p>
<h3><code>singleton_bound(field_size,word_length,minimum_distance)</code></h3>
<p>Singleton bound on the maximum number of codewords in a code with the given parameters.</p>
<h3><code>gilbert_varshamov_bound(field_size,word_length,minimum_distance)</code></h3>
<p>Gilbert-Varshamov bound on the minimum number of codewords in a code with the given parameters.</p>
<h2>JavaScript functions</h2>
<p>Everything lives under <code>Numbas.extensions.codewords</code>, which I'll omit from now on.</p>
<h3><code>Codeword(digits,field_size)</code></h3>
<p>Create a codeword with the given digits, belonging to the field <code>Z_{field_size}</code>.</p>
<h4><code>Codeword</code> methods</h4>
<h5><code>word.toString()</code></h5>
<p>String representation of the word.</p>
<h5><code>word.toLaTeX()</code></h5>
<p>LaTeX representation of the word.</p>
<h5><code>word.toJME()</code></h5>
<p>JME representation of the word.</p>
<h5><code>word.isZero()</code></h5>
<p>Is the word zero (are all its digits 0)?</p>
<h5><code>word.eq(word2)</code></h5>
<p>Is this word the same as <code>word2</code>?</p>
<h5><code>word.add(word2)</code></h5>
<p>Return a new word which is the sum of this word and <code>word2</code>.</p>
<h5><code>word.sub(word2)</code></h5>
<p>Subtract <code>word2</code> from this word (returns a new codeword object).</p>
<h5><code>word.negate()</code></h5>
<p>Negate this word: <code>w.add(w.negate()) = 0</code>.</p>
<h5><code>word.scale(n)</code></h5>
<p>Scale this word by <code>n</code> - multiply every digit by <code>n</code>.</p>
<h5><code>word.weight()</code></h5>
<p>Hamming weight of this word - number of non-zero digits.</p>
<h5><code>word.LaTeX_check_array()</code></h5>
<p>LaTeX rendering of a Hamming square code check array for this word (only makes sense if this word is a 9-digit binary word)</p>
<h5><code>word.hamming_ball(radius)</code></h5>
<p>Find all words within <code>radius</code> Hamming distance of this word.</p>
<h5><code>word.hamming_sphere(radius)</code></h5>
<p>Find all words with Hamming distance exactly <code>radius</code> from this word.</p>
<h4>Static methods of the <code>Codeword</code> class</h4>
<h5><code>fromString(str,field_size)</code></h5>
<p>Create a codeword object from a string representation, e.g. <code>Codeword.fromString("01001",2)</code>.</p>
<h5><code>sort(w1,w2)</code></h5>
<p>Comparison function to sort codewords lexicographically.</p>
<h5><code>eq(w1,w2)</code></h5>
<p>Equivalent to <code>w1.eq(w2)</code>.</p>
<h3><code>zero_word(word_length,field_size)</code></h3>
<p>Create a zero word with the given length in the field <code>Z_{field_size}</code>.</p>
<h3><code>allwords(word_length,field_size)</code></h3>
<p>Get all words of the given length in the field <code>Z_{field_size}</code>.</p>
<h3><code>random_word(word_length,field_size)</code></h3>
<p>Get a random word of the given length in the field <code>Z_{field_size}</code>.</p>
<h3><code>random_combination(basis)</code></h3>
<p>A random linear combination of the given words (from the field <code>Z_p</code>), i.e. <code>a_0*w_0 + a_1*w_1 + ... + a_n*w_n</code> where the <code>a_i</code> are elements of the field <code>Z_p</code>.</p>
<h3><code>set_generated_by(words)</code></h3>
<p>Get all words generated by the given basis set.</p>
<h3><code>is_generated_by(basis,words)</code></h3>
<p>Can all of the given words be written as a linear combination of the words in <code>basis</code>?</p>
<h3><code>linearly_independent(words)</code></h3>
<p>Are all of the given words linearly independent of each other?</p>
<p>Words are linearly independent if <code>l1*w1 + l2*w2 + .. +ln*wn = 0</code> has no solution other than <code>l1=l2=...=ln=0</code>.</p>
<h3><code>coset_containing(word,basis)</code></h3>
<p>Generate the coset containing the given word, with respect to the given generating set.</p>
<h3><code>slepian_array(basis)</code></h3>
<p>Generate the Slepian array corresponding to the given basis set. Each row in the result is a coset, sorted by weight.</p>
<h3><code>is_coset_leader(word,basis)</code></h3>
<p>Is the given word a coset leader in its coset? That is, does it have the minimum weight?</p>
<h3><code>hamming_distance(word1,word2)</code></h3>
<p>Hamming distance between two words.</p>
<h3><code>reduced_row_echelon_form(basis)</code></h3>
<p>Put the given list of words (interpreted as a matrix) into reduced row-echelon form by reordering and taking linear combinations.</p>
<h3><code>generator_matrix(words)</code></h3>
<p>A minimal set of generators for the linear code generated by the given words. If the words are linearly independent, you'll get the same number of words back, otherwise you'll get fewer.</p>
<h3><code>parity_check_matrix(basis)</code></h3>
<p>A parity check matrix for the given generating set (which should be linearly independent)</p>
<h3><code>lexicographic_parity_check_matrix(basis)</code></h3>
<p>A parity check matrix for the given generating set, with columns in lexicographic order.</p>
<h3><code>hamming_square_encode(word)</code></h3>
<p>Encode <code>word</code> using Hamming's square code.</p>
<h3><code>hamming_square_decode(word)</code></h3>
<p>Decode (and correct up to one error in) <code>word</code> using Hamming's square code.</p>
<h3><code>hamming_encode(word)</code></h3>
<p>Encode <code>word</code> using the general Hamming code.</p>
<h3><code>hamming_decode(word)</code></h3>
<p>Decode (and correct up to one error in) <code>word</code> using the general Hamming code.</p>
<h3><code>syndrome(word,pcm)</code></h3>
<p>Compute the syndrome of the given word with respect to the given parity check matrix.</p>
<h3><code>hamming_parity_check_matrix(p,r)</code></h3>
<p>Create a parity check matrix for the Hamming code <code>Ham_p(r)</code>. (<code>p</code> must be prime)</p>
<h3><code>hamming_generating_matrix(p,r)</code></h3>
<p>Create a generating matrix for the Hamming code <code>Ham_p(r)</code>. (<code>p</code> must be prime)</p>
<p><code>Ham_p(r)</code> is the <code>p</code>-ary Hamming code whose PCM has <code>r</code> rows</p>
<h3><code>Code(words)</code></h3>
<p>A wrapper object for the code containing the given words.</p>
<h4><code>Code</code> methods</h4>
<h5><code>code.toString()</code></h5>
<p>String representation of the code - list all its words.</p>
<h5><code>code.toLaTeX()</code></h5>
<p>LaTeX representation of the code.</p>
<h5><code>code.toJME()</code></h5>
<p>JME representation of the code.</p>
<h5><code>code.eq(code2)</code></h5>
<p>Is this code the same as <code>code2</code>? True if they have exactly the same words.</p>
<h5><code>code.contains(word)</code></h5>
<p>Does this code contain <code>word</code>?</p>
<h5><code>code.find_equivalence(code2)</code></h5>
<p>If this code is equivalent to <code>code2</code>, return an object <code>{positional_permutation, symbolic_permutation}</code>. If not, return <code>null</code>.</p>
<p>Two codes are equivalent if we can get from one to the other by a combination of positional and symbolic permutations.</p>
<h5><code>code.equivalent(code2)</code></h5>
<p>Is this code equivalent to <code>code2</code> - can you get from one to the other by performing positional and symbolic permutations on the digits of the codewords?</p>
<h5><code>code.minimum_distance()</code></h5>
<p>The minimum Hamming distance between any pair of words in this code.</p>
<h5><code>code.information_rate()</code></h5>
<p>Information rate of the code: <code>log(number of words)/(log(2)*word length)</code></p>
<h5><code>code.positional_permutation(order)</code></h5>
<p>Perform a positional permutation on the words in the code. <code>order</code> is a list, where column <code>i</code> is sent to <code>order[i]</code>. Returns a new <code>Code</code> object.</p>
<h5><code>code.symbolic permutation(symbols)</code></h5>
<p>Perform a symbolic permutation on the words in the code. <code>symbols</code> is a list of permutations for each digit, where symbol <code>j</code> in position <code>i</code> is changed to <code>symbols[i][j]</code>. Returns a new <code>Code</code> object.</p>
<h3><code>hamming_bound(field_size,word_length,errors_corrected)</code></h3>
<p>Hamming bound on the maximum number of codewords in a code with the given parameters.</p>
<h3><code>singleton_bound(field_size,word_length,minimum_distance)</code></h3>
<p>Singleton bound on the maximum number of codewords in a code with the given parameters.</p>
<h3><code>gilbert_varshamov_bound(field_size,word_length,minimum_distance)</code></h3>
<p>Gilbert-Varshamov bound on the minimum number of codewords in a code with the given parameters.</p>
<h2>Marking functions</h2>
<h3><code>mark_codeword_set(part,field_size,fn)</code></h3>
<p>To be used on a "match text pattern" part, where the student's answer is a list of codewords separated by commas.</p>
<p>Checks that the student's answer is valid, and parses it to a list of <code>Codeword</code> objects in the given field, then calls <code>fn(words)</code>. In <code>fn</code>, <code>this</code> refers to the given <code>part</code> object.</p>
<h3><code>validate_codeword_set(part)</code></h3>
<p>Validate a part marked by the above function. Shows a warning message if the student's answer can't be interpreted as a list of codewords separated by commas.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Download scores report for Moodle SCORM</title>
        <link href="https://somethingorotherwhatever.com/items/download-scores-report-for-moodle-scorm"/>
        <id>https://somethingorotherwhatever.com/items/download-scores-report-for-moodle-scorm</id>
        <updated>2014-10-16T13:24:12Z</updated>
        <summary type="html"><![CDATA[<p>This report provides buttons to download a spreadsheet of scores for a SCORM package. It differs from the basic report by giving the total score in raw marks and percentage, as well as scores for each SCORM objective (called "question").</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                
                    <h1>Download scores report for Moodle SCORM</h1>
<p>This report provides buttons to download a spreadsheet of scores for a SCORM package. It differs from the basic report by giving the total score in raw marks and percentage, as well as scores for each SCORM objective (called "question").</p>
<p>It's designed for Numbas tests, so it assumes there's only one SCO and that objectives map to questions.</p>
<h2>Installation</h2>
<p>Clone this repository into <code>mod/scorm/report/download_scores</code>, then go to <em>Site administration &rarr; Notifications</em> and click to install it.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Moodle availability_username plugin</title>
        <link href="https://somethingorotherwhatever.com/items/moodle-availability-username-plugin"/>
        <id>https://somethingorotherwhatever.com/items/moodle-availability-username-plugin</id>
        <updated>2014-10-14T13:09:54Z</updated>
        <summary type="html"><![CDATA[<p>Moodle availability condition plugin. Allows you to restrict access to course sections or activities by username.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                
                    <h1>availability_username</h1>
<p>Moodle availability condition plugin. Allows you to restrict access to course sections or activities by username.</p>
<h2>Installation</h2>
<p>Clone into <code>availability/condition/username</code>. Go to "Site administration -&gt; Notifications" and click to install the plugin.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Permutation groups extension for Numbas</title>
        <link href="https://somethingorotherwhatever.com/items/permutation-groups-extension-for-numbas"/>
        <id>https://somethingorotherwhatever.com/items/permutation-groups-extension-for-numbas</id>
        <updated>2014-09-04T13:55:23Z</updated>
        <summary type="html"><![CDATA[<p>Permutation groups extension for Numbas</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                
                    <h1>Permutation groups extension for Numbas</h1>
<p>This extension adds a new data type to the Numbas JME system, representing elements of permutation groups (really, just S_infinity, but you can pretend you're working in an S_n).</p>
<p>Permutations are stored as bijections on the natural numbers.</p>
<p>The symbol for the identity permutation is <code>e</code> by default. You can change this by setting <code>Numbas.extensions.permutations.identity_symbol</code> in the question preamble.</p>
<h2>JME data type</h2>
<p>This extension adds a new JME data type, <code>Numbas.jme.types.permutation</code>, representing a permutation.</p>
<h2>JME Functions</h2>
<h3><code>permutation(map)</code> or <code>perm(map)</code></h3>
<p>Create a permutation. <code>map</code> is a list of numbers. <code>map[i]</code> is the image of <code>i</code> under the permutation.</p>
<p><strong>Note</strong>: Because lists are zero-indexed, the first element is <code>0</code>, not <code>1</code>.</p>
<p><strong>Example</strong>: <code>permutation([1,0])</code> is the permutation swapping the first two elements and will be displayed in cycle notation as <code>(1,2)</code>.</p>
<h3><code>permutation(str)</code> or <code>perm(str)</code></h3>
<p>Create a permutation. <code>str</code> is a permutation in disjoint cycle notation.</p>
<p><strong>Example</strong>: <code>permutation("(1,2)(3,4,5)")</code></p>
<h2><code>transposition(a,b)</code></h2>
<p>A permutation representing the transposition of the elements <code>a</code> and <code>b</code>.</p>
<h3><code>rotation(n,r)</code></h3>
<p>Create a permutation representing a rotation of the numbers <code>1</code> to <code>n</code> by <code>r</code> places.
If <code>r</code> is not given it defaults to <code>1</code>.</p>
<h3><code>flip(n)</code></h3>
<p>Create a permutation representing a reflection of the numbers <code>1</code> to <code>n</code>.</p>
<h3><code>compose(p1,p2)</code> or <code>p1*p2</code></h3>
<p>Compose permutations. The action is on the left - <code>(p1*p2)[x] = p1[p2[x]]</code>.</p>
<h3><code>p^n</code></h3>
<p>The <code>n</code>th power of <code>p</code>. <code>p^0</code> is the identity permutation.</p>
<h3><code>p[x]</code></h3>
<p>Apply permutation <code>p</code> to the number <code>x</code>. 
Consider <code>p</code> as an element of <code>S_n</code>; any <code>x</code> greater than or equal to <code>n</code> is mapped to itself.</p>
<h3><code>inverse(p)</code></h3>
<p>Returns the inverse of permutation <code>p</code>.</p>
<h3><code>even(p)</code></h3>
<p>Is <code>p</code> an even permutation (can it be written as a product of an even number of transpositions?)</p>
<h3><code>size(p)</code></h3>
<p>The largest number <code>n</code> that is permuted by <code>p</code>, or equivalently, the smallest <code>n</code> such that <code>p</code> is a member of <code>S_n</code>.</p>
<h3><code>order(p)</code></h3>
<p>The order of <code>p</code>: the smallest power of <code>p</code> equivalent to the identity permutation.</p>
<h3><code>cycles(p)</code></h3>
<p>Calculate all of <code>p</code>'s cycles. Returns a list of lists of numbers.</p>
<h3><code>nontrivial_cycles(p)</code></h3>
<p>Calculate all of <code>p</code>'s cycles of length greater than 1.</p>
<h3><code>show(p)</code></h3>
<p>Render <code>p</code> as a TeX string (just substituting <code>p</code> into a TeX expression will also work, but you can use this if you want to manipulate the TeX string somehow)</p>
<h3><code>twoline(p)</code></h3>
<p>Render <code>p</code> in two-line form (numbers 1..n on top row, their images on the bottom) as a TeX string</p>
<h3><code>as_transpositions(p)</code></h3>
<p>Render <code>p</code> as a product of transpositions, in TeX.</p>
<h3><code>p1=p2</code></h3>
<p>Are <code>p1</code> and <code>p2</code> the same permutation? True if <code>p1*inverse(p2)</code> maps <code>n</code> to <code>n</code> for all <code>n</code>.</p>
<h3><code>is_disjoint(str)</code></h3>
<p>Returns true if <code>str</code> is a representation of a permutation as disjoint cycles (no two cycles have an element in common).</p>
<h3><code>is_transpositions(str)</code></h3>
<p>Returns true if <code>str</code> is a representation of a permutation as transpositions (each cycle has length 2).</p>
<h3><code>is_rotation(p)</code></h3>
<p>Returns true if <code>p</code> is a rotation, i.e. a permutation of the form <code>f: i -&gt; (i+x) mod N</code>, for some 0&lt; x &lt; N.</p>
<h3><code>is_flip(p)</code></h3>
<p>Returns true if <code>p</code> is a flipped rotation, i.e. a permutation of the form <code>f: i -&gt; (x-i) mod N</code>, for some 0</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>swirlograph</title>
        <link href="https://somethingorotherwhatever.com/items/swirlograph"/>
        <id>https://somethingorotherwhatever.com/items/swirlograph</id>
        <updated>2014-08-27T23:00:00Z</updated>
        <summary type="html"><![CDATA[<p>Looks like some wiggly worms swirling round a vector field. Made with p5.js.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <video autoplay src="https://somethingorotherwhatever.com/items/swirlograph/main.mp4"></video>
                
                
                    <p>Looks like some wiggly worms swirling round a vector field. Made with p5.js.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Content MathML to Presentation MathML for MathJax</title>
        <link href="https://somethingorotherwhatever.com/items/content-mathml-to-presentation-mathml-for-mathjax"/>
        <id>https://somethingorotherwhatever.com/items/content-mathml-to-presentation-mathml-for-mathjax</id>
        <updated>2014-04-04T14:21:24Z</updated>
        <summary type="html"><![CDATA[<p>A JavaScript implementation of David Carlisle's tool to convert Content MathML to Presentation MathML. I made this as contract work for MathJax.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                
                    <h1>ctop</h1>
<p>A JavaScript implementation of David Carlisle's Content-to-PresentationMathML xsl</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>MathJax in Twine</title>
        <link href="https://somethingorotherwhatever.com/items/mathjax-in-twine"/>
        <id>https://somethingorotherwhatever.com/items/mathjax-in-twine</id>
        <updated>2014-03-29T17:14:51Z</updated>
        <summary type="html"><![CDATA[<p>A couple of macros which let you use MathJax to render LaTeX in Twine stories</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                
                    <h1>Twine MathJax macros</h1>
<p>A couple of macros that let you use <a href="http://www.mathjax.org">MathJax</a> to render LaTeX in a <a href="http://twinery.org">Twine</a> story.</p>
<h2>To use</h2>
<p>In your <strong>StoryIncludes</strong> passage, add the line</p>
<p><code>mathjax.twee</code></p>
<p>and either make sure that that file is in the same directory as your story file, or use its full path.</p>
<p>For inline maths, use <code>&lt;&lt;math&gt;&gt;</code>.</p>
<p>For display maths, use <code>&lt;&lt;dmath&gt;&gt;</code>.</p>
<h2>Example</h2>
<p><code>&lt;&lt;math e^{i \pi} + 1 = 0 &gt;&gt;</code></p>
<p>There's an example story in <code>mathjax-demo.tws</code>. You can play it at <a href="http://christianp.github.io/mathjax-twine">christianp.github.io/mathjax-twine</a>.</p>
<h2>Licence</h2>
<p>Public domain or Apache 2.0. I don't care how you use this!</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Regex fractals</title>
        <link href="https://somethingorotherwhatever.com/items/regex-fractals"/>
        <id>https://somethingorotherwhatever.com/items/regex-fractals</id>
        <updated>2014-03-26T20:37:06Z</updated>
        <summary type="html"><![CDATA[<p>Draw fractals by writing a regular expression which matches parts of a subdivided square.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/regex-fractals/main.png" />
                
                
                    <p>Split the space into quadrants. Name them 1,2,3 and 4. Split those quadrants up, and add another digit to the names. Repeat a few times!</p>
<p>Now each cell has a several-digit name. Turn a cell on or off depending on whether its name passes a regular expression. Use the length of the expression's matching groups to colour on cells.</p>
<p>Inspired by <a href="https://ssodelta.wordpress.com/2014/03/25/creating-colored-images-from-regular-expressions/">SSOΔ</a>.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Everyone’s a mathematician</title>
        <link href="https://somethingorotherwhatever.com/items/everyones-a-mathematician"/>
        <id>https://somethingorotherwhatever.com/items/everyones-a-mathematician</id>
        <updated>2014-03-25T10:57:12Z</updated>
        <summary type="html"><![CDATA[<p>This morning Katie and I had a little discussion about house style on The Aperiodical. Mathematican Paul Taylor was listed as “Mathematician Paul Taylor” in the blurb for his featured p…</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/everyones-a-mathematician/main.png" />
                
                
                    <p>This morning Katie and I had a little discussion about house style on The Aperiodical. Mathematican Paul Taylor was listed as “Mathematician Paul Taylor” in the blurb for his featured p…</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Building Houses</title>
        <link href="https://somethingorotherwhatever.com/items/building-houses"/>
        <id>https://somethingorotherwhatever.com/items/building-houses</id>
        <updated>2014-03-20T15:28:16Z</updated>
        <summary type="html"><![CDATA[<p>A game about putting flags in a field, made for James Grime</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/building-houses/main.png" />
                
                
                    <h2>The Lazy Farmer Flag Game</h2>
<p>Made for James Grime - <a href="https://www.youtube.com/watch?v=YMkziQhJkmM">see the video at YouTube</a>.</p>
<p>The aim is to place flags on a field of length 1, so that when you divide the field into equal-sized plots, there's exactly one flag in each field. To complicate matters, you place the flags one-by-one, and you check whether the placements are valid after each flag goes down.</p>
<p>made by cp. Released under the MIT licence.</p>
<p>This uses d3, jQuery, normalize.css, and a picture of a house from <a href="http://emojione.com">Emoji One</a>, which all have their own licences.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>cp&#39;s OEIS frontend</title>
        <link href="https://somethingorotherwhatever.com/items/cp-s-oeis-frontend"/>
        <id>https://somethingorotherwhatever.com/items/cp-s-oeis-frontend</id>
        <updated>2014-01-28T16:21:27Z</updated>
        <summary type="html"><![CDATA[<p>An alternative frontend for the Online Encyclopedia of Integer Sequences.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/cp-s-oeis-frontend/main.png" />
                
                
                    <p>This is a Flask app which serves a new frontend to the OEIS.</p>
<p>The aim is to produce pages with non-ancient HTML, and then to pay attention to visual presentation.</p>
<p>The OEIS server happily returns text files for its entries, but I don't know how happy they'd be about getting lots of traffic that way, so this is just a hobby project for me for now.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Big Friendly BF</title>
        <link href="https://somethingorotherwhatever.com/items/big-friendly-bf"/>
        <id>https://somethingorotherwhatever.com/items/big-friendly-bf</id>
        <updated>2014-01-10T22:12:26Z</updated>
        <summary type="html"><![CDATA[<p>An implementation of the programming language I can't name</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/big-friendly-bf/main.png" />
                
                
                    <h1>BFBF</h1>
<p>An obnoxiously large implementation of <a href="http://en.wikipedia.org/wiki/Brainfuck">the programming language I can't name</a>.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Plot differential equations</title>
        <link href="https://somethingorotherwhatever.com/items/plot-differential-equations"/>
        <id>https://somethingorotherwhatever.com/items/plot-differential-equations</id>
        <updated>2013-11-26T15:25:30Z</updated>
        <summary type="html"><![CDATA[<p>A little tool to visualise solutions to first order ODEs</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                
                    <h1>ode-solution-plot</h1>
<p>A little tool to visualise solutions to first order ODEs.</p>
<p>It uses</p>
<ul>
<li><a href="https://github.com/numbas/LissaJS">LissaJS</a> to parse a mathematical expression and rewrite it as javascript</li>
<li><a href="http://jsxgraph.uni-bayreuth.de/">JSXGraph</a> to render a diagram of the resulting vector field and solution.</li>
</ul>
<p>See it running at http://www.staff.ncl.ac.uk/christian.perfect/ode-solution-plot/</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>LissaJS</title>
        <link href="https://somethingorotherwhatever.com/items/lissajs"/>
        <id>https://somethingorotherwhatever.com/items/lissajs</id>
        <updated>2013-10-29T14:37:13Z</updated>
        <summary type="html"><![CDATA[<p>An algebra parsing, evaluation and simplification system written entirely in JavaScript.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                
                    <h1>LissaJS</h1>
<p>A library for parsing, evaluating and rearranging algebraic expressions in JavaScript.</p>
<p><strong>This project is no longer maintained. Development continues in <a href="the main Numbas repository">https://github.com/numbas/Numbas</a>.</strong></p>
<p>The name "LissaJS" was picked without much thought. It's meant to pun on "Lissajous", and follows the convention that every Javascript library's name ends in "JS", but apart from that it hasn't got much going for it. Suggestions of better names are welcome at <a href="https://github.com/numbas/LissaJS/issues/1">issue #1</a>.</p>
<p>This is a spin-off of the <a href="http://www.numbas.org.uk">Numbas</a> e-assessment system. It has no external dependencies.</p>
<p>It's currently provided on a "do what you can with it" basis; we'll add examples and documentation later.</p>
<h2>Demo</h2>
<p>There's an interactive demo page at http://numbas.github.io/LissaJS/.</p>
<h2>Installing LissaJS</h2>
<p>Include the lissajs.js script in your page.</p>
<pre><code>&lt;script src="lissajs.js"&gt;&lt;/script&gt;
</code></pre>
<p>It uses some ECMAScript 5 features. For older browsers, you'll also need to load <a href="https://github.com/kriskowal/es5-shim">es5-shim</a>.</p>
<h2>Using LissaJS</h2>
<p>There is an explanation of the syntax, data types supported, and a function reference at http://numbas-editor.readthedocs.org/en/latest/jme-reference.html. Just replace <code>Numbas</code> with <code>LissaJS</code>. For more in-depth code documentation, see http://numbas.github.io/Numbas/ - again replacing <code>Numbas</code> with <code>LissaJS</code>. </p>
<p>All operations happen with respect to a <code>LissaJS.jme.Scope</code> object. There's a default scope at <code>LissaJS.jme.builtinScope</code> containing all the built-in functions and rulesets. A few of the most commonly-used functions are available through the <code>LissaJS</code> object, using this default scope implicitly, for your convenience.</p>
<p>To evaluate an expression:</p>
<pre><code>LissaJS.evaluate('expression',{dict of variables});
</code></pre>
<p>or, with a custom scope:</p>
<pre><code>scope.evaluate('expression',{dict of variables});
</code></pre>
<p>To compile an expression to a syntax tree:</p>
<pre><code>scope.compile('expression');
</code></pre>
<p>To convert an expression to LaTeX:</p>
<pre><code>LissaJS.exprToLaTeX('expression',[rules]);
</code></pre>
<p>or, with a custom scope:</p>
<pre><code>LissaJS.jme.display.exprToLaTeX('expression',[rules],scope);
</code></pre>
<p>To simplify (rearrange) an expression:</p>
<pre><code>LissaJS.simplifyExpression('expression',[rules]);
</code></pre>
<p>or, with a custom scope:</p>
<pre><code>LissaJS.jme.display.simplifyExpression('expression',[rules],[scope]);
</code></pre>
<p>There are lots of pure maths functions under <code>LissaJS.math</code>.</p>
<h2>Copyright</h2>
<p>LissaJS uses code from the <a href="http://www.numbas.org.uk">Numbas</a> project.</p>
<blockquote>
<p>Copyright 2011-16 Newcastle University</p>
<p>Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at</p>
<p>http://www.apache.org/licenses/LICENSE-2.0</p>
<p>Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.</p>
</blockquote>
<p>You can see a plain-English explanation of the license and what it allows at <a href="https://tldrlegal.com/license/apache-license-2.0-(apache-2.0)">tl;drLegal</a></p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>MathJax play area</title>
        <link href="https://somethingorotherwhatever.com/items/mathjax-play-area"/>
        <id>https://somethingorotherwhatever.com/items/mathjax-play-area</id>
        <updated>2013-10-25T10:54:30Z</updated>
        <summary type="html"><![CDATA[<p>A page to try out different MathJax configurations.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/mathjax-play-area/main.png" />
                
                
                    <p>A page to try out different MathJax configurations.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>MathJax bindings for knockout.js</title>
        <link href="https://somethingorotherwhatever.com/items/mathjax-bindings-for-knockout-js"/>
        <id>https://somethingorotherwhatever.com/items/mathjax-bindings-for-knockout-js</id>
        <updated>2013-10-22T08:24:17Z</updated>
        <summary type="html"><![CDATA[<p>Binding handlers for knockout.js which typeset all LaTeX inside an element containing HTML, or just typeset some LaTeX on its own.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                
                    <p>=======
knockout-mathjax-bindings
=========================</p>
<p>Binding handlers for knockout.js which typeset all LaTeX inside an element containing HTML, or just typeset some LaTeX on its own.</p>
<p>Demo at http://checkmyworking.com/misc/knockout-mathjax-bindings/</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>An enneahedron for Herschel</title>
        <link href="https://somethingorotherwhatever.com/items/an-enneahedron-for-herschel"/>
        <id>https://somethingorotherwhatever.com/items/an-enneahedron-for-herschel</id>
        <updated>2013-10-01T09:16:39Z</updated>
        <summary type="html"><![CDATA[<p>The Herschel graph has some pretty cool properties. Christian Perfect constructed the associated polyhedron, and it too has some cool properties!</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/an-enneahedron-for-herschel/main.png" />
                
                
                    <p>The Herschel graph has some pretty cool properties. Christian Perfect constructed the associated polyhedron, and it too has some cool properties!</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Little Professor</title>
        <link href="https://somethingorotherwhatever.com/items/little-professor"/>
        <id>https://somethingorotherwhatever.com/items/little-professor</id>
        <updated>2013-06-15T23:00:00Z</updated>
        <summary type="html"><![CDATA[<p>Read out an integer sequence, like the Little Professor calculator used to read out sums.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                
                    <p>Read out an integer sequence, like the Little Professor calculator used to read out sums.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Integer Sequence Reviews</title>
        <link href="https://somethingorotherwhatever.com/items/integer-sequence-reviews"/>
        <id>https://somethingorotherwhatever.com/items/integer-sequence-reviews</id>
        <updated>2013-05-03T23:00:00Z</updated>
        <summary type="html"><![CDATA[<p>My friend David Cushing and I used to review integer sequences for fun.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/integer-sequence-reviews/main.png" />
                
                
                    <p>My friend David Cushing and I used to review integer sequences for fun.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Art for a maths department</title>
        <link href="https://somethingorotherwhatever.com/items/art-for-a-maths-department"/>
        <id>https://somethingorotherwhatever.com/items/art-for-a-maths-department</id>
        <updated>2013-04-29T11:18:27Z</updated>
        <summary type="html"><![CDATA[<p>Christian was asked to find some art to decorate the walls of the university maths department he works in. Here’s what he found.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/art-for-a-maths-department/main.jpg" />
                
                
                    <p>Christian was asked to find some art to decorate the walls of the university maths department he works in. Here’s what he found.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Code excursions</title>
        <link href="https://somethingorotherwhatever.com/items/code-excursions"/>
        <id>https://somethingorotherwhatever.com/items/code-excursions</id>
        <updated>2013-04-13T13:36:05Z</updated>
        <summary type="html"><![CDATA[<p>The little bits of code I write to explore ideas.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                
                    <p>Every now and then an idea occurs to me or I see a puzzle or something, and I write a little bit of code to explore it.
I have code spread all over the place in flat files and github gists and so on, so I thought it would be a good idea to collect it all in one place.
I also realised it would help me in the long run to write down what I'm doing, so I'm going to try to explain my thought process at the top of each project.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>deck.js maths template</title>
        <link href="https://somethingorotherwhatever.com/items/deck-js-maths-template"/>
        <id>https://somethingorotherwhatever.com/items/deck-js-maths-template</id>
        <updated>2013-02-09T14:10:42Z</updated>
        <summary type="html"><![CDATA[<p>A template to create slides with deck.js, MathJax, and the unicode Computer Modern fonts</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                
                    <h1>cp's deck.js maths template</h1>
<p>A template to create slides with deck.js, MathJax, and the unicode Computer Modern fonts.</p>
<p>This contains everything you need to create a slideshow presentation which runs in the browser but uses the Beamer fonts and supports LaTeX maths.</p>
<p><a href="https://github.com/imakewebthings/deck.js">deck.js</a> is the best tool I've found to make HTML presentations.</p>
<p>I recompiled the cm-unicode project's Unicode version of the Computer Modern fonts (the default fonts used by LaTeX) so they could be used on the web. They can be downloaded from <a href="http://checkmyworking.com/cm-web-fonts/">http://checkmyworking.com/cm-web-fonts/</a>.</p>
<p><a href="http://www.mathjax.org/">MathJax</a> does the maths rendering.</p>
<p>You can see an example presentation at http://checkmyworking.com/misc/pgps-computable-groups-feb-2013/.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Computability of Bass-Serre structures in the Grzegorczyk hierarchy</title>
        <link href="https://somethingorotherwhatever.com/items/computability-of-bass-serre-structures-in-the-grzegorczyk-hierarchy"/>
        <id>https://somethingorotherwhatever.com/items/computability-of-bass-serre-structures-in-the-grzegorczyk-hierarchy</id>
        <updated>2013-02-08T00:00:00Z</updated>
        <summary type="html"><![CDATA[<p>A talk about the stuff I was looking at in my aborted PhD.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/computability-of-bass-serre-structures-in-the-grzegorczyk-hierarchy/main.png" />
                
                
                    <p>A talk about the stuff I was looking at in my aborted PhD.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>MathJax bookmarklet</title>
        <link href="https://somethingorotherwhatever.com/items/mathjax-bookmarklet"/>
        <id>https://somethingorotherwhatever.com/items/mathjax-bookmarklet</id>
        <updated>2013-01-01T00:00:00Z</updated>
        <summary type="html"><![CDATA[<p>A bookmarklet to render LaTeX by adding MathJax to pages that don't have it.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                
                    <p>A bookmarklet to render LaTeX by adding MathJax to pages that don't have it.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Spiral Life</title>
        <link href="https://somethingorotherwhatever.com/items/spiral-life"/>
        <id>https://somethingorotherwhatever.com/items/spiral-life</id>
        <updated>2012-11-01T22:19:49Z</updated>
        <summary type="html"><![CDATA[<p>Conway's Game of Life, but it doesn't all happen at once</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <video autoplay src="https://somethingorotherwhatever.com/items/spiral-life/main.mp4"></video>
                
                
                    <p>Conway's Game of Life, but it doesn't all happen at once</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Zero-knowledge protocols</title>
        <link href="https://somethingorotherwhatever.com/items/zero-knowledge-protocols"/>
        <id>https://somethingorotherwhatever.com/items/zero-knowledge-protocols</id>
        <updated>2012-10-23T23:00:00Z</updated>
        <summary type="html"><![CDATA[<p>A talk about zero-knowledge protocols, given at Newcastle's postgraduate forum.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/zero-knowledge-protocols/main.png" />
                
                
                    <p>A talk about zero-knowledge protocols, given at Newcastle's postgraduate forum.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Using Computer Modern on the web</title>
        <link href="https://somethingorotherwhatever.com/items/using-computer-modern-on-the-web"/>
        <id>https://somethingorotherwhatever.com/items/using-computer-modern-on-the-web</id>
        <updated>2012-08-28T23:00:00Z</updated>
        <summary type="html"><![CDATA[<p>I compiled the Computer Modern fonts into a format that can be used on the web.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/using-computer-modern-on-the-web/main.png" />
                
                
                    <p>I compiled the Computer Modern fonts into a format that can be used on the web.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Olympic chokers</title>
        <link href="https://somethingorotherwhatever.com/items/olympic-chokers"/>
        <id>https://somethingorotherwhatever.com/items/olympic-chokers</id>
        <updated>2012-08-09T23:00:00Z</updated>
        <summary type="html"><![CDATA[<p>Which countries are just failing to win the most? Shows a table of all countries who have won at least one gold (to exclude the milquetoast nations for whom second place is an achievement), sorted by the proportion of their medals which are not gold.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                
                    <p>Which countries are just failing to win the most? Shows a table of all countries who have won at least one gold (to exclude the milquetoast nations for whom second place is an achievement), sorted by the proportion of their medals which are not gold.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>make big maths</title>
        <link href="https://somethingorotherwhatever.com/items/make-big-maths"/>
        <id>https://somethingorotherwhatever.com/items/make-big-maths</id>
        <updated>2012-08-08T06:49:27Z</updated>
        <summary type="html"><![CDATA[<p>A simple page for rendering LaTeX at any size, using MathJax.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/make-big-maths/main.png" />
                
                
                    <p>A simple page for rendering LaTeX at any size, using MathJax.</p>
<p>Copyright (c) 2012 Christian Perfect</p>
<p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:</p>
<p>The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.</p>
<p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>WordPress writemaths plugin</title>
        <link href="https://somethingorotherwhatever.com/items/wordpress-writemaths-plugin"/>
        <id>https://somethingorotherwhatever.com/items/wordpress-writemaths-plugin</id>
        <updated>2012-06-20T10:54:23Z</updated>
        <summary type="html"><![CDATA[<p>A WordPress plugin to add the Write maths, see maths thing to the editor. Doesn't work with the block editor.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                
                    <p>A wordpress plugin for <code>jQuery.writemaths</code></p>
<p>Adds <a href="http://christianp.github.com/writemaths">write maths, see maths</a> to comment boxes, and to TinyMCE editor instances (in particular, the post editor).</p>
<p>Requires MathJax to be available to <code>wp_enqueue_script</code> under the name <code>'mathjax'</code>. The <a href="https://github.com/scoskey/Simple-Mathjax-wordpress-plugin">Simple MathJax plugin</a> does this.</p>
<h3>Licence</h3>
<p>Copyright 2014 Christian Perfect</p>
<p>Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at</p>
<pre><code>http://www.apache.org/licenses/LICENSE-2.0
</code></pre>
<p>Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.</p>
<p>(<a href="https://tldrlegal.com/license/apache-license-2.0-(apache-2.0)">tl;dr</a>)</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>logerrific</title>
        <link href="https://somethingorotherwhatever.com/items/logerrific"/>
        <id>https://somethingorotherwhatever.com/items/logerrific</id>
        <updated>2012-05-01T22:27:23Z</updated>
        <summary type="html"><![CDATA[<p>A javascript server log analyser</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                
                    <p>I'm trying to make a modern-looking server log analyser, because it seems none exists.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>The Aperiodical</title>
        <link href="https://somethingorotherwhatever.com/items/the-aperiodical"/>
        <id>https://somethingorotherwhatever.com/items/the-aperiodical</id>
        <updated>2012-04-24T23:00:00Z</updated>
        <summary type="html"><![CDATA[<p>The blog I run with Peter Rowlett and Katie Steckles.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/the-aperiodical/main.png" />
                
                
                    <p>The blog I run with Peter Rowlett and Katie Steckles.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Putting maths notation online</title>
        <link href="https://somethingorotherwhatever.com/items/putting-maths-notation-online"/>
        <id>https://somethingorotherwhatever.com/items/putting-maths-notation-online</id>
        <updated>2012-03-31T23:00:00Z</updated>
        <summary type="html"><![CDATA[<p>A talk about how to use MathJax, from when it was new.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/putting-maths-notation-online/main.png" />
                
                
                    <p>A talk about how to use MathJax, from when it was new.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>An interesting puzzle from MathsJam</title>
        <link href="https://somethingorotherwhatever.com/items/an-interesting-puzzle-from-mathsjam"/>
        <id>https://somethingorotherwhatever.com/items/an-interesting-puzzle-from-mathsjam</id>
        <updated>2012-03-27T23:00:00Z</updated>
        <summary type="html"><![CDATA[<p>About the 'Princess in a castle' puzzle.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/an-interesting-puzzle-from-mathsjam/main.png" />
                
                
                    <p>About the 'Princess in a castle' puzzle.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Princess in a castle</title>
        <link href="https://somethingorotherwhatever.com/items/princess-in-a-castle"/>
        <id>https://somethingorotherwhatever.com/items/princess-in-a-castle</id>
        <updated>2011-12-07T01:20:12Z</updated>
        <summary type="html"><![CDATA[<p>An interactive version of the Princess in a Castle puzzle</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <video autoplay src="https://somethingorotherwhatever.com/items/princess-in-a-castle/main.mp4"></video>
                
                
                    <p>Princess in a Castle puzzle!</p>
<p>see http://checkmyworking.com/misc/princess-castle</p>
<p>uses <a href="http://paperjs.org">Paper.js</a>.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Random Eratosthenetic Pseudo-Primes</title>
        <link href="https://somethingorotherwhatever.com/items/random-eratosthenetic-pseudo-primes"/>
        <id>https://somethingorotherwhatever.com/items/random-eratosthenetic-pseudo-primes</id>
        <updated>2011-10-27T23:00:00Z</updated>
        <summary type="html"><![CDATA[<p>An investigation of what happens if you make the Sieve of Eratosthenes randomly.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <video autoplay src="https://somethingorotherwhatever.com/items/random-eratosthenetic-pseudo-primes/main.mp4"></video>
                
                
                    <p>An investigation of what happens if you make the Sieve of Eratosthenes randomly.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Aperiodical Round Up</title>
        <link href="https://somethingorotherwhatever.com/items/aperiodical-round-up"/>
        <id>https://somethingorotherwhatever.com/items/aperiodical-round-up</id>
        <updated>2011-10-19T23:00:00Z</updated>
        <summary type="html"><![CDATA[<p>This is a sporadic series of posts where I collect links to interesting or unusual maths things.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/aperiodical-round-up/main.jpg" />
                
                
                    <p>This is a sporadic series of posts where I collect links to interesting or unusual maths things.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Hands-on Maths, or Here&#39;s One I Proved Earlier</title>
        <link href="https://somethingorotherwhatever.com/items/hands-on-maths-or-here-s-one-i-proved-earlier"/>
        <id>https://somethingorotherwhatever.com/items/hands-on-maths-or-here-s-one-i-proved-earlier</id>
        <updated>2011-10-18T23:00:00Z</updated>
        <summary type="html"><![CDATA[<p>A talk about some physical mathematical objects, given at Newcastle's postgraduate forum.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/hands-on-maths-or-here-s-one-i-proved-earlier/main.png" />
                
                
                    <p>A talk about some physical mathematical objects, given at Newcastle's postgraduate forum.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Tic-Tac-Reversi</title>
        <link href="https://somethingorotherwhatever.com/items/tic-tac-reversi"/>
        <id>https://somethingorotherwhatever.com/items/tic-tac-reversi</id>
        <updated>2011-09-26T23:00:00Z</updated>
        <summary type="html"><![CDATA[<p>A cross between tic-tac-toe and Reversi, apparently.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <video autoplay src="https://somethingorotherwhatever.com/items/tic-tac-reversi/main.mp4"></video>
                
                
                    <p>A cross between tic-tac-toe and Reversi, apparently.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Kleinsteroids!</title>
        <link href="https://somethingorotherwhatever.com/items/kleinsteroids"/>
        <id>https://somethingorotherwhatever.com/items/kleinsteroids</id>
        <updated>2011-09-10T23:00:00Z</updated>
        <summary type="html"><![CDATA[<p>Asteroids, played on the projective plane or the Klein bottle.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <video autoplay src="https://somethingorotherwhatever.com/items/kleinsteroids/main.mp4"></video>
                
                
                    <p>Asteroids, played on the projective plane or the Klein bottle.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Codes and Ciphers</title>
        <link href="https://somethingorotherwhatever.com/items/codes-and-ciphers"/>
        <id>https://somethingorotherwhatever.com/items/codes-and-ciphers</id>
        <updated>2011-08-22T21:45:46Z</updated>
        <summary type="html"><![CDATA[<p>I wanted to make interactive demonstrations of some codes and ciphers. I only got as far as doing the Caesar Cipher.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/codes-and-ciphers/main.png" />
                
                
                    <p>I wanted to make interactive demonstrations of some codes and ciphers. I only got as far as doing the Caesar Cipher.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>When&#39;s your next prime birthday?</title>
        <link href="https://somethingorotherwhatever.com/items/when-s-your-next-prime-birthday"/>
        <id>https://somethingorotherwhatever.com/items/when-s-your-next-prime-birthday</id>
        <updated>2011-08-08T16:46:08Z</updated>
        <summary type="html"><![CDATA[<p>Tells you when you are next a prime number of days old.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/when-s-your-next-prime-birthday/main.png" />
                
                
                    <p>This is a simple script which asks for your date of birth and then calculates when your next prime birthday is.</p>
<p>A prime birthday is when you are a prime number of days old!</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>textile in javascript</title>
        <link href="https://somethingorotherwhatever.com/items/textile-in-javascript"/>
        <id>https://somethingorotherwhatever.com/items/textile-in-javascript</id>
        <updated>2011-07-19T20:09:40Z</updated>
        <summary type="html"><![CDATA[<p>A Textile convertor in Javascript, because no good one already existed.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                
                    <p>A better javascript textile converter, because I couldn't find one.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>textile</title>
        <link href="https://somethingorotherwhatever.com/items/textile"/>
        <id>https://somethingorotherwhatever.com/items/textile</id>
        <updated>2011-06-25T23:00:00Z</updated>
        <summary type="html"><![CDATA[<p>A demo page for my JavaScript implementation of the Textile markup language.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                
                    <p>A demo page for my JavaScript implementation of the Textile markup language.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Monkey bits</title>
        <link href="https://somethingorotherwhatever.com/items/monkey-bits"/>
        <id>https://somethingorotherwhatever.com/items/monkey-bits</id>
        <updated>2011-06-20T08:06:18Z</updated>
        <summary type="html"><![CDATA[<p>Code written in the Monkey language.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/monkey-bits/main.png" />
                
                
                    <p>This repository contains things I have written using <a href="http://www.monkeycoder.co.nz">Monkey</a>.</p>
<p>Some of the things may not work, some may work but have no purpose, and others may work and be useful but no fun at all.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Write maths, see maths</title>
        <link href="https://somethingorotherwhatever.com/items/write-maths-see-maths"/>
        <id>https://somethingorotherwhatever.com/items/write-maths-see-maths</id>
        <updated>2011-06-01T09:01:18Z</updated>
        <summary type="html"><![CDATA[<p>A jQuery plugin to give an instant preview of LaTeX in editing areas.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                
                    <p>Write maths, see maths is a jQuery plugin for editable areas which gives an instant <a href="http://www.mathjax.org">MathJax</a> preview of the TeX you're writing just above the cursor.</p>
<p>To use it, just call <code>$(selector).writemaths()$</code> when the page loads.</p>
<p>You can optionally pass in an object with some options:</p>
<ul>
<li><code>cleanMaths</code>: a function which does something to the LaTeX before displaying it.</li>
<li><code>callback</code>: a function which is called when the preview is displayed.</li>
<li><code>iFrame</code>: set this to <code>true</code> if you're applying writemaths to something like TinyMCE, which lives inside an iframe.</li>
<li><code>position</code>: the position on the parent element on which to place the preview. It's really the <code>`at</code> option of <a href="http://jqueryui.com/position/">jquery.ui.position</a>.</li>
<li><code>previewPosition</code>: the position on the preview element to line up with the parent element. It's really the <code>my</code> option of <a href="http://jqueryui.com/position/">jquery.ui.position</a>.</li>
<li><code>of</code>: the element to position relative to.</li>
</ul>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>PHD-Notes</title>
        <link href="https://somethingorotherwhatever.com/items/phd-notes"/>
        <id>https://somethingorotherwhatever.com/items/phd-notes</id>
        <updated>2011-05-09T09:51:04Z</updated>
        <summary type="html"><![CDATA[<p>Stuff produced during the PhD I gave up on. I was supposed to be looking at computability of products of groups.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                
                    <p>I've put my TeX files up here because I've been editing them on several different PCs lately.</p>
<p>I usually write up my thoughts informally on <a href="http://checkmyworking.com">my blog</a> before I TeX them up.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Numbas</title>
        <link href="https://somethingorotherwhatever.com/items/numbas"/>
        <id>https://somethingorotherwhatever.com/items/numbas</id>
        <updated>2011-04-25T08:08:44Z</updated>
        <summary type="html"><![CDATA[<p>Numbas is an open-source e-assessment tool aimed at mathematical disciplines. It's what I spend most of my work time on.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/numbas/main.svg" />
                
                
                    <p><img src="http://numbas.org.uk/numbas-logo.svg" width="100%" alt="Numbas logo"></p>
<p><strong>Numbas</strong> is an open-source system for creating tests which run entirely in the browser. It has been developed by <a href="http://www.ncl.ac.uk/maths-physics">Newcastle University's School of Mathematics, Statistics and Physics</a>.</p>
<p>For more information about Numbas and what it does, see our website at <a href="http://www.numbas.org.uk">numbas.org.uk</a>.</p>
<h3>How to use Numbas</h3>
<p>Documentation for Numbas users is at <a href="http://numbas-editor.readthedocs.org">numbas-editor.readthedocs.org</a>.</p>
<h3>Installation</h3>
<p>This repository contains the Numbas compiler, which runs as standalone Python 3, but the most convenient way to use Numbas is through the web-based editor. </p>
<p>A publicly-available editor, requiring no set-up, is available at <a href="http://numbas.mathcentre.ac.uk">numbas.mathcentre.ac.uk</a>. Or, you can follow <a href="http://numbas.github.io/editor">our instructions for Windows, Mac, or Ubuntu to install your own instance</a>.</p>
<p>If you decide to run your own installation, install the compiler's dependencies with <code>pip install -r requirements.txt</code>.</p>
<p>This repository is just one part of the Numbas ecosystem. See <a href="http://github.com/numbas">the numbas organisation</a> for the other pieces, including the web-based editor, extensions, and VLE integrations.</p>
<h3>Contributing to Numbas</h3>
<p>Numbas is open source, and we welcome contributions of any sort. Bug reports or feature suggestions can be added to <a href="https://github.com/numbas/Numbas/issues">the GitHub issue tracker</a>, or emailed to numbas@ncl.ac.uk. </p>
<p>See <a href="http://www.numbas.org.uk/contributing-to-numbas/">our page on contributing to Numbas</a> for more information on how you can help.</p>
<p>We keep a list of tasks specifically for new contributors, under the <a href="https://github.com/numbas/Numbas/labels/good%20first%20issue">good-first-issue label</a>. There's <a href="https://github.com/numbas/editor/labels/good%20first%20issue">a corresponding list in the editor repository</a>, too. These tasks should be fairly straightforward to implement without much knowledge of how all the code fits together.</p>
<h3>Development</h3>
<p>This tool runs on the command line: run <code>python bin/numbas.py</code> to see the options. You can give it the name of a <code>.exam</code> file or pipe one in.</p>
<p>When making changes to the JavaScript runtime, it's a good idea to run the unit tests in the <code>tests</code> directory. Start a local web server with <code>python -m http.server</code> and go to http://localhost:8000/tests. The file <code>jme.html</code> contains tests to do with the JME system, and <code>parts.html</code> contains tests to do with the part marking algorithms. </p>
<p>If you make a change, please try to add unit tests to confirm that Numbas behaves as expected.</p>
<p>The Makefile in this repository collects together scripts to run the unit tests, and builds the API documentation. Linux and Mac OS have built-in support Makefiles, but Windows doesn't. On Windows, <a href="https://www.cygwin.com/">cygwin</a> provides <code>make</code>.</p>
<p>API documentation for developers is at <a href="https://numbas.github.io/Numbas">numbas.github.io/Numbas</a>.
This is generated using <a href="http://usejsdoc.org">JSDoc</a>, with <a href="http://github.com/numbas/numbas-jsdoc-template">a custom template</a>.
Run <code>make docs</code> to rebuild the API documentation into <code>../numbas-docs</code>.</p>
<h3>Copyright</h3>
<blockquote>
<p>Copyright 2011-18 Newcastle University</p>
<p>Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at</p>
<p>http://www.apache.org/licenses/LICENSE-2.0</p>
<p>Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.</p>
</blockquote>
<p>You can see a plain-English explanation of the license and what it allows at <a href="https://tldrlegal.com/license/apache-license-2.0-%28apache-2.0%29">tl;drLegal</a></p>
<p>Copyright in the content produced using Numbas resides with the author.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Circles</title>
        <link href="https://somethingorotherwhatever.com/items/circles"/>
        <id>https://somethingorotherwhatever.com/items/circles</id>
        <updated>2011-03-09T00:00:00Z</updated>
        <summary type="html"><![CDATA[<p>Subdividing a triangle into circles.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/circles/main.png" />
                
                
                    <p>Subdividing a triangle into circles.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>I can&#39;t believe it&#39;s a universal computer!</title>
        <link href="https://somethingorotherwhatever.com/items/i-can-t-believe-it-s-a-universal-computer"/>
        <id>https://somethingorotherwhatever.com/items/i-can-t-believe-it-s-a-universal-computer</id>
        <updated>2011-02-09T00:00:00Z</updated>
        <summary type="html"><![CDATA[<p>A talk about Turing completeness, given at Newcastle's postgraduate forum.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/i-can-t-believe-it-s-a-universal-computer/main.png" />
                
                
                    <p>A talk about Turing completeness, given at Newcastle's postgraduate forum.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Check my working</title>
        <link href="https://somethingorotherwhatever.com/items/check-my-working"/>
        <id>https://somethingorotherwhatever.com/items/check-my-working</id>
        <updated>2010-02-02T00:00:00Z</updated>
        <summary type="html"><![CDATA[<p>checkmyworking.com began as place to put notes about my PhD work, before I abandoned it. I also used to post about maths things, before I started The Aperiodical. Now (in 2022), my plan is to use this site to post bits and bobs about the techy things I'm doing, for the sake of anyone else who might encounter the same problems I do.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/check-my-working/main.png" />
                
                
                    <p>checkmyworking.com began as place to put notes about my PhD work, before I abandoned it. I also used to post about maths things, before I started The Aperiodical. Now (in 2022), my plan is to use this site to post bits and bobs about the techy things I'm doing, for the sake of anyone else who might encounter the same problems I do.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Picaresque</title>
        <link href="https://somethingorotherwhatever.com/items/picaresque"/>
        <id>https://somethingorotherwhatever.com/items/picaresque</id>
        <updated>2009-02-02T15:03:32Z</updated>
        <summary type="html"><![CDATA[<p>I'd just read <em>Candide</em>, I was full of big ideas, I thought I'd make a game about all of that. I didn't get far.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                
                    <p>03/02/09: Added old fencing and trader games source to 'inspiration' folder.</p>
<p>02/02/09: Actually run for the actual hills, it's the first commit!</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Cards</title>
        <link href="https://somethingorotherwhatever.com/items/cards"/>
        <id>https://somethingorotherwhatever.com/items/cards</id>
        <updated>2008-12-31T00:00:00Z</updated>
        <summary type="html"><![CDATA[<p>Some greetings cards I made.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/cards/main.jpg" />
                
                
                    <p>Some greetings cards I made.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>warpycode</title>
        <link href="https://somethingorotherwhatever.com/items/warpycode"/>
        <id>https://somethingorotherwhatever.com/items/warpycode</id>
        <updated>2008-10-25T12:15:03Z</updated>
        <summary type="html"><![CDATA[<p>This is an up-to-date repository of all my blitzmax code. It's mainly for my use, but others might find something useful in it.</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                
                    <p>This is an up-to-date repository of all my blitzmax code. It's mainly for my use, but others might find something useful in it.</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>The unfortunate man</title>
        <link href="https://somethingorotherwhatever.com/items/the-unfortunate-man"/>
        <id>https://somethingorotherwhatever.com/items/the-unfortunate-man</id>
        <updated>2008-01-02T00:00:00Z</updated>
        <summary type="html"><![CDATA[<p>A nonsense story</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/the-unfortunate-man/main.gif" />
                
                
                    <p>A nonsense story</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>The Failure Song</title>
        <link href="https://somethingorotherwhatever.com/items/the-failure-song"/>
        <id>https://somethingorotherwhatever.com/items/the-failure-song</id>
        <updated>2008-01-01T00:00:00Z</updated>
        <summary type="html"><![CDATA[<p>Some rubbish about exams?</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/the-failure-song/main.gif" />
                
                
                    <p>Some rubbish about exams?</p>
                
                ]]>
        </content>
    </entry>
    
    <entry>
        <title>Christian does some stuff</title>
        <link href="https://somethingorotherwhatever.com/items/christian-does-some-stuff"/>
        <id>https://somethingorotherwhatever.com/items/christian-does-some-stuff</id>
        <updated>2007-05-31T23:00:00Z</updated>
        <summary type="html"><![CDATA[<p>A series of cartoons</p>]]></summary>
        <content type="html">
                <![CDATA[
                
                    <img src="https://somethingorotherwhatever.com/items/christian-does-some-stuff/main.jpg" />
                
                
                    <p>A series of cartoons</p>
                
                ]]>
        </content>
    </entry>
    
</feed>