RSS.Style logo RSS/Atom Feed Analysis


Analysis of https://blog.jgc.org/feeds/posts/default

Feed fetched in 86 ms.
Warning Content type is application/atom+xml; charset=UTF-8, not text/xml.
Feed is 315,114 characters long.
Feed has an ETag of W/"5b1c21bc9632d6bc4e72f26c4c3fb73fc3adf3db633e816bfa72ea306d4b3c4b".
Feed has a last modified date of Tue, 01 Apr 2025 07:48:22 GMT.
Feed has a text/css stylesheet: http://www.blogger.com/styles/atom.css.
Error Stylesheet URL is on a different protocol: http:.
This appears to be an Atom feed.
Feed title: John Graham-Cumming's blog
Error Feed self link does not match feed URL: http://www.blogger.com/feeds/19303585/posts/default.
Feed has 25 items.
First item published on 2025-03-31T15:22:00.008Z
Last item published on 2023-12-27T15:43:00.007Z
Home page URL: http://blog.jgc.org/
Error Home page URL is on a different protocol: http:.
Warning Home page URL redirected to https://blog.jgc.org/.
Home page has feed discovery link in <head>.
Home page has a link to the feed in the <body>

Formatted XML
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0">
    <id>tag:blogger.com,1999:blog-19303585</id>
    <updated>2025-04-01T07:48:22.029+00:00</updated>
    <category term="pseudo-randomness"/>
    <category term="hardware"/>
    <category term="babbage"/>
    <category term="gaga"/>
    <category term="anti-spam"/>
    <category term="gnu make"/>
    <category term="retro"/>
    <category term="security"/>
    <category term="codes and ciphers"/>
    <category term="the geek atlas"/>
    <category term="rants and raves"/>
    <category term="alan turing"/>
    <category term="hits"/>
    <category term="mathematics"/>
    <category term="climate change"/>
    <category term="perl"/>
    <category term="calculators"/>
    <category term="google go"/>
    <category term="minitel"/>
    <category term="toys"/>
    <category term="behind the screens"/>
    <category term="clocks"/>
    <category term="machine learning"/>
    <category term="babygaga"/>
    <category term="games"/>
    <category term="arc"/>
    <category term="my services"/>
    <category term="popfile"/>
    <category term="cansole"/>
    <category term="facebook"/>
    <category term="privacy"/>
    <category term="radio"/>
    <category term="well... actually"/>
    <title type="text">John Graham-Cumming&#39;s blog</title>
    <subtitle type="html"></subtitle>
    <link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://blog.jgc.org/feeds/posts/default"/>
    <link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19303585/posts/default"/>
    <link rel="alternate" type="text/html" href="http://blog.jgc.org/"/>
    <link rel="hub" href="http://pubsubhubbub.appspot.com/"/>
    <link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/19303585/posts/default?start-index=26&amp;max-results=25"/>
    <author>
        <name>Unknown</name>
        <email>[email protected]</email>
        <gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="https://img1.blogblog.com/img/b16-rounded.gif"/>
    </author>
    <generator version="7.00" uri="http://www.blogger.com">Blogger</generator>
    <openSearch:totalResults>520</openSearch:totalResults>
    <openSearch:startIndex>1</openSearch:startIndex>
    <openSearch:itemsPerPage>25</openSearch:itemsPerPage>
    <entry>
        <id>tag:blogger.com,1999:blog-19303585.post-6045805352103665596</id>
        <published>2025-03-31T15:22:00.008+00:00</published>
        <updated>2025-03-31T15:30:58.521+00:00</updated>
        <category scheme="http://www.blogger.com/atom/ns#" term="retro"/>
        <title type="text">Debugging Lotus 1-2-3 by fax</title>
        <content type="html">&lt;p&gt;There isn&#39;t a lot to this story beyond the fact that in around 1990 I helped debug someone&#39;s &lt;a href=&quot;https://en.wikipedia.org/wiki/Lotus_1-2-3&quot;&gt;Lotus 1-2-3&lt;/a&gt; set up via fax. But it&#39;s a good reminder of how important the Zeroth Law of Debugging is (see below).&lt;/p&gt;&lt;p&gt;Without some sort of online connection with these folks, and with transatlantic phone calls being very, very expensive (I was in the UK, they were in the US) fax was the obvious answer.&lt;/p&gt;&lt;p&gt;I was reminded of this when I came across the actual fax itself:&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvBJFVo9lHXKYXrDQLzGXbikkdfnrYIrLIVEfKAtf8xXit4aysAwKI4eGJE7DDtpGox5v5nGtimyBlgEsV2TfFhoJZjOzrMvKn_Y9zWvlnd90WmDJNvY_PhjY-e88ULkTz3anDxMYBTVvcZy6_-WWvwGiNGkfcpE0zZM6ycrTXGZO9d-Qun1QZXg/s1933/123fax-1.jpeg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1933&quot; data-original-width=&quot;1394&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvBJFVo9lHXKYXrDQLzGXbikkdfnrYIrLIVEfKAtf8xXit4aysAwKI4eGJE7DDtpGox5v5nGtimyBlgEsV2TfFhoJZjOzrMvKn_Y9zWvlnd90WmDJNvY_PhjY-e88ULkTz3anDxMYBTVvcZy6_-WWvwGiNGkfcpE0zZM6ycrTXGZO9d-Qun1QZXg/w462-h640/123fax-1.jpeg&quot; width=&quot;462&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;What I asked them to do was give me the output of &lt;span style=&quot;font-family: courier;&quot;&gt;/ppomr&lt;/span&gt;. Hitting &lt;span style=&quot;font-family: courier;&quot;&gt;/&lt;/span&gt; in 1-2-3 started the menu system and each letter took you down a submenu until you hit an actual menu item. &lt;span style=&quot;font-family: courier;&quot;&gt;/ppomr&lt;/span&gt; is &lt;span style=&quot;font-family: courier;&quot;&gt;/Print Printer Options Margins Right&lt;/span&gt; (read all about it in the &lt;a href=&quot;https://ia801706.us.archive.org/25/items/lotus-1-2-3-release-3.1-reference/Lotus%201-2-3%20Release%203.1%20-%20Quick%20Reference.pdf&quot;&gt;Quick Reference&lt;/a&gt;) and so I was asking for the size of the right margin when printing.&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvnfG-rD2_B8Ex1WeGI8rIDmfdkcmWsQXkFB5lW_NdEmgBOImDbwS68iXE2jpDvmEVEq_zfBI3r5HrsWez-n5V_5JL6PFHaKh2kV8S2GW-D92kkp7a1lVlI3vjsThAs_RnkR0XvosVtmqLpDrF-HZGN8hb2qbp5HdE6oNYjlJAbW1zOGOiqMYJ0Q/s1304/123fax-4.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1304&quot; data-original-width=&quot;1118&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvnfG-rD2_B8Ex1WeGI8rIDmfdkcmWsQXkFB5lW_NdEmgBOImDbwS68iXE2jpDvmEVEq_zfBI3r5HrsWez-n5V_5JL6PFHaKh2kV8S2GW-D92kkp7a1lVlI3vjsThAs_RnkR0XvosVtmqLpDrF-HZGN8hb2qbp5HdE6oNYjlJAbW1zOGOiqMYJ0Q/w549-h640/123fax-4.png&quot; width=&quot;549&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;Here&#39;s what that looks like in action:&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyFlohy9zaZQG4F1lVbE5zwbI-atvbCsblhWuExUIGrz-5M8mXowl5pVX-1Z3PvLtk4RRSy4SSIezsdMAxapZNC-haHtW1IATs6KQbUR1xDS6FkD8qGgqonN4u9jWsta6RUFQtrzTB5h1I7AZE0zNNp3As3bKBG3jXqZWwWdU8vzrovjoWAaodww/s4096/123fx-2.gif&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;2304&quot; data-original-width=&quot;4096&quot; height=&quot;360&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyFlohy9zaZQG4F1lVbE5zwbI-atvbCsblhWuExUIGrz-5M8mXowl5pVX-1Z3PvLtk4RRSy4SSIezsdMAxapZNC-haHtW1IATs6KQbUR1xDS6FkD8qGgqonN4u9jWsta6RUFQtrzTB5h1I7AZE0zNNp3As3bKBG3jXqZWwWdU8vzrovjoWAaodww/w640-h360/123fx-2.gif&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;And then I instructed the person on the other end to alter the left margin with &lt;span style=&quot;font-family: courier;&quot;&gt;/ppoml&lt;/span&gt;&amp;nbsp;(&lt;span style=&quot;font-family: courier;&quot;&gt;/Print Printer Options Margins Left&lt;/span&gt;). I also told them if they wanted a change to the page headers I&#39;d need to &quot;send them a disc&quot; (i.e. mail a floppy disc to the US!)&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;If you are going to debug anything you need to tighten the loop between trying something and observing the output of your change. This should be the Zeroth Law of Debugging: get the smallest/fastest test case so you can iterate.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;Worst case send faxes across the Atlantic.&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgHKaAHsFiYNnAH36kFKQdWGdtiPd6-AulKES6UwkiyVVWEZ-fqAZu_53HVlie0Ftz-pFokP24OLBf1792PRTvZAZmJeIYd7_TSTfP9DvSeikXQJzXBj5rXgoRoSv8P3dUXzg4HE9WdbWLwTwB_FdWZB67ddTLVZFaoD0So7K1k7z-JDAJoVfJpA/s529/123fax-3.jpeg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;472&quot; data-original-width=&quot;529&quot; height=&quot;358&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgHKaAHsFiYNnAH36kFKQdWGdtiPd6-AulKES6UwkiyVVWEZ-fqAZu_53HVlie0Ftz-pFokP24OLBf1792PRTvZAZmJeIYd7_TSTfP9DvSeikXQJzXBj5rXgoRoSv8P3dUXzg4HE9WdbWLwTwB_FdWZB67ddTLVZFaoD0So7K1k7z-JDAJoVfJpA/w400-h358/123fax-3.jpeg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;</content>
        <link rel="replies" type="application/atom+xml" href="http://blog.jgc.org/feeds/6045805352103665596/comments/default" title="Post Comments"/>
        <link rel="replies" type="text/html" href="http://www.blogger.com/comment/fullpage/post/19303585/6045805352103665596" title="3 Comments"/>
        <link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19303585/posts/default/6045805352103665596"/>
        <link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19303585/posts/default/6045805352103665596"/>
        <link rel="alternate" type="text/html" href="http://blog.jgc.org/2025/03/debugging-lotus-1-2-3-by-fax.html" title="Debugging Lotus 1-2-3 by fax"/>
        <author>
            <name>Unknown</name>
            <email>[email protected]</email>
            <gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="https://img1.blogblog.com/img/b16-rounded.gif"/>
        </author>
        <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvBJFVo9lHXKYXrDQLzGXbikkdfnrYIrLIVEfKAtf8xXit4aysAwKI4eGJE7DDtpGox5v5nGtimyBlgEsV2TfFhoJZjOzrMvKn_Y9zWvlnd90WmDJNvY_PhjY-e88ULkTz3anDxMYBTVvcZy6_-WWvwGiNGkfcpE0zZM6ycrTXGZO9d-Qun1QZXg/s72-w462-h640-c/123fax-1.jpeg" height="72" width="72"/>
        <thr:total>3</thr:total>
    </entry>
    <entry>
        <id>tag:blogger.com,1999:blog-19303585.post-5795781756177787948</id>
        <published>2025-02-13T17:55:00.004+00:00</published>
        <updated>2025-02-13T17:59:46.833+00:00</updated>
        <title type="text">I have come to loathe acronyms</title>
        <content type="html">&lt;p&gt;Unless they are widely, widely known they make communication worse. And they have a tendency to make the writer seem pompous, or a member of some special clique, while making a reader who doesn&#39;t know the acronym feel foolish.&amp;nbsp;&lt;/p&gt;&lt;p&gt;They are the opposite of clear communication, and are often accompanied by unclear, complex language.&lt;/p&gt;&lt;p&gt;The writer&#39;s goal (whether of a book, an email, or whatever the hell we call a tweet now) should be to be understood. Acronyms are an impediment to that and are often more difficult to read or say than actual words.&amp;nbsp;&lt;/p&gt;&lt;p&gt;And don&#39;t fall into the awful trap of defining an acronym in a document and then using it later. That&#39;s a substitute for using plain language. Always use plain language.&lt;/p&gt;&lt;p&gt;Unless your goal is to be misunderstood.&amp;nbsp;&lt;/p&gt;</content>
        <link rel="replies" type="application/atom+xml" href="http://blog.jgc.org/feeds/5795781756177787948/comments/default" title="Post Comments"/>
        <link rel="replies" type="text/html" href="http://www.blogger.com/comment/fullpage/post/19303585/5795781756177787948" title="2 Comments"/>
        <link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19303585/posts/default/5795781756177787948"/>
        <link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19303585/posts/default/5795781756177787948"/>
        <link rel="alternate" type="text/html" href="http://blog.jgc.org/2025/02/i-have-come-to-loath-acronyms.html" title="I have come to loathe acronyms"/>
        <author>
            <name>Unknown</name>
            <email>[email protected]</email>
            <gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="https://img1.blogblog.com/img/b16-rounded.gif"/>
        </author>
        <thr:total>2</thr:total>
    </entry>
    <entry>
        <id>tag:blogger.com,1999:blog-19303585.post-2972398345099268358</id>
        <published>2025-02-10T17:09:00.000+00:00</published>
        <updated>2025-02-10T17:09:09.529+00:00</updated>
        <category scheme="http://www.blogger.com/atom/ns#" term="hardware"/>
        <title type="text">Archiving hardware projects</title>
        <content type="html">&lt;p&gt;From time to time I do some project involving old hardware that requires connecting it to a modern computer. For example,&lt;/p&gt;&lt;p&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://blog.jgc.org/2025/02/getting-kim-1-to-talk-to-my-mac.html&quot;&gt;Getting the KIM-1 to talk to my Mac&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://blog.jgc.org/2022/03/resurrecting-dataman-s4-prom-programmer.html&quot;&gt;Resurrecting a Dataman S4 PROM programmer&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://blog.jgc.org/2022/04/ripping-old-mini-dv-video-tapes-on-mac.html&quot;&gt;Ripping old mini DV video tapes on a Mac&lt;/a&gt;&lt;/p&gt;&lt;p&gt;And I&#39;ve come to the conclusion that archiving the related hardware is important. For example, I got this Dataman S4 talking to my Mac using a few different cables. I bought a set of cables and archived them in a bag for the next time I need to do this.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_A37qHS8SIBr146GTQt5yyNg3AENYhRcyj6vAbQCCJeCaSpXI5Mh8IiMRhQMYLGqtqoIeGhgFK5VarUgScWfPV_jlhcyZEXdbtcjUCIgpdz6WG903sxPYD6g9c3rG3hyphenhyphenNcf06m0cyeKQn1OkAVMy_4fFLoiDbNAs1Z2KhlFET2S_rDJY9yZpc1w/s2664/dataman5.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;2664&quot; data-original-width=&quot;2381&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_A37qHS8SIBr146GTQt5yyNg3AENYhRcyj6vAbQCCJeCaSpXI5Mh8IiMRhQMYLGqtqoIeGhgFK5VarUgScWfPV_jlhcyZEXdbtcjUCIgpdz6WG903sxPYD6g9c3rG3hyphenhyphenNcf06m0cyeKQn1OkAVMy_4fFLoiDbNAs1Z2KhlFET2S_rDJY9yZpc1w/w573-h640/dataman5.jpg&quot; width=&quot;573&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;The Dataman S4 project required three things: a USB-C to USB-A adapter, a USB-A to RS-232 adapter and a 9 pin to 25 pin serial cable.&amp;nbsp;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBw-gv1T6yK7NS-YQn7wHnDNK61-ow4R6AYjWETsNLG-IQ7pXIcni3NQg0MpcFWKaNyTE6edLK3whoeDL_cvm5M4DzwHm7ytq3zngw5GAwEM3I4wfHlLZdXIruTlCLbpooZi9FZPOQ5Axdq-O8IqUVOFbVpRmNR8NZlE9-Y39vvjUta7XR3UgUug/s4234/archive-1.jpeg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;4234&quot; data-original-width=&quot;3902&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBw-gv1T6yK7NS-YQn7wHnDNK61-ow4R6AYjWETsNLG-IQ7pXIcni3NQg0MpcFWKaNyTE6edLK3whoeDL_cvm5M4DzwHm7ytq3zngw5GAwEM3I4wfHlLZdXIruTlCLbpooZi9FZPOQ5Axdq-O8IqUVOFbVpRmNR8NZlE9-Y39vvjUta7XR3UgUug/w590-h640/archive-1.jpeg&quot; width=&quot;590&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;These things are fairly inexpensive making it viable to archive them. Now I only have to worry about the drivers being available!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8oe93fugNv6GtBjc9-RkAdaU3jo5Cruy6-BxJH-5uX_k7eFtKFqTBODWC9VXHVSBWRRAHNt5djl1DSNlJ3-mzuSuWZYFR_kK0R7gGSH1zxuL87xhen5ysQTBmh7shP0t4yR4iVQJXXqPsGSI3cSFlQdrROEWokFWiCNCcYNxO0NiQrp4a1T5xfw/s4083/archive-2.jpeg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;4083&quot; data-original-width=&quot;3763&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8oe93fugNv6GtBjc9-RkAdaU3jo5Cruy6-BxJH-5uX_k7eFtKFqTBODWC9VXHVSBWRRAHNt5djl1DSNlJ3-mzuSuWZYFR_kK0R7gGSH1zxuL87xhen5ysQTBmh7shP0t4yR4iVQJXXqPsGSI3cSFlQdrROEWokFWiCNCcYNxO0NiQrp4a1T5xfw/w590-h640/archive-2.jpeg&quot; width=&quot;590&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;</content>
        <link rel="replies" type="application/atom+xml" href="http://blog.jgc.org/feeds/2972398345099268358/comments/default" title="Post Comments"/>
        <link rel="replies" type="text/html" href="http://www.blogger.com/comment/fullpage/post/19303585/2972398345099268358" title="0 Comments"/>
        <link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19303585/posts/default/2972398345099268358"/>
        <link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19303585/posts/default/2972398345099268358"/>
        <link rel="alternate" type="text/html" href="http://blog.jgc.org/2025/02/archiving-hardware-projects.html" title="Archiving hardware projects"/>
        <author>
            <name>Unknown</name>
            <email>[email protected]</email>
            <gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="https://img1.blogblog.com/img/b16-rounded.gif"/>
        </author>
        <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_A37qHS8SIBr146GTQt5yyNg3AENYhRcyj6vAbQCCJeCaSpXI5Mh8IiMRhQMYLGqtqoIeGhgFK5VarUgScWfPV_jlhcyZEXdbtcjUCIgpdz6WG903sxPYD6g9c3rG3hyphenhyphenNcf06m0cyeKQn1OkAVMy_4fFLoiDbNAs1Z2KhlFET2S_rDJY9yZpc1w/s72-w573-h640-c/dataman5.jpg" height="72" width="72"/>
        <thr:total>0</thr:total>
    </entry>
    <entry>
        <id>tag:blogger.com,1999:blog-19303585.post-3528602294442713744</id>
        <published>2025-02-09T20:28:00.005+00:00</published>
        <updated>2025-02-09T20:36:02.125+00:00</updated>
        <category scheme="http://www.blogger.com/atom/ns#" term="retro"/>
        <title type="text">Getting the KIM-1 to talk to my Mac</title>
        <content type="html">&lt;p&gt;I&#39;ve written before about &lt;a href=&quot;https://blog.jgc.org/2023/11/my-1976-kim-1.html&quot;&gt;my 1976 KIM-1&lt;/a&gt; and &lt;a href=&quot;https://blog.jgc.org/2013/04/how-i-coded-in-1985.html&quot;&gt;code I wrote&lt;/a&gt; for a similar one long ago. But I hadn&#39;t done much with the KIM-1 and strongly believe that old hardware need to be living machines not still lives. But using the KIM-1 directly (via its keypad and little hexadecimal display) is painful. I wanted to be able to use it with a terminal.&lt;/p&gt;&lt;p&gt;Luckily, the KIM-1 was designed to interface to a terminal: a &lt;a href=&quot;https://en.wikipedia.org/wiki/Teletype_Model_33&quot;&gt;Model 33 ASR Teletype&lt;/a&gt;. Teletypes use a type of interface which is unusual to most people (unless you work with industrial machinery where it&#39;s pretty common). That interface is a &lt;a href=&quot;https://en.wikipedia.org/wiki/Digital_current_loop_interface&quot;&gt;current loop&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;A current loop uses current (often 20mA) rather than voltage (such as the voltage levels seen in common serial interfaces). Prior to the creation of &lt;a href=&quot;https://en.wikipedia.org/wiki/RS-232&quot;&gt;RS-232&lt;/a&gt;, current loops were very common. Current loops are still used in industrial settings partly because they have good noise immunity, can go for long distances, and are simple and reliable.&amp;nbsp;&lt;/p&gt;&lt;p&gt;In the KIM-1 manual there&#39;s a picture of the way its current loop works when connected to a Teletype:&amp;nbsp;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNI4PoUrRp6VTMXV5sTj-cbd5KxPR0J4kMurosS_YawM1EPLVcKsq-4MIVitMa48NSS9nPgfYU2eui9t6UcwwHXSjzVwrYUIVmGWC1Ex7jFBgjyKnJ0sY7WpVmCbloaGjL5zeRAwX6XtS4l_lHwH88ihpgZ-awjCfDIcFdgCvBJ4MZ-b3pQydWNg/s1368/kim-1-1.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1176&quot; data-original-width=&quot;1368&quot; height=&quot;550&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNI4PoUrRp6VTMXV5sTj-cbd5KxPR0J4kMurosS_YawM1EPLVcKsq-4MIVitMa48NSS9nPgfYU2eui9t6UcwwHXSjzVwrYUIVmGWC1Ex7jFBgjyKnJ0sY7WpVmCbloaGjL5zeRAwX6XtS4l_lHwH88ihpgZ-awjCfDIcFdgCvBJ4MZ-b3pQydWNg/w640-h550/kim-1-1.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;When the KIM-1 wants to send data to the Teletype it uses pins S and U of one of its edge connectors. S is permanently connected to +5V via a 150 ohm resistor. When the KIM-1 receives data from the Teletype&#39;s keyboard it uses pins R and T. Just like S, R is permanently connected to +5V. The important thing to note is that the KIM-1 is responsible for the current: the Teletype is entirely &quot;dumb&quot;. This will matter later in this blog post.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;I happened to have lying around &lt;a href=&quot;https://www.horter-shop.de/de/rs232-tty-adapter-passiv/151-bausatz-rs232-tty-adapter-passiv-4260404260127.html&quot;&gt;a kit to make an adapter between RS-232 and the Siemens SIMATIC S5 current loop&lt;/a&gt;.&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAeSbQlVy8BJolG0uDvmgGgtdDsoDFLV6Qo0sHrg-iVI8P0stXBdUg_HsRJqAAIToLVMsjMQu0EQeDfhja17tH9se1YtZXs3yccjPKcwmIUILqzB0I9xizoo8U7jLx_JXb8q2uenEPW7Tc_hv3sGrj7G9CRuep8WmkpyU13Beigo4jbMFZxiAjZw/s982/kim-1-2.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;946&quot; data-original-width=&quot;982&quot; height=&quot;616&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAeSbQlVy8BJolG0uDvmgGgtdDsoDFLV6Qo0sHrg-iVI8P0stXBdUg_HsRJqAAIToLVMsjMQu0EQeDfhja17tH9se1YtZXs3yccjPKcwmIUILqzB0I9xizoo8U7jLx_JXb8q2uenEPW7Tc_hv3sGrj7G9CRuep8WmkpyU13Beigo4jbMFZxiAjZw/w640-h616/kim-1-2.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;A simple kit to build and since USB to RS-232 adapters are easy to find with this I&#39;d be able to communicate with the KIM-1. But first check the circuit diagram of this adapter. There&#39;s a small problem on the receive side.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCYmSOPwceRgzMBw50FJPAOYpZdhpJp0Yh3WhN120WAo6qEHLwzn2a5CwFTXAYINa_36dofqGtjI7RXdbVWbcVenGRU4f7f6l-Mhb7lc0DEYEc6aicS7EFNqWhg6ynje8sxQcqZQVyWujO1ARaJUotW1M8gijQh0X27xcgnN3y32U5FNllgFWX7A/s1758/kim-1-3.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;874&quot; data-original-width=&quot;1758&quot; height=&quot;318&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCYmSOPwceRgzMBw50FJPAOYpZdhpJp0Yh3WhN120WAo6qEHLwzn2a5CwFTXAYINa_36dofqGtjI7RXdbVWbcVenGRU4f7f6l-Mhb7lc0DEYEc6aicS7EFNqWhg6ynje8sxQcqZQVyWujO1ARaJUotW1M8gijQh0X27xcgnN3y32U5FNllgFWX7A/w640-h318/kim-1-3.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;As it pretty common with current loop applications, optoisolators are used. OK1 handles when the device connected to the RS-232 transmits something. And you can see from the diagram that it expects to be getting 5V, 20mA in on its pin 5 and then out again on pin 4. So, that&#39;ll work perfectly for the &quot;keyboard&quot; connection to the KIM-1 (pins R and T).&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;But the receive side is a different story. It&#39;s handled by OK2 and it&#39;s expecting 5V, 20mA on pin 1,p but pin 2 goes to GND. So, there&#39;s no &quot;loop&quot; present. This won&#39;t work with the KIM-1 without a small modification.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;I built the kit and and tested it against the KIM-1 like this:&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghrUvvLUgSr3RZhod4XiIyxt8viOVH-NQwoLikQMDsZM6jf17czwBXfMYjJKhiB0DeTZMp8ryHVitx-8g1TolmqxAhxfE633YHYpoGBidPl1hcs3eBGgcPeGpE1VULmDIXNxOPGk9D5eiRK7TfxMcWc7uvnXLm3Ht7pP5gBBIq9Ms93bhuvCgyDg/s1280/kim-1-4.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;744&quot; data-original-width=&quot;1280&quot; height=&quot;372&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghrUvvLUgSr3RZhod4XiIyxt8viOVH-NQwoLikQMDsZM6jf17czwBXfMYjJKhiB0DeTZMp8ryHVitx-8g1TolmqxAhxfE633YHYpoGBidPl1hcs3eBGgcPeGpE1VULmDIXNxOPGk9D5eiRK7TfxMcWc7uvnXLm3Ht7pP5gBBIq9Ms93bhuvCgyDg/w640-h372/kim-1-4.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;Looks messy but it validated the little modification I needed to make and that I could talk to the KIM-1. Here it is talking at 300 baud using the RS-232 to USB adapter seen above.&amp;nbsp;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQxkZf-cbzjvBVaBvQGWO3XeLjzf6k7kzf0uM0sczMbzcLYzSoZ6sUXsg47ey0zq4VautycgRmuAz1MVwBIbrS01NywuIKJZSoBvvnj7T8kEP8kzpBBPmwndpaBqp7JpibNfBRYRGlHQHh0MShzorcPoQYeN541YcXG3gK__dTB5kvdR6lw3bnUg/s1146/kim-1.gif&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1020&quot; data-original-width=&quot;1146&quot; height=&quot;570&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQxkZf-cbzjvBVaBvQGWO3XeLjzf6k7kzf0uM0sczMbzcLYzSoZ6sUXsg47ey0zq4VautycgRmuAz1MVwBIbrS01NywuIKJZSoBvvnj7T8kEP8kzpBBPmwndpaBqp7JpibNfBRYRGlHQHh0MShzorcPoQYeN541YcXG3gK__dTB5kvdR6lw3bnUg/w640-h570/kim-1.gif&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;So, what&#39;s the modification? Well, pin 2 of OK2 goes to ground and we don&#39;t want it to, we want it to go the KIM-1&#39;s pin U. There are two ways to do this. I could have cut the track on the back of the board that goes from pin 2 to ground, and soldered a wire on the back.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixwnVKqFHl5uFIx6voI_JNpHEdW1WRpV8-zv4w6QydXJ0CTPSLced0JGZgZe8rucLGJG_AqZJzDk2V-7iC1kYzi7o0i-OmKObeNXGq_CjBaSxcbPX0VlK_eGEznspzc6nZ-btpSZdkyL9NZ-6lChzPpcZCz-rEFODbiN5WSQT-jCdVHbTbizarkQ/s540/kim-1-5.png&quot; style=&quot;margin-left: 1em; margin-right: 1em; text-align: center;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;488&quot; data-original-width=&quot;540&quot; height=&quot;289&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixwnVKqFHl5uFIx6voI_JNpHEdW1WRpV8-zv4w6QydXJ0CTPSLced0JGZgZe8rucLGJG_AqZJzDk2V-7iC1kYzi7o0i-OmKObeNXGq_CjBaSxcbPX0VlK_eGEznspzc6nZ-btpSZdkyL9NZ-6lChzPpcZCz-rEFODbiN5WSQT-jCdVHbTbizarkQ/s320/kim-1-5.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;But this kit came with all the chips socketed so I took an even simpler route. Bend pin 2 away from the socket and solder directly to it.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdUEHXkzdm5jFklLlLDNbtbLnPCKx7RELxbJMLj2-0lGW7nFmcOD_qzOp8UReQ7tyMTTbaHtjA6_NlwUd0O4Cr48_2T60ZVRf8CGEpAfcjv8qECa7aFXoOFy5kLvMUBa3ZOE_y8ng7kDFry6PALL4aB2aTxRl9kDjWP9ubNAC_l4cs3rrUBAtEvQ/s3193/kim-1-6.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;2698&quot; data-original-width=&quot;3193&quot; height=&quot;540&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdUEHXkzdm5jFklLlLDNbtbLnPCKx7RELxbJMLj2-0lGW7nFmcOD_qzOp8UReQ7tyMTTbaHtjA6_NlwUd0O4Cr48_2T60ZVRf8CGEpAfcjv8qECa7aFXoOFy5kLvMUBa3ZOE_y8ng7kDFry6PALL4aB2aTxRl9kDjWP9ubNAC_l4cs3rrUBAtEvQ/w640-h540/kim-1-6.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;And that worked fine. The kit also came with a nice little box and so the final adapter looks neat.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfUeBT17s3TjORhTssUtiUGLaW1M_CpBMrWIwnNG737fVgehQnvGZ9-9VoHNNFOeDzNCtUrjQwO82_4VMayPlsyQhOwI23jMH-1rPcHCzkVWi9ZkJe8T1zICJAcAjRnyJaqNyr8ZZj7IRLZn3ivPDXWUQFV5VkuNaKU1H-cSDk07jFKqq6it_PxQ/s1280/kim-1-7.jpeg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;960&quot; data-original-width=&quot;1280&quot; height=&quot;480&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfUeBT17s3TjORhTssUtiUGLaW1M_CpBMrWIwnNG737fVgehQnvGZ9-9VoHNNFOeDzNCtUrjQwO82_4VMayPlsyQhOwI23jMH-1rPcHCzkVWi9ZkJe8T1zICJAcAjRnyJaqNyr8ZZj7IRLZn3ivPDXWUQFV5VkuNaKU1H-cSDk07jFKqq6it_PxQ/w640-h480/kim-1-7.jpeg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;The grey wire goes to the KIM-1, the white wire is a USB-A cable that I&#39;m using to power the adapter and the KIM-1 itself.&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRNc94lv50bDs6CSJnYk8rEeC9wAiQlf_tIUCAgHw203ey4NJwxBF8MyhroSH1TyB6FPqsk4i4VTQGUbQwYcXBGvlCv5fI6P0qOYMcE5sB2t3VDm-ebZY-iMjZgWndXe2Gs5_bY4cHcwNNUpXKMBr8GXj-C_dkNU7oDPRYYKoqrgdfJQOBb1nDTw/s1280/kim-1-8.jpeg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;960&quot; data-original-width=&quot;1280&quot; height=&quot;480&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRNc94lv50bDs6CSJnYk8rEeC9wAiQlf_tIUCAgHw203ey4NJwxBF8MyhroSH1TyB6FPqsk4i4VTQGUbQwYcXBGvlCv5fI6P0qOYMcE5sB2t3VDm-ebZY-iMjZgWndXe2Gs5_bY4cHcwNNUpXKMBr8GXj-C_dkNU7oDPRYYKoqrgdfJQOBb1nDTw/w640-h480/kim-1-8.jpeg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The KIM-1 will happily communicate as 1200 baud with 7 bit ASCII and 2 stop bits. I&#39;m using minicom to communicate with it. The main thing is to set the delete key to send DEL instead of BS since the KIM-1 needs to receive a DEL on start up so that it can measure the Mac&#39;s transmission speed.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;One of the Teletype functions available is to load a program from punched tape. I don&#39;t have an actual Teletype but I can emulate the punched tape format and that&#39;ll allow me to upload programs easily.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9IJ_wZJFKEaDD5UhZ_cb3FiMO9IHgOfrMnrKOQjYdMuSvZNwO7cxND1M774qpg639z71zcWxWUPrvc-YFYLWIS5SdfzlZ0nMFZpaUKHE5JANoIwmHLXEa6NDE-oAkgwPyukU3RtHTmdhisdCeYCaD_SgRDAldBPtge1gbSAbM8XLe-hQEccRrqg/s1208/kim-1-9.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1208&quot; data-original-width=&quot;1016&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9IJ_wZJFKEaDD5UhZ_cb3FiMO9IHgOfrMnrKOQjYdMuSvZNwO7cxND1M774qpg639z71zcWxWUPrvc-YFYLWIS5SdfzlZ0nMFZpaUKHE5JANoIwmHLXEa6NDE-oAkgwPyukU3RtHTmdhisdCeYCaD_SgRDAldBPtge1gbSAbM8XLe-hQEccRrqg/w538-h640/kim-1-9.png&quot; width=&quot;538&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;The format itself is not complicated.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWxEHqPySDq6ch5c9XLYO8NOf7B8x-ExUa0UDgFltgwhqYWDBAyNrgpLmn3EWcnBeWPOcQ6TNOcZOz0ia3TM2MFcvx5ol54r9ENRTb76a_S-jd78mbyl1J85011K7a4wTRgYyTDaPfsOEjdAP-Py9ny5sk-oRxHawHil31r6Wba_QiU8QKcw8etg/s1058/kim-1-10.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1058&quot; data-original-width=&quot;1016&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWxEHqPySDq6ch5c9XLYO8NOf7B8x-ExUa0UDgFltgwhqYWDBAyNrgpLmn3EWcnBeWPOcQ6TNOcZOz0ia3TM2MFcvx5ol54r9ENRTb76a_S-jd78mbyl1J85011K7a4wTRgYyTDaPfsOEjdAP-Py9ny5sk-oRxHawHil31r6Wba_QiU8QKcw8etg/w614-h640/kim-1-10.png&quot; width=&quot;614&quot; /&gt;&lt;/a&gt;&lt;/div&gt;</content>
        <link rel="replies" type="application/atom+xml" href="http://blog.jgc.org/feeds/3528602294442713744/comments/default" title="Post Comments"/>
        <link rel="replies" type="text/html" href="http://www.blogger.com/comment/fullpage/post/19303585/3528602294442713744" title="0 Comments"/>
        <link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19303585/posts/default/3528602294442713744"/>
        <link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19303585/posts/default/3528602294442713744"/>
        <link rel="alternate" type="text/html" href="http://blog.jgc.org/2025/02/getting-kim-1-to-talk-to-my-mac.html" title="Getting the KIM-1 to talk to my Mac"/>
        <author>
            <name>Unknown</name>
            <email>[email protected]</email>
            <gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="https://img1.blogblog.com/img/b16-rounded.gif"/>
        </author>
        <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNI4PoUrRp6VTMXV5sTj-cbd5KxPR0J4kMurosS_YawM1EPLVcKsq-4MIVitMa48NSS9nPgfYU2eui9t6UcwwHXSjzVwrYUIVmGWC1Ex7jFBgjyKnJ0sY7WpVmCbloaGjL5zeRAwX6XtS4l_lHwH88ihpgZ-awjCfDIcFdgCvBJ4MZ-b3pQydWNg/s72-w640-h550-c/kim-1-1.png" height="72" width="72"/>
        <thr:total>0</thr:total>
    </entry>
    <entry>
        <id>tag:blogger.com,1999:blog-19303585.post-8168793316207256718</id>
        <published>2025-02-03T19:27:00.055+00:00</published>
        <updated>2025-02-05T09:50:10.781+00:00</updated>
        <title type="text">Twenty years of the &quot;GNU Make Standard Library&quot;</title>
        <content type="html">&lt;p&gt;Twenty years ago, on February 3, 2005, I released v1.0.0 of a project I called &quot;GNU Make Standard Library&quot; (GMSL). That &lt;a href=&quot;https://sourceforge.net/projects/gmsl/files/GNU%20Make%20Standard%20Library/v1.0.0/&quot;&gt;first release&lt;/a&gt; can still be found in its original location on SourceForge. I moved the project from SourceForge to &lt;a href=&quot;https://github.com/jgrahamc/gmsl&quot;&gt;GitHub&lt;/a&gt; and newer releases are there. The latest release is &lt;a href=&quot;https://github.com/jgrahamc/gmsl/releases/tag/v1.2.2&quot;&gt;v1.2.2&lt;/a&gt; on March 30, 2024.&lt;/p&gt;&lt;p&gt;The project has its own homepage at&amp;nbsp;&lt;a href=&quot;https://gmsl.jgc.org/&quot;&gt;https://gmsl.jgc.org/&lt;/a&gt;. The page describes the GMSL as &quot;a collection of functions implemented using native GNU Make functionality that provide list and string manipulation, integer arithmetic, associative arrays, stacks, and debugging facilities.&quot;&lt;/p&gt;&lt;p&gt;GMSL grew out of work that eventually became my book &quot;&lt;a href=&quot;https://nostarch.com/gnumake&quot;&gt;The GNU Make Book&lt;/a&gt;&quot;. What can it do?&lt;/p&gt;&lt;p&gt;Well, things like this:&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;include gmsl&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;VAR&amp;nbsp; &amp;nbsp; := Here is a string with some words in it.&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;$(info $(VAR))&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;# Convert VAR to lowercase&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;LC_VAR := $(call lc,$(VAR))&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;$(info $(LC_VAR))&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;# Get the length of LC_VAR as a string&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;$(info $(call strlen,$(LC_VAR)))&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;# See if VAR and LC_VAR are the same string&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;$(info $(if $(call seq,$(VAR),$(LC_VAR)),Same,Different))&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;# Treat LC_VAR as a list and get the last element&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;$(info $(call last,$(LC_VAR)))&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;# Get the number of list elements in LC_VAR&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;$(info $(call length,$(LC_VAR)))&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;# Apply the strlen function to each element of LC_VAR&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;$(info $(call map,strlen,$(LC_VAR)))&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;# Deduplicate the list of lenghts of elements of LC_VAR&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;$(info $(call uniq,$(call map,strlen,$(LC_VAR))))&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;# Split LC_VAR on the letter e and replace with 3&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;$(info $(call merge,3,$(call split,e,$(LC_VAR))))&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;# Create an associative array mapping the lengths of words&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;# in LC_VAR to a count for each length&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;increment_aa = $(call set,LC_VAR_AA,$1,$(call&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;inc,$(call&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;get,LC_VAR_AA,$1)))&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;$(call map,increment_aa,$(call map,strlen,$(LC_VAR)))&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;dump_key = $(info $1: $(call get,LC_VAR_AA,$1))&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;$(call map,dump_key,$(call keys,LC_VAR_AA))&lt;/span&gt;&lt;/p&gt;&lt;p&gt;And a whole lot more. The entire GMSL is written using native GNU Make functionality and pull requests are welcome!&lt;/p&gt;&lt;p&gt;Update 2025-02-05: I decided GMSL was missing a &lt;a href=&quot;https://github.com/jgrahamc/gmsl/blob/145bda7295dee873b2c2842f404365857ea24764/__gmsl#L239&quot;&gt;fold&lt;/a&gt; function so I added it. So, latest release is today, &lt;a href=&quot;https://github.com/jgrahamc/gmsl/releases/tag/v1.2.3&quot;&gt;v1.2.3&lt;/a&gt;.&amp;nbsp;&lt;/p&gt;</content>
        <link rel="replies" type="application/atom+xml" href="http://blog.jgc.org/feeds/8168793316207256718/comments/default" title="Post Comments"/>
        <link rel="replies" type="text/html" href="http://www.blogger.com/comment/fullpage/post/19303585/8168793316207256718" title="0 Comments"/>
        <link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19303585/posts/default/8168793316207256718"/>
        <link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19303585/posts/default/8168793316207256718"/>
        <link rel="alternate" type="text/html" href="http://blog.jgc.org/2025/02/twenty-years-of-gnu-make-standard.html" title="Twenty years of the &quot;GNU Make Standard Library&quot;"/>
        <author>
            <name>Unknown</name>
            <email>[email protected]</email>
            <gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="https://img1.blogblog.com/img/b16-rounded.gif"/>
        </author>
        <thr:total>0</thr:total>
    </entry>
    <entry>
        <id>tag:blogger.com,1999:blog-19303585.post-8649792458628677830</id>
        <published>2024-12-26T15:26:00.003+00:00</published>
        <updated>2024-12-26T15:34:02.508+00:00</updated>
        <title type="text">The complete text of &quot;All Watched Over by Machines of Loving Grace&quot;</title>
        <content type="html">&lt;p&gt;Richard Brautigan&#39;s poem &quot;&lt;a href=&quot;https://en.wikipedia.org/wiki/All_Watched_Over_by_Machines_of_Loving_Grace&quot;&gt;All Watched Over by Machines of Loving Grace&lt;/a&gt;&quot; is somewhat well known in tech. circles but I couldn&#39;t find a complete PDF of the &lt;a href=&quot;https://en.wikipedia.org/wiki/All_Watched_Over_by_Machines_of_Loving_Grace_(poetry_collection)&quot;&gt;original 1967 publication of it (and other poems)&lt;/a&gt; online.&amp;nbsp;&lt;/p&gt;&lt;p&gt;The copyright notice in Brautigan&#39;s collection reads:&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp;&amp;nbsp;© Copyright 1967 by Richard Brautigan&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;Permission is granted to reprint&lt;br /&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;any of these poems in magazines,&lt;br /&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;books and newspapers if they are&lt;br /&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;given away free.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;I am interpreting &quot;print&quot; as including the availability of a free PDF and making a scan of the complete book available here.&amp;nbsp;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://jgc.org/awobmolg-1967.pdf&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1676&quot; data-original-width=&quot;1392&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGhScUr9y4lWyAZs6B-j7QtJjfqFmt-VrOpfII9BIJYzoGDGCtdUYR0pffEwSIWwDUrIBaj57cz5Uluj8CG1hzA8Oi6Vyvm9Bc3wcDkAxucLJQJGrQHOOYLfwIE0zc-JsnuKfAkwrxQPe1N1RdLV7uOhfQD84r6oCgMuq39ZxVXOTT3sNgxGv9CA/w532-h640/Screenshot%202024-12-26%20at%2015.24.00.png&quot; width=&quot;532&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;</content>
        <link rel="replies" type="application/atom+xml" href="http://blog.jgc.org/feeds/8649792458628677830/comments/default" title="Post Comments"/>
        <link rel="replies" type="text/html" href="http://www.blogger.com/comment/fullpage/post/19303585/8649792458628677830" title="1 Comments"/>
        <link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19303585/posts/default/8649792458628677830"/>
        <link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19303585/posts/default/8649792458628677830"/>
        <link rel="alternate" type="text/html" href="http://blog.jgc.org/2024/12/the-complete-text-of-all-watched-over.html" title="The complete text of &quot;All Watched Over by Machines of Loving Grace&quot;"/>
        <author>
            <name>Unknown</name>
            <email>[email protected]</email>
            <gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="https://img1.blogblog.com/img/b16-rounded.gif"/>
        </author>
        <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGhScUr9y4lWyAZs6B-j7QtJjfqFmt-VrOpfII9BIJYzoGDGCtdUYR0pffEwSIWwDUrIBaj57cz5Uluj8CG1hzA8Oi6Vyvm9Bc3wcDkAxucLJQJGrQHOOYLfwIE0zc-JsnuKfAkwrxQPe1N1RdLV7uOhfQD84r6oCgMuq39ZxVXOTT3sNgxGv9CA/s72-w532-h640-c/Screenshot%202024-12-26%20at%2015.24.00.png" height="72" width="72"/>
        <thr:total>1</thr:total>
    </entry>
    <entry>
        <id>tag:blogger.com,1999:blog-19303585.post-8901769136152952921</id>
        <published>2024-12-15T16:15:00.003+00:00</published>
        <updated>2024-12-15T16:16:23.395+00:00</updated>
        <category scheme="http://www.blogger.com/atom/ns#" term="pseudo-randomness"/>
        <title type="text">badkeming: a site for kerning so bad it&#39;s keming</title>
        <content type="html">&lt;p&gt;I made another silly Tumblr (to go along with &lt;a href=&quot;https://moviecode.tumblr.com/&quot;&gt;Movie Code&lt;/a&gt; and &lt;a href=&quot;https://lowbackgroundsteel.ai/&quot;&gt;Low Background Steel&lt;/a&gt;). This times it&#39;s a Tumblr for all those font disasters and other typographical amusements. Welcome to the wonderful world of &lt;a href=&quot;https://badkeming.com&quot;&gt;badkeming.com&lt;/a&gt;:&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://badkeming.com&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1428&quot; data-original-width=&quot;2174&quot; height=&quot;420&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOnAi31wLwP1beQLc-ylj8D2VpWVsJQkuyVcUMViFFpppM7BmbNgrB36PQWpxETwYpIP2PjkoJ-DnsDabdn5UOJoNvy-vh6oPlh2cISzOiqj-vmc-zfHKzSasC8ZamjWl7vwXU5ee2V7Jfj5wuQEBgfyOniA_1_3Z_RuTDFPv3zmTQVugR1HjOZA/w640-h420/badkeming-1.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;Submissions gladly accepted.&lt;/div&gt;</content>
        <link rel="replies" type="application/atom+xml" href="http://blog.jgc.org/feeds/8901769136152952921/comments/default" title="Post Comments"/>
        <link rel="replies" type="text/html" href="http://www.blogger.com/comment/fullpage/post/19303585/8901769136152952921" title="0 Comments"/>
        <link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19303585/posts/default/8901769136152952921"/>
        <link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19303585/posts/default/8901769136152952921"/>
        <link rel="alternate" type="text/html" href="http://blog.jgc.org/2024/12/badkeming-site-for-kerning-so-bad-its.html" title="badkeming: a site for kerning so bad it&#39;s keming"/>
        <author>
            <name>Unknown</name>
            <email>[email protected]</email>
            <gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="https://img1.blogblog.com/img/b16-rounded.gif"/>
        </author>
        <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOnAi31wLwP1beQLc-ylj8D2VpWVsJQkuyVcUMViFFpppM7BmbNgrB36PQWpxETwYpIP2PjkoJ-DnsDabdn5UOJoNvy-vh6oPlh2cISzOiqj-vmc-zfHKzSasC8ZamjWl7vwXU5ee2V7Jfj5wuQEBgfyOniA_1_3Z_RuTDFPv3zmTQVugR1HjOZA/s72-w640-h420-c/badkeming-1.png" height="72" width="72"/>
        <thr:total>0</thr:total>
    </entry>
    <entry>
        <id>tag:blogger.com,1999:blog-19303585.post-4119179139891431895</id>
        <published>2024-12-08T17:24:00.004+00:00</published>
        <updated>2024-12-08T17:28:43.687+00:00</updated>
        <category scheme="http://www.blogger.com/atom/ns#" term="anti-spam"/>
        <title type="text">&quot;All your base are belong to us&quot; introduction to my 2004 MIT Spam Conference talk</title>
        <content type="html">&lt;p&gt;As I&#39;ve mentioned before &lt;a href=&quot;https://blog.jgc.org/2023/07/how-to-beat-adaptivebayesian-spam.html&quot;&gt;my talk at the 2004 MIT Spam Conference&lt;/a&gt; was about using one machine learning system to beat another. In that case a spammer using machine learning to beat a machine learning spam filter.&lt;/p&gt;&lt;p&gt;The talk started with a short video playing off the &lt;a href=&quot;https://en.wikipedia.org/wiki/All_your_base_are_belong_to_us&quot;&gt;All your base are belong to us&lt;/a&gt; meme. I very carefully edited the images to change the text to be about spam and incorporate Paul Graham (who was the instigator of the MIT Spam Conference and an &lt;a href=&quot;https://paulgraham.com/spam.html&quot;&gt;early machine learning spam filter pioneer&lt;/a&gt;).&amp;nbsp;&lt;/p&gt;&lt;p&gt;I thought I&#39;d &lt;a href=&quot;https://blog.jgc.org/2023/05/bringing-popfile-web-site-back-from-dead.html&quot;&gt;lost the audio of that introduction&lt;/a&gt; and randomly came across it today. So here is the restored introduction to the talk made on a Mac in 2004 (I still haven&#39;t found the audio of the actual talk).&lt;/p&gt;

&lt;div style=&quot;padding-top: 56.25%; position: relative;&quot;&gt;
  &lt;iframe allow=&quot;accelerometer; gyroscope; autoplay; encrypted-media; picture-in-picture;&quot; allowfullscreen=&quot;true&quot; loading=&quot;lazy&quot; src=&quot;https://customer-rww76yind8iym5aw.cloudflarestream.com/41a0f39e1f9d7fcde6dd32bacf628437/iframe?poster=https%3A%2F%2Fcustomer-rww76yind8iym5aw.cloudflarestream.com%2F41a0f39e1f9d7fcde6dd32bacf628437%2Fthumbnails%2Fthumbnail.jpg%3Ftime%3D%26height%3D600&quot; style=&quot;border: none; height: 100%; left: 0; position: absolute; top: 0; width: 100%;&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;</content>
        <link rel="replies" type="application/atom+xml" href="http://blog.jgc.org/feeds/4119179139891431895/comments/default" title="Post Comments"/>
        <link rel="replies" type="text/html" href="http://www.blogger.com/comment/fullpage/post/19303585/4119179139891431895" title="0 Comments"/>
        <link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19303585/posts/default/4119179139891431895"/>
        <link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19303585/posts/default/4119179139891431895"/>
        <link rel="alternate" type="text/html" href="http://blog.jgc.org/2024/12/all-you-base-are-belong-to-us.html" title="&quot;All your base are belong to us&quot; introduction to my 2004 MIT Spam Conference talk"/>
        <author>
            <name>Unknown</name>
            <email>[email protected]</email>
            <gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="https://img1.blogblog.com/img/b16-rounded.gif"/>
        </author>
        <thr:total>0</thr:total>
    </entry>
    <entry>
        <id>tag:blogger.com,1999:blog-19303585.post-3123313590817156000</id>
        <published>2024-11-15T19:12:00.001+00:00</published>
        <updated>2024-11-15T19:13:37.606+00:00</updated>
        <category scheme="http://www.blogger.com/atom/ns#" term="popfile"/>
        <category scheme="http://www.blogger.com/atom/ns#" term="pseudo-randomness"/>
        <title type="text">Personalized voice recordings by Elwood &quot;You&#39;ve got mail!&quot; Edwards</title>
        <content type="html">If you&#39;re old enough to have ever used, seen or overheard the once ubiquitous AOL software you&#39;ll have heard the voice of Elwood Edwards. His voice was known to millions for saying &quot;You&#39;ve got mail!&quot;, &quot;Welcome&quot;, &quot;File&#39;s done&quot; and &quot;Goodbye&quot; when using the AOL software. He &lt;a href=&quot;https://www.nytimes.com/2024/11/07/technology/elwood-edwards-aol-dead.html&quot;&gt;died last week&lt;/a&gt; which reminded me of the time I paid him to record a customized greeting for me.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here&#39;s Elwood Edwards explaining how that came about:&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;iframe allowfullscreen=&quot;&quot; class=&quot;BLOG_video_class&quot; height=&quot;266&quot; src=&quot;https://www.youtube.com/embed/yKgiqsdyiAA&quot; width=&quot;320&quot; youtube-src-id=&quot;yKgiqsdyiAA&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;Back in the early 2000s I was working on a machine learning email filtering program called &lt;a href=&quot;https://en.wikipedia.org/wiki/POPFile&quot;&gt;POPFile&lt;/a&gt;&amp;nbsp;and I discovered that Elwood Edwards had a web site &lt;a href=&quot;https://web.archive.org/web/20080613203307/http://www.makinwavs.com/&quot;&gt;makinwavs.com&lt;/a&gt;&amp;nbsp;where you could order custom messages recorded by him in that &quot;AOL voice&quot;.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKrbUDC8NAGhFzCk3ztPZbvakGP4LrkXogIWWXL2-Iakrme-DKKvz5FAgA2EWRDA13mOBceClcVlvKvJn5uWH1N2AGjRUh0_ih-wEfORNoApKB-ZOkOQQYa52qPUYHVzsierokO3eterq0eTxlVsMhfalgbtUTYrzAcKIvyOkPEl_vHrWEbh0BYg/s1536/aol-1.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1022&quot; data-original-width=&quot;1536&quot; height=&quot;426&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKrbUDC8NAGhFzCk3ztPZbvakGP4LrkXogIWWXL2-Iakrme-DKKvz5FAgA2EWRDA13mOBceClcVlvKvJn5uWH1N2AGjRUh0_ih-wEfORNoApKB-ZOkOQQYa52qPUYHVzsierokO3eterq0eTxlVsMhfalgbtUTYrzAcKIvyOkPEl_vHrWEbh0BYg/w640-h426/aol-1.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;So, I ordered &quot;Mail classified by POPFile&quot; and &quot;Use the source, Luke!&quot; from him for a total cost of $30. Here&#39;s the original PayPal receipt:&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; Date: Wed, 13 Nov 2002 11:54:25 -0800&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; From: [email protected]&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; Subject: Receipt for your Payment&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; This email confirms that you have paid EVO, Inc. $30.00&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; using PayPal.&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; This credit card transaction will appear on your bill as&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &quot;PAYPAL*EVO INC&quot;.&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; SHOPPING CART CONTENTS:&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; 1.&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; Item Name:&amp;nbsp; &amp;nbsp;Custom set of 5 non-AOL&amp;nbsp; .WAV Files&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; Option 1:&amp;nbsp; &amp;nbsp; Enter your 5 scripts:: &quot;Use the source, Luke!&quot;,&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;Mail classified by POPFile&quot;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; Option 2:&amp;nbsp; &amp;nbsp; (If needed, enter more info):: (Yep, I know it&#39;s&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; only two, but that&#39;s all I need...)&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; Item Number: EVO-4&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; Item Amount: $30.00&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; Quantity:&amp;nbsp; &amp;nbsp; 1&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Total:&amp;nbsp; &amp;nbsp; $30.00&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Cart Subtotal:&amp;nbsp; $30.00&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Handling:&amp;nbsp; $0.00&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Shipping:&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; Sales Tax (0.000%):&amp;nbsp; $0.00&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Cart Total:&amp;nbsp; $30.00&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; ------------------------------&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; Payment Details:&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; ------------------------------&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; Amount: $30.00&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; Buyer: John Graham-Cumming&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; ------------------------------&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; Business Information:&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; ------------------------------&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; Business: EVO, Inc.&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; Contact E-Mail: [email protected]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;Three days later I had three voice files (the two I&#39;d ordered plus he threw in &quot;You&#39;ve got mail, John!&quot; for free).&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; From: [email protected]&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; Date: Sat, 16 Nov 2002 22:16:04 -0500&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; Subject: Your files :)&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; Hi, John.&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; Thanks for your order.&amp;nbsp; Here are your files... and I included a&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &quot;You&#39;ve got mail, John&quot; file, too.&amp;nbsp; Enjoy!!&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; El Edwards&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;You can hear all three original files below.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;br /&gt;&lt;/div&gt;
  
  &lt;iframe allow=&quot;autoplay&quot; frameborder=&quot;no&quot; height=&quot;166&quot; scrolling=&quot;no&quot; src=&quot;https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/1953136867&amp;amp;color=%23ff5500&amp;amp;auto_play=false&amp;amp;hide_related=false&amp;amp;show_comments=true&amp;amp;show_user=true&amp;amp;show_reposts=false&amp;amp;show_teaser=true&quot; width=&quot;100%&quot;&gt;&lt;/iframe&gt;&lt;div style=&quot;color: #cccccc; font-family: Interstate, &amp;quot;Lucida Grande&amp;quot;, &amp;quot;Lucida Sans Unicode&amp;quot;, &amp;quot;Lucida Sans&amp;quot;, Garuda, Verdana, Tahoma, sans-serif; font-size: 10px; font-weight: 100; line-break: anywhere; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; word-break: normal;&quot;&gt;&lt;a href=&quot;https://soundcloud.com/john-graham-cumming&quot; style=&quot;color: #cccccc; text-decoration: none;&quot; target=&quot;_blank&quot; title=&quot;John Graham-Cumming&quot;&gt;John Graham-Cumming&lt;/a&gt; · &lt;a href=&quot;https://soundcloud.com/john-graham-cumming/mail-classified-by-popfile&quot; style=&quot;color: #cccccc; text-decoration: none;&quot; target=&quot;_blank&quot; title=&quot;Mail classified by POPFile&quot;&gt;Mail classified by POPFile&lt;/a&gt;&lt;/div&gt;
  
  &lt;iframe allow=&quot;autoplay&quot; frameborder=&quot;no&quot; height=&quot;166&quot; scrolling=&quot;no&quot; src=&quot;https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/1953162831&amp;amp;color=%23ff5500&amp;amp;auto_play=false&amp;amp;hide_related=false&amp;amp;show_comments=true&amp;amp;show_user=true&amp;amp;show_reposts=false&amp;amp;show_teaser=true&quot; width=&quot;100%&quot;&gt;&lt;/iframe&gt;&lt;div style=&quot;color: #cccccc; font-family: Interstate, &amp;quot;Lucida Grande&amp;quot;, &amp;quot;Lucida Sans Unicode&amp;quot;, &amp;quot;Lucida Sans&amp;quot;, Garuda, Verdana, Tahoma, sans-serif; font-size: 10px; font-weight: 100; line-break: anywhere; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; word-break: normal;&quot;&gt;&lt;a href=&quot;https://soundcloud.com/john-graham-cumming&quot; style=&quot;color: #cccccc; text-decoration: none;&quot; target=&quot;_blank&quot; title=&quot;John Graham-Cumming&quot;&gt;John Graham-Cumming&lt;/a&gt; · &lt;a href=&quot;https://soundcloud.com/john-graham-cumming/use-the-source-luke&quot; style=&quot;color: #cccccc; text-decoration: none;&quot; target=&quot;_blank&quot; title=&quot;Use the source, Luke!&quot;&gt;Use the source, Luke!&lt;/a&gt;&lt;/div&gt;
  
  &lt;iframe allow=&quot;autoplay&quot; frameborder=&quot;no&quot; height=&quot;166&quot; scrolling=&quot;no&quot; src=&quot;https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/1953163075&amp;amp;color=%23ff5500&amp;amp;auto_play=false&amp;amp;hide_related=false&amp;amp;show_comments=true&amp;amp;show_user=true&amp;amp;show_reposts=false&amp;amp;show_teaser=true&quot; width=&quot;100%&quot;&gt;&lt;/iframe&gt;&lt;div style=&quot;color: #cccccc; font-family: Interstate, &amp;quot;Lucida Grande&amp;quot;, &amp;quot;Lucida Sans Unicode&amp;quot;, &amp;quot;Lucida Sans&amp;quot;, Garuda, Verdana, Tahoma, sans-serif; font-size: 10px; font-weight: 100; line-break: anywhere; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; word-break: normal;&quot;&gt;&lt;a href=&quot;https://soundcloud.com/john-graham-cumming&quot; style=&quot;color: #cccccc; text-decoration: none;&quot; target=&quot;_blank&quot; title=&quot;John Graham-Cumming&quot;&gt;John Graham-Cumming&lt;/a&gt; · &lt;a href=&quot;https://soundcloud.com/john-graham-cumming/youve-got-mail-john&quot; style=&quot;color: #cccccc; text-decoration: none;&quot; target=&quot;_blank&quot; title=&quot;You&#39;ve got mail, John!&quot;&gt;You&#39;ve got mail, John!&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</content>
        <link rel="replies" type="application/atom+xml" href="http://blog.jgc.org/feeds/3123313590817156000/comments/default" title="Post Comments"/>
        <link rel="replies" type="text/html" href="http://www.blogger.com/comment/fullpage/post/19303585/3123313590817156000" title="0 Comments"/>
        <link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19303585/posts/default/3123313590817156000"/>
        <link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19303585/posts/default/3123313590817156000"/>
        <link rel="alternate" type="text/html" href="http://blog.jgc.org/2024/11/personalized-voice-recordings-by-elwood.html" title="Personalized voice recordings by Elwood &quot;You&#39;ve got mail!&quot; Edwards"/>
        <author>
            <name>Unknown</name>
            <email>[email protected]</email>
            <gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="https://img1.blogblog.com/img/b16-rounded.gif"/>
        </author>
        <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/yKgiqsdyiAA/default.jpg" height="72" width="72"/>
        <thr:total>0</thr:total>
    </entry>
    <entry>
        <id>tag:blogger.com,1999:blog-19303585.post-1064951669793470512</id>
        <published>2024-10-08T17:13:00.001+00:00</published>
        <updated>2024-10-08T17:13:00.110+00:00</updated>
        <category scheme="http://www.blogger.com/atom/ns#" term="pseudo-randomness"/>
        <title type="text">Rabbit hole: stumbling across two Portuguese punched cards</title>
        <content type="html">&lt;p&gt;Look, here&#39;s the thing, I don&#39;t like mysteries that involve technology. I think I hate them because I know that some other human created the thing I&#39;m staring at and, dammit, I should be able to understand it.&amp;nbsp;&lt;/p&gt;&lt;p&gt;And, then one day I was browsing in one of those places where people leave books for others to take. I flipped through an old Portuguese book about computers published in the 1970s and two punched cards fell out.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzBivbRxiU1_S2lVCnPEW6QHF5ZZwXoDF7ODp9vST3nLSOd5cLjto0enI9RiFWSi2WE3iey6pNOhn03neYX5j7JsNjCuvTpyak6WxwJXbEAfa2OILkjlQh7aNSJQGjV_iVKzQbuMvmCHBmWFEc0Gqawtgm5suMfq5CESmvSiDFxwjGgX2_7NST9A/s3078/punch-1.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;2840&quot; data-original-width=&quot;3078&quot; height=&quot;590&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzBivbRxiU1_S2lVCnPEW6QHF5ZZwXoDF7ODp9vST3nLSOd5cLjto0enI9RiFWSi2WE3iey6pNOhn03neYX5j7JsNjCuvTpyak6WxwJXbEAfa2OILkjlQh7aNSJQGjV_iVKzQbuMvmCHBmWFEc0Gqawtgm5suMfq5CESmvSiDFxwjGgX2_7NST9A/w640-h590/punch-1.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;Nerd. Sniped. By. Gravity.&lt;/p&gt;&lt;p&gt;One punched card contains the data &lt;span style=&quot;font-family: courier;&quot;&gt;M000015 JOAO A. FERNANDES 150000190&lt;/span&gt; and the other &lt;span style=&quot;font-family: courier;&quot;&gt;1000015 100170476&lt;/span&gt;. OK, so &lt;span style=&quot;font-family: courier;&quot;&gt;000015&lt;/span&gt; is probably some sort of identifier (employee ID?) but the other numbers are a mystery. Could they be Portuguese &lt;a href=&quot;https://pt.wikipedia.org/wiki/N%C3%BAmero_de_identifica%C3%A7%C3%A3o_fiscal&quot;&gt;tax identification numbers&lt;/a&gt; (NIFs)? Those start with 1, 2 or 3 (for individuals) and are nine digits.&lt;/p&gt;&lt;p&gt;Nope. I wrote some &lt;a href=&quot;https://gist.github.com/jgrahamc/ae5b030be5cdffb424d1ae126023190f&quot;&gt;code to verify the NIF&#39;s&lt;/a&gt; check digit and both aren&#39;t NIFs.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;use strict;&lt;br /&gt;use warnings;&lt;br /&gt;sub nif_check {&lt;br /&gt;&amp;nbsp; &amp;nbsp; my ($nif) = @_;&lt;br /&gt;&amp;nbsp; &amp;nbsp; my $check = 0;&lt;br /&gt;&amp;nbsp; &amp;nbsp; foreach my $i (reverse 0..7) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $check += substr($nif, $i, 1) * (9-$i);&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; $check %= 11;&lt;br /&gt;&amp;nbsp; &amp;nbsp; if ($check &amp;lt; 2) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $check = 0;&lt;br /&gt;&amp;nbsp; &amp;nbsp; } else {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $check = 11 - $check;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; print &quot;$nif $check\n&quot;;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;nif_check($ARGV[0]);&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;$ perl nif.pl 100170476&lt;br /&gt;100170476 1&lt;br /&gt;$ perl nif.pl 150000190&lt;br /&gt;150000190 7&lt;/span&gt;&lt;/p&gt;&lt;p&gt;So what&#39;s encoded on these cards? And does &lt;span style=&quot;font-family: courier;&quot;&gt;000015&lt;/span&gt; mean they are related?&lt;/p&gt;&lt;p&gt;I found the answer starting with the fact that these punched cards are custom printed with the letters&amp;nbsp;&lt;b&gt;In Es Me&lt;/b&gt; on them. What&#39;s In Es Me? It took a while to answer that, but it turns out that In Es Me was a business called &quot;Instituto de Estudos Mecanográficos&quot; based in Lisbon in the late 1960s and early 1970s.&amp;nbsp;&lt;/p&gt;&lt;p&gt;It appears to have been a school that taught people the exciting new world of computing, which, they claim in their advertisements was &quot;Uma profissão actual e rentavel&quot; (A modern and profitable profession) and also &quot;Uma das profissões de melhor futuro&quot; (One of the professions with a great future).&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8m_FT4M0kIoM5N7QKWv35i1FFYfvugT3Fn9MxknuRbKMdsWnwSneClbVdDCxhbIsTPYicsZmaD-pCLKvjZnxkPNcismZaqlIK7jAGKUsuzg_v2lu1DoclTwScNf0UicI-8EkGgFlr1w-EGVqDr0VZiM0MDEvEyryRHAlUR9LYWqBjqHQZz9E5Dg/s1230/punch-4.jpeg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;666&quot; data-original-width=&quot;1230&quot; height=&quot;216&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8m_FT4M0kIoM5N7QKWv35i1FFYfvugT3Fn9MxknuRbKMdsWnwSneClbVdDCxhbIsTPYicsZmaD-pCLKvjZnxkPNcismZaqlIK7jAGKUsuzg_v2lu1DoclTwScNf0UicI-8EkGgFlr1w-EGVqDr0VZiM0MDEvEyryRHAlUR9LYWqBjqHQZz9E5Dg/w400-h216/punch-4.jpeg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-RLe3aytS2tESLnotW85eYivXA-ox4Ol7kwkzv2XLAJ-XILpuyW_TYMUMvjs7pXmDyeow2DGeVlg-sa_baJiUSDuT1CNcpT8LN6e3SCrk2w3V_nJfABqLpAfe0XKOXK-GzX_veURmCXVEMHmvcpHYanXOamhNfddnJiQ_WskW04gdpsdTNjb27g/s630/punch-3.jpeg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;306&quot; data-original-width=&quot;630&quot; height=&quot;194&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-RLe3aytS2tESLnotW85eYivXA-ox4Ol7kwkzv2XLAJ-XILpuyW_TYMUMvjs7pXmDyeow2DGeVlg-sa_baJiUSDuT1CNcpT8LN6e3SCrk2w3V_nJfABqLpAfe0XKOXK-GzX_veURmCXVEMHmvcpHYanXOamhNfddnJiQ_WskW04gdpsdTNjb27g/w400-h194/punch-3.jpeg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjl2CF-LCR2xi5kQWLmm3C_ON-ojZVXu7ZvKPrIqkHYWwR416VTa54HEcwLDopBCQuEumuThhbw3rtv3GOrxcmYf7kfqyRAuOOvtrwnw2RbPqS5l0l5Q8PQZr71QFGvDWhb1F8VjIJTAHbf-BExcjTIUq5IlfSftu_KyrmuXHBHVGZmtgIDSDDbnQ/s852/punch-2.jpeg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;852&quot; data-original-width=&quot;766&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjl2CF-LCR2xi5kQWLmm3C_ON-ojZVXu7ZvKPrIqkHYWwR416VTa54HEcwLDopBCQuEumuThhbw3rtv3GOrxcmYf7kfqyRAuOOvtrwnw2RbPqS5l0l5Q8PQZr71QFGvDWhb1F8VjIJTAHbf-BExcjTIUq5IlfSftu_KyrmuXHBHVGZmtgIDSDDbnQ/w360-h400/punch-2.jpeg&quot; width=&quot;360&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;Great, but apparently no closer to knowing about João&amp;nbsp;A. Fernandes and those numbers. But then I discovered someone selling a book called &quot;Introdução aos Ordenadores&quot; (Introduction to Computers) which was apparently distributed by In Es Me exclusively in Portugal:&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXU8N7ORFPdX4xEXGOsz2nYf358cooye4NcrfF6PbzJr_ggkGZ2h7Mtd5E_VIwPKvXuRvuW7SBwEpmma9gqF8z3eU1nPDKTkIG3omQnvA-DugK_x8GcJxHyX650JYeuE3u2Vn8LJD14U8tR0ZABIo6xvwmQDw5kO38xmUTU6mqnSIaqovj2uVMYg/s4032/punch-6.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;4032&quot; data-original-width=&quot;3024&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXU8N7ORFPdX4xEXGOsz2nYf358cooye4NcrfF6PbzJr_ggkGZ2h7Mtd5E_VIwPKvXuRvuW7SBwEpmma9gqF8z3eU1nPDKTkIG3omQnvA-DugK_x8GcJxHyX650JYeuE3u2Vn8LJD14U8tR0ZABIo6xvwmQDw5kO38xmUTU6mqnSIaqovj2uVMYg/w480-h640/punch-6.jpg&quot; width=&quot;480&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeh-we5W8BMwW8pmeOW94gzR9GEIjQEEMBD-zEKMbzkDCNCZvECrELW8IRNk-jJryVToQWwOLdHcc7CKeQ4QlNPVswhgwfOjXcOTuIWOpqwVcKnW9A3PBUFoGssqGxBinzX6d5K_016e2OgKzs-R3vnI845KgkG24Kz9gtwXvLds9g2flhSrOHKg/s5712/punch-5.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;5712&quot; data-original-width=&quot;4284&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeh-we5W8BMwW8pmeOW94gzR9GEIjQEEMBD-zEKMbzkDCNCZvECrELW8IRNk-jJryVToQWwOLdHcc7CKeQ4QlNPVswhgwfOjXcOTuIWOpqwVcKnW9A3PBUFoGssqGxBinzX6d5K_016e2OgKzs-R3vnI845KgkG24Kz9gtwXvLds9g2flhSrOHKg/w480-h640/punch-5.jpg&quot; width=&quot;480&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;div&gt;So, I bought it. And, inside that book on page 1-31, are the very two cards that had fallen from that other book. So, it looks like the cards were examples (perhaps from the training course) drawn from the book.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZrf73Ed4Avxgr_9RV79RNbKvGjSXf-iexlqOcB0bvRQKWyVow3DINJwVX8p3WIplqk73QFV1TMrLOJpqGRpo-YIOFwQUEXgBVcRIUHDNVhcp6xqmOQyWld1pnyxozzflq8_5Xq_kk29yTieFw7_cVBzcFPYPSMfA1xNs5CDvuGXWwSmfQdZlTXQ/s5234/punch-7.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;5234&quot; data-original-width=&quot;3691&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZrf73Ed4Avxgr_9RV79RNbKvGjSXf-iexlqOcB0bvRQKWyVow3DINJwVX8p3WIplqk73QFV1TMrLOJpqGRpo-YIOFwQUEXgBVcRIUHDNVhcp6xqmOQyWld1pnyxozzflq8_5Xq_kk29yTieFw7_cVBzcFPYPSMfA1xNs5CDvuGXWwSmfQdZlTXQ/w452-h640/punch-7.jpg&quot; width=&quot;452&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;The cards in the book are life size:&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpwQYe9LvFc7uzX6lW4OzRkqXkx3FpYpWzA0jG7U_VDRpArC2BqnUPx9sPgMlS7ZI3KHVr8WWAO5k78LRL3IULTmJMj8Cs3JwI3Xoo8AeWm1iu_q10YoEspqsiVyfTEDzPGYBegcsziTWZV1_pcgY0aXws_HGtBXKIA6xiF8w3IC_vKBy-7rt-Iw/s4610/punch-8.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;4610&quot; data-original-width=&quot;3271&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpwQYe9LvFc7uzX6lW4OzRkqXkx3FpYpWzA0jG7U_VDRpArC2BqnUPx9sPgMlS7ZI3KHVr8WWAO5k78LRL3IULTmJMj8Cs3JwI3Xoo8AeWm1iu_q10YoEspqsiVyfTEDzPGYBegcsziTWZV1_pcgY0aXws_HGtBXKIA6xiF8w3IC_vKBy-7rt-Iw/w454-h640/punch-8.jpg&quot; width=&quot;454&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;(Can you spot the printing error in the book?)&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;The good news is that the previous pages describe the numbers on those cards via the columns.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeAG9H-07UPNWYixd240URv8eQejewiZey_vn0iDqgio26o6M6DNssD_X36aX3-sDMH4k4T-92hk4GK6xeQLnGD-6y4W5CKsfEOOEniK9v5SgkEYE-1aA8PKipvjhkWUCf15gIRvMR8yeN_ov6Oac_WDkg9zFo4nv2wSswDhspGL4GZe9gqEgYmA/s5087/punch-9.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;5087&quot; data-original-width=&quot;3481&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeAG9H-07UPNWYixd240URv8eQejewiZey_vn0iDqgio26o6M6DNssD_X36aX3-sDMH4k4T-92hk4GK6xeQLnGD-6y4W5CKsfEOOEniK9v5SgkEYE-1aA8PKipvjhkWUCf15gIRvMR8yeN_ov6Oac_WDkg9zFo4nv2wSswDhspGL4GZe9gqEgYmA/w438-h640/punch-9.jpg&quot; width=&quot;438&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;Card code: column 1 (1)&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;Employee number: columns 2 to 7&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;Payment period: columns 33 to 38&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;Total hours worked: columns: 39 to 41&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXAtxo9_Q37ToY1oobyRHIX2jjCdb998xwA-ps-vH9efs6haiEfeV3H8wwzOfFUNI4zqZQPiNYzm_TGWNbuW-yhbO_q7AXws1XHTWhdKR164stDbyuIo8EXHHc1lHtU5HlCdup4n7sJRpFYPt9dMcme1Ua4-5YY_HY25EXDDgIIENo19pTwiT0eg/s3518/punch-10.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;2792&quot; data-original-width=&quot;3518&quot; height=&quot;318&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXAtxo9_Q37ToY1oobyRHIX2jjCdb998xwA-ps-vH9efs6haiEfeV3H8wwzOfFUNI4zqZQPiNYzm_TGWNbuW-yhbO_q7AXws1XHTWhdKR164stDbyuIo8EXHHc1lHtU5HlCdup4n7sJRpFYPt9dMcme1Ua4-5YY_HY25EXDDgIIENo19pTwiT0eg/w400-h318/punch-10.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;For the other card...&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;Card code: column 1 (M)&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;Employee number: columns 2 to 7&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;Name: columns: 8 to 32&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;Hourly salary: 42 to 46&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;Fixed discounts for the week: columns 47 to 50&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;So, &lt;span style=&quot;font-family: courier;&quot;&gt;000015&lt;/span&gt; is the employee number. &lt;span style=&quot;font-family: courier;&quot;&gt;150000190&lt;/span&gt; indicates that João&amp;nbsp;A. Fernandes is paid 15$000 (15 &lt;a href=&quot;https://en.wikipedia.org/wiki/Portuguese_escudo&quot;&gt;Portuguese escudos&lt;/a&gt;) per hour and there&#39;s a weekly discount (deductions from the salary) of 0$190. Note that for historical reasons sometimes the escudo is written with a three digit decimal, and because earlier on the book we&#39;re introduced to João and his colleagues I know that&#39;s the format being used.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgd3f_5eQUKrs5eUTIcpV9oLLfcQV5HISZ853B-d9ZPHcfVmcKSDqG2m1VQpOTK2_iCT20XvRZdy96t6rWIuiHI1Ab14g_TdYGnQExe5s4y3cE1sih9ALpZJk58Db9txKhDGETzYclCG-qtjtEymKJwtL5d0UN_xeZ-ESP1XdVqthvDgeCM6WPkVw/s5054/punch15.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;5054&quot; data-original-width=&quot;3122&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgd3f_5eQUKrs5eUTIcpV9oLLfcQV5HISZ853B-d9ZPHcfVmcKSDqG2m1VQpOTK2_iCT20XvRZdy96t6rWIuiHI1Ab14g_TdYGnQExe5s4y3cE1sih9ALpZJk58Db9txKhDGETzYclCG-qtjtEymKJwtL5d0UN_xeZ-ESP1XdVqthvDgeCM6WPkVw/w396-h640/punch15.jpg&quot; width=&quot;396&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;The other card is a record of his hours worked for a specific week: &lt;span style=&quot;font-family: courier;&quot;&gt;100170476&lt;/span&gt;. 10-01-70 is January 10, 1970 and indicates the week for which the record is generated. 476 is 47.6 hours of work.&lt;/div&gt;&lt;br /&gt;Mystery solved.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Well, almost, In Es Me didn&#39;t write this book. If you look at the title page it was apparently created by &quot;ENIASA&quot; and I&#39;ve found very little information about who they were. Oh well.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;PS Here&#39;s a little taste of what the book contains:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkoFgmwAZ0StQ5B8q5o4oVbwDKO62Mo_BfRVmk98XxYqqRiR8CEd3bcdczHO6XDKYavK_dVkPwmpnJ0xqY8l-N7mFglDe8ef4FpHTNN7k1AEbLWS1hAdcS_1PyG870QHZ4Sh4e-hAHyBwj0SfyX8R1sEWSKXY_NenosKG0OhYjK0rxsFV05HQH7A/s5712/punch-14.jpeg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;4060&quot; data-original-width=&quot;5712&quot; height=&quot;454&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkoFgmwAZ0StQ5B8q5o4oVbwDKO62Mo_BfRVmk98XxYqqRiR8CEd3bcdczHO6XDKYavK_dVkPwmpnJ0xqY8l-N7mFglDe8ef4FpHTNN7k1AEbLWS1hAdcS_1PyG870QHZ4Sh4e-hAHyBwj0SfyX8R1sEWSKXY_NenosKG0OhYjK0rxsFV05HQH7A/w640-h454/punch-14.jpeg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXjXXPuZ8x2RetLBJskjkTdl0kn8smvcv5q30loiD3FzodXI9LgyyW8XWpMzg5bEITMvA0BnvJhyphenhyphenpUHQ3_Dm-eqaLyQJRuYBAXlXz-1FR0W78-cCuFePlr_bCIgjjamIKiSOyOoBAnS_9ONEV1sw_uiEgeNChzpe61BLKqvZzW6E8nD4zOE-wudg/s5712/punch-13.jpeg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;4183&quot; data-original-width=&quot;5712&quot; height=&quot;468&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXjXXPuZ8x2RetLBJskjkTdl0kn8smvcv5q30loiD3FzodXI9LgyyW8XWpMzg5bEITMvA0BnvJhyphenhyphenpUHQ3_Dm-eqaLyQJRuYBAXlXz-1FR0W78-cCuFePlr_bCIgjjamIKiSOyOoBAnS_9ONEV1sw_uiEgeNChzpe61BLKqvZzW6E8nD4zOE-wudg/w640-h468/punch-13.jpeg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhac3KjmhSkfSNrG1zG26FdtdPC26UcGnF87JY5UTbSSwtxGUhHcVpQqvNWpKFMnTlDdVDlnjBdEsfeMCiQHN55tM8V0z9X6p8LrXXOmaKTDu05PHfbIL-ICVEIUji3L6YSOQkYRjburNah_ccyj-dSnCKS0_PxGWw_6B_fIOb7G1l0R8m5fCn7IA/s5712/punch-12.jpeg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;4284&quot; data-original-width=&quot;5712&quot; height=&quot;480&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhac3KjmhSkfSNrG1zG26FdtdPC26UcGnF87JY5UTbSSwtxGUhHcVpQqvNWpKFMnTlDdVDlnjBdEsfeMCiQHN55tM8V0z9X6p8LrXXOmaKTDu05PHfbIL-ICVEIUji3L6YSOQkYRjburNah_ccyj-dSnCKS0_PxGWw_6B_fIOb7G1l0R8m5fCn7IA/w640-h480/punch-12.jpeg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEik6-BEDP69FxkQKRGFglUbF9hlkKOkZhWY-y0J89-hzohN7iJ5tOWJgPJ7sCp6KmMg4vtTOwUwXemxPM07Tiea4PizR8vIeDdYf2D_35dFmN-RauE2LP8NcNyn-kFeedi9B1H27gVeHt5zL0TTLQJvF1Q6_knCcUjyWGJtnssAztUGS09GnEeDZQ/s5712/punch-11.jpeg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;4284&quot; data-original-width=&quot;5712&quot; height=&quot;480&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEik6-BEDP69FxkQKRGFglUbF9hlkKOkZhWY-y0J89-hzohN7iJ5tOWJgPJ7sCp6KmMg4vtTOwUwXemxPM07Tiea4PizR8vIeDdYf2D_35dFmN-RauE2LP8NcNyn-kFeedi9B1H27gVeHt5zL0TTLQJvF1Q6_knCcUjyWGJtnssAztUGS09GnEeDZQ/w640-h480/punch-11.jpeg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;</content>
        <link rel="replies" type="application/atom+xml" href="http://blog.jgc.org/feeds/1064951669793470512/comments/default" title="Post Comments"/>
        <link rel="replies" type="text/html" href="http://www.blogger.com/comment/fullpage/post/19303585/1064951669793470512" title="1 Comments"/>
        <link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19303585/posts/default/1064951669793470512"/>
        <link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19303585/posts/default/1064951669793470512"/>
        <link rel="alternate" type="text/html" href="http://blog.jgc.org/2024/10/rabbit-hole-stumbling-across-two.html" title="Rabbit hole: stumbling across two Portuguese punched cards"/>
        <author>
            <name>Unknown</name>
            <email>[email protected]</email>
            <gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="https://img1.blogblog.com/img/b16-rounded.gif"/>
        </author>
        <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzBivbRxiU1_S2lVCnPEW6QHF5ZZwXoDF7ODp9vST3nLSOd5cLjto0enI9RiFWSi2WE3iey6pNOhn03neYX5j7JsNjCuvTpyak6WxwJXbEAfa2OILkjlQh7aNSJQGjV_iVKzQbuMvmCHBmWFEc0Gqawtgm5suMfq5CESmvSiDFxwjGgX2_7NST9A/s72-w640-h590-c/punch-1.jpg" height="72" width="72"/>
        <thr:total>1</thr:total>
    </entry>
    <entry>
        <id>tag:blogger.com,1999:blog-19303585.post-522901623747231800</id>
        <published>2024-09-27T20:25:00.004+00:00</published>
        <updated>2024-12-28T15:56:23.852+00:00</updated>
        <category scheme="http://www.blogger.com/atom/ns#" term="pseudo-randomness"/>
        <title type="text">I made a rubbish clock</title>
        <content type="html">&lt;p&gt;With separate plastic, metal, paper, and glass recycling, composting, and pick up of all the rest, knowing which days to put out which bins can be complicated. Some have turned to high-tech solutions like Darren Tarbard&#39;s wonderful &quot;&lt;a href=&quot;https://x.com/tarbard/status/1002464120447397888&quot;&gt;bindicator&lt;/a&gt;&quot;.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://x.com/tarbard/status/1002464120447397888&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;835&quot; data-original-width=&quot;900&quot; height=&quot;371&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisozadvkoI9CxySkzJNcnOY_o2vZNWnv2gonXZ-K3eYn24dsIy5j7DoEHNxNShAVd-OBqk1PUMGRqJvSdmOs10lTHYGTlCgYz7uqOjXD_vf57eKTbMPeedRuCETBjUWnp-Sh9mIDxK0vMqp_va2txelYdG8f_9Yem8IweeCIQlhclFQi7HwOIlNA/w400-h371/Del3rp-WsAES2IE.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;There&#39;s even a&amp;nbsp;&lt;a href=&quot;https://www.bindicator.net/&quot;&gt;commercial version&lt;/a&gt;&amp;nbsp;of that.&lt;/p&gt;&lt;p&gt;I thought about making something similar, but decided that a high-tech solution isn&#39;t always the right one. Instead I made a clock, or rather a clock face. My rationale was as follows: the bin days don&#39;t change frequently so no need to call an API to get them, and anyway most councils don&#39;t have an API for this sort of thing. Also, I really didn&#39;t want yet another thing with a wall wart, or WiFi to configure, or code to debug (there comes a time in every programmer&#39;s life when they can&#39;t face debugging yet another thing that should be simple and just work).&amp;nbsp;&lt;/p&gt;&lt;p&gt;Not everything needs to be Turing Complete! But you can buy cheap clock mechanisms where the hand go full circle in seven days instead of 12 hours. Something like &lt;a href=&quot;https://www.youngtownco.com/en/product-496882/7-Days-Week-Clock-Movement-12888SDWK.html&quot;&gt;this&lt;/a&gt;.&amp;nbsp;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsdpeNHoK98X_LNj45s4b71ULFC-yEBbTAAC5Dt3Mp6jfwfE6FnMHw80boTFqBF1pbTeDye9C8S6fY-UAQfjlk0uxJj_o7-9RsoB5psG_mMfG5EhI7H5QpwQ4w_cPgtL95VIpBKSzb75r3aXV7BBPcPAbuqUzUwif5uxm-LFQZJofvnmctDB9uVQ/s508/lixo-2.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;500&quot; data-original-width=&quot;508&quot; height=&quot;315&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsdpeNHoK98X_LNj45s4b71ULFC-yEBbTAAC5Dt3Mp6jfwfE6FnMHw80boTFqBF1pbTeDye9C8S6fY-UAQfjlk0uxJj_o7-9RsoB5psG_mMfG5EhI7H5QpwQ4w_cPgtL95VIpBKSzb75r3aXV7BBPcPAbuqUzUwif5uxm-LFQZJofvnmctDB9uVQ/s320/lixo-2.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;So, I wrote a bunch of code to produce an SVG (and PDF and PNG) for the clock face. The code is &lt;a href=&quot;https://github.com/jgrahamc/lixo&quot;&gt;here&lt;/a&gt;. You end up with something like this which can be printed.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi50DJtFU-77BZVN0Zidd-1XHQNnQqwL2EDdX6sPvxlJgWOj2OvrzHjcoNZk7-GoxbPrFlcoTH6ijQ7Jrtp5vk3v7Vedt9JAH-3Rd7yzPGY427oDsqkrinfduN0NJb02z2dDsM91tR-xxAianznNcIVOr50eIedZmBL_XVlhVpwApRi2PEPPU7i4g/s2362/lixo.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;2362&quot; data-original-width=&quot;2362&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi50DJtFU-77BZVN0Zidd-1XHQNnQqwL2EDdX6sPvxlJgWOj2OvrzHjcoNZk7-GoxbPrFlcoTH6ijQ7Jrtp5vk3v7Vedt9JAH-3Rd7yzPGY427oDsqkrinfduN0NJb02z2dDsM91tR-xxAianznNcIVOr50eIedZmBL_XVlhVpwApRi2PEPPU7i4g/w400-h400/lixo.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;The colours and wording are all determined by the &lt;span style=&quot;font-family: courier;&quot;&gt;schd&lt;/span&gt; and &lt;span style=&quot;font-family: courier;&quot;&gt;bins&lt;/span&gt; variables. The code should be easy to customize for your location&#39;s schedule. It supports up to two different bin types per day. If you need more you&#39;ll have to modify the code.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;bins = {&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&quot;none&quot;: [&quot;white&quot;, &quot;&quot;],&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&quot;lixo&quot;: [&quot;#72859E&quot;, &quot;Lixo&quot;],&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&quot;papl&quot;: [&quot;#255FC9&quot;, &quot;Papel&quot;],&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&quot;embl&quot;: [&quot;#DED044&quot;, &quot;Embalagens&quot;],&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;days = [&quot;Sun&quot;, &quot;Mon&quot;, &quot;Tues&quot;, &quot;Wednes&quot;, &quot;Thurs&quot;, &quot;Fri&quot;, &quot;Satur&quot;]&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;schd = [[&quot;none&quot;],&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&amp;nbsp; &amp;nbsp; [&quot;lixo&quot;],&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;[&quot;papl&quot;, &quot;embl&quot;],&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&amp;nbsp; [&quot;lixo&quot;],&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt; [&quot;papl&quot;],&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;[&quot;lixo&quot;, &quot;embl&quot;],&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;[&quot;papl&quot;]]&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;There&#39;s no need for you to use Portuguese; I have because I&#39;m dealing with Portuguese rubbish collection.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;The only interesting piece of code is the generation of the curves for the seven daily segments (and also for the curved wording). This is done by the function &lt;span style=&quot;font-family: courier;&quot;&gt;path&lt;/span&gt;:&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;def getXY(p, r, s):&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;a = 2.0 * math.pi * (p * pps + rot)&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;return s % (r * math.cos(a),&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; r * math.sin(a))&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;def path(p, r):&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;s = &quot; %.2f %.2f &quot;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;pa = &quot;M&quot;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;pa += getXY(p, r, s)&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;pa += &quot;A %.2f %.2f 0 0 1&quot; % (r, r)&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;pa += getXY((p+1), r, s)&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;return pa&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;In SVG you can define a &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Paths&quot;&gt;path&lt;/a&gt; element which can be used to make all sorts of curves, arcs, and lines. My &lt;span style=&quot;font-family: courier;&quot;&gt;path&lt;/span&gt; function takes two parameters: &lt;span style=&quot;font-family: courier;&quot;&gt;p&lt;/span&gt; is a number between zero and six representing the seven daily segments needed on the clock; &lt;span style=&quot;font-family: courier;&quot;&gt;r&lt;/span&gt; is the radius of the arc. The function uses &lt;span style=&quot;font-family: courier;&quot;&gt;getXY&lt;/span&gt; to find the position of a point on the arc. It does this twice to find the start and end point.&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;So, path ends up returning something like &lt;span style=&quot;font-family: courier;&quot;&gt;M x0 y0 A r r 0 0 1 x1 y1&lt;/span&gt; where &lt;span style=&quot;font-family: courier;&quot;&gt;x0&lt;/span&gt;, &lt;span style=&quot;font-family: courier;&quot;&gt;y0&lt;/span&gt;, &lt;span style=&quot;font-family: courier;&quot;&gt;x1&lt;/span&gt;, &lt;span style=&quot;font-family: courier;&quot;&gt;y1&lt;/span&gt; are the calculated end points of the arc and &lt;span style=&quot;font-family: courier;&quot;&gt;r&lt;/span&gt; is the radius of the arc. The &lt;span style=&quot;font-family: courier;&quot;&gt;M x0 y0&lt;/span&gt; means &quot;move to (&lt;span style=&quot;font-family: courier;&quot;&gt;x0&lt;/span&gt;, &lt;span style=&quot;font-family: courier;&quot;&gt;y0&lt;/span&gt;)&quot; The&amp;nbsp;&lt;span style=&quot;font-family: courier;&quot;&gt;A r r 0 0 1 x1 y1&lt;/span&gt;&amp;nbsp;means &quot;draw an &lt;a href=&quot;https://www.w3.org/TR/SVG/paths.html#PathDataEllipticalArcCommands&quot;&gt;arc&lt;/a&gt; of radius r to the point (&lt;span style=&quot;font-family: courier;&quot;&gt;x1&lt;/span&gt;, &lt;span style=&quot;font-family: courier;&quot;&gt;y1&lt;/span&gt;)&quot;. The &lt;span style=&quot;font-family: courier;&quot;&gt;0 0 1&lt;/span&gt; in the middle correspond to three parameters:&amp;nbsp;x-axis-rotation, large-arc-flag, and sweep-flag; it&#39;s best to refer to the documentation for those because they determine the direction in which the arc points and whether it is rotated.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;The final part of the path SVG element, &lt;span style=&quot;font-family: courier;&quot;&gt;L 0 0&lt;/span&gt;, is added elsewhere in the code. It sets the centre of the arc at (&lt;span style=&quot;font-family: courier;&quot;&gt;0&lt;/span&gt;, &lt;span style=&quot;font-family: courier;&quot;&gt;0&lt;/span&gt;). I used the &lt;span style=&quot;font-family: courier;&quot;&gt;viewBox&lt;/span&gt; attribute of the SVG to make the SVG geometry be between (&lt;span style=&quot;font-family: courier;&quot;&gt;-1&lt;/span&gt;, &lt;span style=&quot;font-family: courier;&quot;&gt;-1&lt;/span&gt;) and (&lt;span style=&quot;font-family: courier;&quot;&gt;1&lt;/span&gt;, &lt;span style=&quot;font-family: courier;&quot;&gt;1&lt;/span&gt;) thus making the centre of the image (&lt;span style=&quot;font-family: courier;&quot;&gt;0&lt;/span&gt;, &lt;span style=&quot;font-family: courier;&quot;&gt;0&lt;/span&gt;).&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;print(&#39;&amp;lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; viewBox=&quot;-1 -1 2 2&quot; width=&quot;%s&quot; height=&quot;%s&quot;&amp;gt;&#39; % (wh, wh))&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;Armed with a suitable printed clock face, I got a simple square picture frame, a few bits of wood for spacers, and put it all together into a &quot;rubbish clock&quot;.&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://flyingtiger.com/pt-pt/products/black-picture-frame-20x20-cm-3034806&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1200&quot; data-original-width=&quot;1200&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjLt5yQO3Yskdk8xTXFjHTL_PwvbRm5PmqrTMMXHrTnaEuCPRsnqrvgGzb_qs6pPHiK_pfsHZSgzQoYuPfbu1mUZoLuhyphenhyphenDGyedf_kURe3UIPm1TRJPhewAKwHSRTWWw9pLQwtn0XJspWp_m-ogVQv0oPDMvs9le2MBGPkKglSaXkSzlpuYV7oXcA/w640-h640/lixo-4.webp&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;a href=&quot;https://flyingtiger.com/pt-pt/products/black-picture-frame-20x20-cm-3034806&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1200&quot; data-original-width=&quot;1200&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixHHRXpURAEsmK_bYXaQyR8iLSGK14efmCSbFsmie4tRUsvd9kZzzk9ZiOy79k9TDl5t4PRcRhyqwFXU0qlhdmnMfiWLguPb8mszXhjrcpMxhtBvp0ecFu7GPL7UiPDq8Xzl8usb0LuKuJIQzZd7a08DYdPJvNIdK2fub3Fixs09_G0CqPAMG8JA/w640-h640/lixo-3.webp&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpj8fOLwk9PArF_K9sUwkYhSCZVRmwC7xmI-wvs32RetBhwFdTOzRdFOzDg6gXEn-taEu3SQW5hJz78Zrkryl5x5ReEr9iexphsiMabORQfh4BqLzNWzkgVhbcF5zNMWeTbWikEwyPkhbaZwFtQBy6_TMFOz-ZH48-owPvbaUZaeyGWnrWACnR1g/s1200/lixo-5.jpg&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1200&quot; data-original-width=&quot;1200&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpj8fOLwk9PArF_K9sUwkYhSCZVRmwC7xmI-wvs32RetBhwFdTOzRdFOzDg6gXEn-taEu3SQW5hJz78Zrkryl5x5ReEr9iexphsiMabORQfh4BqLzNWzkgVhbcF5zNMWeTbWikEwyPkhbaZwFtQBy6_TMFOz-ZH48-owPvbaUZaeyGWnrWACnR1g/w640-h640/lixo-5.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvTpcZoantZ16120z-lQK12YKhHkbb_lXVQEdznDiWKicX4J4EoD4yaibwH_iROLsHVCkeh4qti2xmslW-u5Qy96-5OkdfmK_l4-bpLHcezEPtQyNkR-9NuW9ZNDwVHRSO91S1kQZTHPtXZdQdcaFCxWSQFLwLz8y-NFx5oT2AMLi3SqVEzQ0_KQ/s1200/lixo-7.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;953&quot; data-original-width=&quot;1200&quot; height=&quot;509&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvTpcZoantZ16120z-lQK12YKhHkbb_lXVQEdznDiWKicX4J4EoD4yaibwH_iROLsHVCkeh4qti2xmslW-u5Qy96-5OkdfmK_l4-bpLHcezEPtQyNkR-9NuW9ZNDwVHRSO91S1kQZTHPtXZdQdcaFCxWSQFLwLz8y-NFx5oT2AMLi3SqVEzQ0_KQ/w640-h509/lixo-7.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;</content>
        <link rel="replies" type="application/atom+xml" href="http://blog.jgc.org/feeds/522901623747231800/comments/default" title="Post Comments"/>
        <link rel="replies" type="text/html" href="http://www.blogger.com/comment/fullpage/post/19303585/522901623747231800" title="0 Comments"/>
        <link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19303585/posts/default/522901623747231800"/>
        <link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19303585/posts/default/522901623747231800"/>
        <link rel="alternate" type="text/html" href="http://blog.jgc.org/2024/09/i-made-rubbish-clock.html" title="I made a rubbish clock"/>
        <author>
            <name>Unknown</name>
            <email>[email protected]</email>
            <gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="https://img1.blogblog.com/img/b16-rounded.gif"/>
        </author>
        <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisozadvkoI9CxySkzJNcnOY_o2vZNWnv2gonXZ-K3eYn24dsIy5j7DoEHNxNShAVd-OBqk1PUMGRqJvSdmOs10lTHYGTlCgYz7uqOjXD_vf57eKTbMPeedRuCETBjUWnp-Sh9mIDxK0vMqp_va2txelYdG8f_9Yem8IweeCIQlhclFQi7HwOIlNA/s72-w400-h371-c/Del3rp-WsAES2IE.jpg" height="72" width="72"/>
        <thr:total>0</thr:total>
    </entry>
    <entry>
        <id>tag:blogger.com,1999:blog-19303585.post-105942708803926021</id>
        <published>2024-09-07T16:40:00.001+00:00</published>
        <updated>2024-09-12T08:57:35.147+00:00</updated>
        <category scheme="http://www.blogger.com/atom/ns#" term="codes and ciphers"/>
        <category scheme="http://www.blogger.com/atom/ns#" term="hits"/>
        <category scheme="http://www.blogger.com/atom/ns#" term="retro"/>
        <category scheme="http://www.blogger.com/atom/ns#" term="security"/>
        <title type="text">Cracking an old ZIP file to help open source the ANC&#39;s &quot;Operation Vula&quot; secret crypto code</title>
        <content type="html">&lt;p&gt;It&#39;s not often that you find yourself staring at code that few people have ever seen, code that was an important part in bringing down the apartheid system in South Africa, and code that was used for secure communication using one-time pads smuggled into South Africa by a flight attendant on floppy disks. But I found myself doing that one morning recently after having helped decrypt a 30 year old PKZIP file whose password had long been forgotten.&lt;/p&gt;&lt;p&gt;Some time ago I became interested in the secure communications used by the &lt;a href=&quot;https://en.wikipedia.org/wiki/African_National_Congress&quot;&gt;ANC&lt;/a&gt; as part of &lt;a href=&quot;https://en.wikipedia.org/wiki/Operation_Vula&quot;&gt;Operation Vula&lt;/a&gt; in the late 1980s. Operation Vula was the infiltration of ANC leaders (and materiel) into South Africa to set up an underground network bringing together the various elements of ANC activism operating inside the country.&amp;nbsp;&lt;/p&gt;&lt;p&gt;The operation needed secure communications to be successful and these were established using 8-bit computers, DTMF tones, acoustic couplers and a variety of other equipment for exchanging one-time pad encrypted messages using programs written in &lt;a href=&quot;https://en.wikipedia.org/wiki/PowerBASIC&quot;&gt;PowerBASIC&lt;/a&gt;.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7c14emcAhruoYELH_YTk0Gl_SMkPPV8rRdmnjs21QQGiGZoAGn0rnBR2SeSXd4bAQqF83Kgu6bRKkeGjhWXPpzlqJfKkrnuMfNlfZ0CCej9dmGMDlQvDP24Ka3iorprn474jZ_ZUCANTiu9EBC0FLUmjpug9avwL4eoCx3qeX9afO2v3SsqaGdg/s460/171421935.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;460&quot; data-original-width=&quot;460&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7c14emcAhruoYELH_YTk0Gl_SMkPPV8rRdmnjs21QQGiGZoAGn0rnBR2SeSXd4bAQqF83Kgu6bRKkeGjhWXPpzlqJfKkrnuMfNlfZ0CCej9dmGMDlQvDP24Ka3iorprn474jZ_ZUCANTiu9EBC0FLUmjpug9avwL4eoCx3qeX9afO2v3SsqaGdg/s16000/171421935.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;I won&#39;t go into the detail of how this worked as &lt;a href=&quot;https://en.wikipedia.org/wiki/Tim_Jenkin&quot;&gt;Tim Jenkin&lt;/a&gt;, the person primarily responsible for the encryption system, has now open sourced the original code, and which &lt;a href=&quot;https://github.com/vulacode&quot;&gt;can be found here&lt;/a&gt;. Tim&#39;s write up on the encryption system &lt;a href=&quot;https://github.com/Vulacode/Articles/blob/main/Talking%20To%20Vula.pdf&quot;&gt;can be found here&lt;/a&gt;. I thoroughly recommend reading it for the details.&lt;/p&gt;&lt;p&gt;The code hadn&#39;t been open sourced before for one simple reason: on leaving the UK for South Africa in 1991 he had zipped up all the source code and set a password on it. In the intervening years he&#39;d simply forgotten the password! So, when I emailed him to ask if it had been open sourced he replied:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;I still have the Vula source code but unfortunately most of it I can&#39;t access because when I left the UK in 1991 to return to South Africa, I zipped up all the files with a password. I was able to decode and extract one of the files but it was a very early version of the software. The rest I couldn&#39;t extract because I forgot the password. When I got back to SA there was no need to access the code. I thought I would never forget the password but when I tried to decode it a few years later, I couldn&#39;t remember it.&lt;/p&gt;&lt;p&gt;If you could find out how to decode zipped files that would release the software, which I would be more than happy to share. I have made a few attempts to crack the code but so far have been unsuccessful.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;I readily agreed and he sent me two files: &lt;span style=&quot;font-family: courier;&quot;&gt;ALLBAS.ZIP&lt;/span&gt; and &lt;span style=&quot;font-family: courier;&quot;&gt;CODMAY93.ZIP&lt;/span&gt;. These were both created with an early version of PKZIP and had passwords set on them. Luckily, there is a &lt;a href=&quot;https://link.springer.com/chapter/10.1007/3-540-60590-8_12&quot;&gt;known plain text attack&lt;/a&gt; against the ZipCrypto scheme used in that era&#39;s ZIP format. And an open source implementation of the attack called &lt;a href=&quot;https://github.com/kimci86/bkcrack&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;bkcrack&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;So, it was a &quot;simple matter&quot; of predicting 12 bytes of plain text at a known location inside the ZIP file. Here&#39;s a sample of what&#39;s inside the ZIP file:&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;$ bkcrack -L ALLBAS.ZIP | head -n 20&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;bkcrack 1.7.0 - 2024-05-26&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;Archive: ALLBAS.ZIP&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;Index Encryption Compression CRC32&amp;nbsp; &amp;nbsp; Uncompressed&amp;nbsp; Packed size Name&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;----- ---------- ----------- -------- ------------ ------------ ----------------&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; 0 ZipCrypto&amp;nbsp; Shrink&amp;nbsp; &amp;nbsp; &amp;nbsp; b0f86b1d&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 163&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 117 A1PSW.BAS&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; 1 ZipCrypto&amp;nbsp; Shrink&amp;nbsp; &amp;nbsp; &amp;nbsp; 8fa662d4&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 163&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 118 A2PSW.BAS&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; 2 ZipCrypto&amp;nbsp; Shrink&amp;nbsp; &amp;nbsp; &amp;nbsp; 0c5a7295&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 163&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 119 A3PSW.BAS&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; 3 ZipCrypto&amp;nbsp; Shrink&amp;nbsp; &amp;nbsp; &amp;nbsp; 49907f86&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 179&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 125 A4PSW.BAS&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; 4 ZipCrypto&amp;nbsp; Shrink&amp;nbsp; &amp;nbsp; &amp;nbsp; 3d20eb7a&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 163&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 120 A5PSW.BAS&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; 5 ZipCrypto&amp;nbsp; Shrink&amp;nbsp; &amp;nbsp; &amp;nbsp; f8b558f0&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 136&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 128 BIOS.INC&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; 6 ZipCrypto&amp;nbsp; Implode&amp;nbsp; &amp;nbsp; &amp;nbsp;799074ed&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 377&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 278 CHKERR.INC&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; 7 ZipCrypto&amp;nbsp; Implode&amp;nbsp; &amp;nbsp; &amp;nbsp;c44ea0a5&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 17906&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;5401 CODSUBS.INC&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; 8 ZipCrypto&amp;nbsp; Implode&amp;nbsp; &amp;nbsp; &amp;nbsp;7bd7e23d&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 27287&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;8297 COMAID.BAS&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; 9 ZipCrypto&amp;nbsp; Implode&amp;nbsp; &amp;nbsp; &amp;nbsp;03dc63da&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;2109&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;1001 COMKEY.BAS&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;10 ZipCrypto&amp;nbsp; Store&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;3500d320&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;2372&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;2384 CONFIG.TIM&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;11 ZipCrypto&amp;nbsp; Shrink&amp;nbsp; &amp;nbsp; &amp;nbsp; 35a85089&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 147&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 111 CONPSW.BAS&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;12 ZipCrypto&amp;nbsp; Implode&amp;nbsp; &amp;nbsp; &amp;nbsp;55be75ce&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;2094&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 825 DOS.INC&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;13 ZipCrypto&amp;nbsp; Shrink&amp;nbsp; &amp;nbsp; &amp;nbsp; 3387d043&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 134&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 127 DOSVER.INC&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;14 ZipCrypto&amp;nbsp; Implode&amp;nbsp; &amp;nbsp; &amp;nbsp;28a32efa&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;1304&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 535 DOSX.INC&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;15 ZipCrypto&amp;nbsp; Implode&amp;nbsp; &amp;nbsp; &amp;nbsp;6578a66c&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;3196&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 966 EDDY.BAS&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Tim had some unencrypted &lt;span style=&quot;font-family: courier;&quot;&gt;.BAS&lt;/span&gt; files lying around but they were different versions than those in the file and trying the &lt;span style=&quot;font-family: courier;&quot;&gt;bkcrack&lt;/span&gt; attack using them (after running them through original PKZIP in &lt;a href=&quot;https://www.dosbox.com/&quot;&gt;DOSBox&lt;/a&gt;) was unsuccessful and I decided to apply some brain power before attempting further attacks.&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;ALLBAS.ZIP&lt;/span&gt; contained a number of files that were uncompressed, because they were already binary and not worth compressing. These files are marked as &lt;span style=&quot;font-family: courier;&quot;&gt;Store&lt;/span&gt;:&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;$ bkcrack -L ALLBAS.ZIP | grep Store&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;10 ZipCrypto&amp;nbsp; Store&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;3500d320&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;2372&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;2384 CONFIG.TIM&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;23 ZipCrypto&amp;nbsp; Store&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;14a285ac&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 2&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;14 KEYCOD.EXE&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;25 ZipCrypto&amp;nbsp; Store&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;d6343ce1&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;4767&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;4779 KEYONE.ZIP&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;26 ZipCrypto&amp;nbsp; Store&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;650778b7&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;6523&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;6535 KEYTHREE.ZIP&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;30 ZipCrypto&amp;nbsp; Store&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;12a711cd&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 58172&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 58184 OLDCOD.ZIP&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;41 ZipCrypto&amp;nbsp; Store&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;00000000&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 0&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;12 TAPCOD.EXE&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;44 ZipCrypto&amp;nbsp; Store&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;55000714&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 12716&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 12728 TECOD5.ZIP&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;45 ZipCrypto&amp;nbsp; Store&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;f4f4366c&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;9230&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;9242 TECOD6.ZIP&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Files that are &lt;span style=&quot;font-family: courier;&quot;&gt;Store&lt;/span&gt;&#39;d are fruitful for plaintext prediction because they have not undergone compression and there&#39;s no need to have the original file to compress in order to obtain plaintext. Focussing on the ZIP files, since the ZIP files start with a PK header, seemed like a good place to find predictable plaintext at a known position. Here are the fields in the standard PK header at the very start of a ZIP file:&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsJqC7hwdZ6KlE6kkcnX0E3OqRNUX0bCZybe-nqTsG0Kut52XY8TrgJri6iyBfrWNNjOjV4Y-eKWxjnGdYm4jkaEZpC04GHIHfY2aH8KZoFUGlfhNXSCuMUrYp9Rig8OaCWVgXTl4VNoDRXJczO_Iv9b-jywsdAywgDRQMZzD24P6p9hbW3DMjxg/s1654/vula-1.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;324&quot; data-original-width=&quot;1654&quot; height=&quot;125&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsJqC7hwdZ6KlE6kkcnX0E3OqRNUX0bCZybe-nqTsG0Kut52XY8TrgJri6iyBfrWNNjOjV4Y-eKWxjnGdYm4jkaEZpC04GHIHfY2aH8KZoFUGlfhNXSCuMUrYp9Rig8OaCWVgXTl4VNoDRXJczO_Iv9b-jywsdAywgDRQMZzD24P6p9hbW3DMjxg/w640-h125/vula-1.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;A viable attack appeared to be to predict the name of the first file in the archive. If the file name was at least 8 characters (which seemed pretty easy since at least four characters were used for &lt;span style=&quot;font-family: courier;&quot;&gt;.BAS&lt;/span&gt;, &lt;span style=&quot;font-family: courier;&quot;&gt;.INC&lt;/span&gt; etc.) then at least 12 characters of plaintext would be available when the file name size (offset 0x1A, 0x1B) and the length of the extra field (which appeared to be 0x00, 0x00 in all the ZIPs Tim sent) was added.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;In the worst case, it would be possible to bruteforce the potential names of files given that they all appear to be uppercase/number combinations with a maximum length of eight characters plus extension. But that turned out not to be necessary.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;Happily, Tim had a different version of &lt;span style=&quot;font-family: courier;&quot;&gt;OLDCOD.ZIP&lt;/span&gt;&amp;nbsp;(one of the ZIP files inside &lt;span style=&quot;font-family: courier;&quot;&gt;ALLBAS.ZIP&lt;/span&gt;) and was able to tell me that the first file in it was &lt;span style=&quot;font-family: courier;&quot;&gt;COMKEY.BAS&lt;/span&gt;. So, I whipped up a quick Perl program to create the necessary plaintext in that hope that the &lt;span style=&quot;font-family: courier;&quot;&gt;OLDCOD.ZIP&lt;/span&gt; inside &lt;span style=&quot;font-family: courier;&quot;&gt;ALLBAS.ZIP&lt;/span&gt; did start with &lt;span style=&quot;font-family: courier;&quot;&gt;COMKEY.BAS&lt;/span&gt;:&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;$ cat maken.pl&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;use strict;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;use warnings;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;my $outfile = &quot;hexname-$$.txt&quot;;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;while (&amp;lt;&amp;gt;) {&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; chomp;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; my $bas = $_;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; print(&quot;$bas / $outfile\n&quot;);&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; my $n = sprintf(&quot;%c\x00\x00\x00$bas&quot;,length($bas));&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; open G, &quot;&amp;gt;$outfile&quot;;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; print G $n;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; close G;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; system(&quot;bkcrack -C ALLBAS.ZIP -c OLDCOD.ZIP -p $outfile -o 26 -j 8&quot;);&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;23 minutes later &lt;span style=&quot;font-family: courier;&quot;&gt;bkcrack&lt;/span&gt; spit out the key to the &lt;span style=&quot;font-family: courier;&quot;&gt;ALLBAS.ZIP&lt;/span&gt; file and was able to decrypt it. The same key worked for &lt;span style=&quot;font-family: courier;&quot;&gt;CODMAY93.ZIP&lt;/span&gt; also.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span id=&quot;docs-internal-guid-eb783345-7fff-83a6-2aef-34bb32a5b59b&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;$ time echo &quot;COMKEY.BAS&quot; | perl maken.pl&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;COMKEY.BAS / hexname-41227.txt&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;bkcrack 1.7.0 - 2024-05-26&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;[07:49:38] Z reduction using 6 bytes of known plaintext&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;100.0 % (6 / 6)&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;[07:49:38] Attack on 925073 Z values at index 33&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;Keys: 98e0f009 48a0b11a c70f8499&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;80.6 % (745571 / 925073)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;Found a solution. Stopping.&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;You may resume the attack with the option: --continue-attack 745571&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;[18:13:49] Keys&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;98e0f009 48a0b11a c70f8499&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;real&lt;/span&gt;&lt;span style=&quot;font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;text-wrap: nowrap;&quot;&gt;	&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;23m4.371s&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;user&lt;/span&gt;&lt;span style=&quot;font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;text-wrap: nowrap;&quot;&gt;	&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;162m3.520s&lt;/span&gt;&lt;/p&gt;&lt;span style=&quot;font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;sys&lt;/span&gt;&lt;span style=&quot;font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;text-wrap: nowrap;&quot;&gt;	&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;0m37.752s&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;bkcrack&lt;/span&gt; does the decryption once the key has been found:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span id=&quot;docs-internal-guid-340b158b-7fff-bf4c-159e-7b8c85b8a90a&quot;&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;$ bkcrack -C ALLBAS.ZIP -k 98e0f009 48a0b11a c70f8499 -D ALLBAS-DECRYPTED.ZIP&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;bkcrack 1.7.0 - 2024-05-26&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;[07:52:22] Writing decrypted archive ALLBAS-DECRYPTED.ZIP&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;100.0 % (81 / 81)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;$ bkcrack -C CODMAY93.ZIP -k 98e0f009 48a0b11a c70f8499 -D CODMAY93-DECRYPTED.ZIP&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;bkcrack 1.7.0 - 2024-05-26&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;[07:58:31] Writing decrypted archive CODMAY93-DECRYPTED.ZIP&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;100.0 % (40 / 40)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span face=&quot;Arial, sans-serif&quot;&gt;&lt;span style=&quot;white-space-collapse: preserve;&quot;&gt;And with that the long encrypted source code used to help set up secure communications for the ANC was available!&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span face=&quot;Arial, sans-serif&quot;&gt;&lt;span style=&quot;white-space-collapse: preserve;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;white-space-collapse: preserve;&quot;&gt;&lt;span face=&quot;Arial, sans-serif&quot;&gt;Had that failed I was going to attack one of the other ZIP files using the same attack (before resorting to bruteforceing file names). I&#39;d guessed that &lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;TECOD5.ZIP&lt;/span&gt;&lt;span face=&quot;Arial, sans-serif&quot;&gt; was probably a ZIP of just the file &lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;TECOD.BAS&lt;/span&gt;&lt;span face=&quot;Arial, sans-serif&quot;&gt; (or maybe &lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;TECOD5.BAS&lt;/span&gt;&lt;span face=&quot;Arial, sans-serif&quot;&gt;) based on the compressed size of &lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;TECOD.BAS&lt;/span&gt;&lt;span face=&quot;Arial, sans-serif&quot;&gt; in &lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;ALLBAS.ZIP&lt;/span&gt;&lt;span face=&quot;Arial, sans-serif&quot;&gt;). Turns out I wouldn&#39;t have had to wait 23 minutes if I&#39;d started there:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span face=&quot;Arial, sans-serif&quot;&gt;&lt;span style=&quot;font-size: 14.6667px; white-space-collapse: preserve;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;$ time echo &quot;TECOD5.BAS&quot; | perl maken.pl&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;TECOD5.BAS / hexname-41544.txt&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;bkcrack 1.7.0 - 2024-05-26&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;[18:14:51] Z reduction using 6 bytes of known plaintext&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;100.0 % (6 / 6)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;[18:14:51] Attack on 880113 Z values at index 33&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;Keys: 98e0f009 48a0b11a c70f8499&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;2.4 % (20737 / 880113)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;Found a solution. Stopping.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;You may resume the attack with the option: --continue-attack 20737&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;[18:15:29] Keys&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;98e0f009 48a0b11a c70f8499&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;b id=&quot;docs-internal-guid-1886b7ac-7fff-b8f7-c099-212e9012986c&quot; style=&quot;font-weight: normal;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;real&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;0m38.152s&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;user&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;4m35.318s&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span style=&quot;font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;sys&lt;/span&gt;&lt;span style=&quot;font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;text-wrap: nowrap;&quot;&gt;	&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;0m0.897s&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span face=&quot;Arial, sans-serif&quot; style=&quot;white-space-collapse: preserve;&quot;&gt;The known plaintext attack against ZipCrypto works quickly with the right plaintext. If you ever have to do something similar it&#39;s worth spending time thinking about the plaintext. In particular, files that are &lt;/span&gt;&lt;span style=&quot;font-family: courier; white-space-collapse: preserve;&quot;&gt;Store&lt;/span&gt;&lt;span face=&quot;Arial, sans-serif&quot; style=&quot;white-space-collapse: preserve;&quot;&gt;&#39;d in the ZIP file are useful to examine since they are uncompressed and it may be easier to predict their contents (rather than having to find an original file and compress it to match what&#39;s stored in the ZIP).&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;white-space-collapse: preserve;&quot;&gt;&lt;span face=&quot;Arial, sans-serif&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;&quot;&gt;&lt;span style=&quot;white-space-collapse: preserve;&quot;&gt;&lt;span face=&quot;Arial, sans-serif&quot;&gt;Running the code&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;white-space-collapse: preserve;&quot;&gt;&lt;span face=&quot;Arial, sans-serif&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;white-space-collapse: preserve;&quot;&gt;&lt;span face=&quot;Arial, sans-serif&quot;&gt;I compiled two of the programs and ran them using DOSBox. The first, &lt;a href=&quot;https://github.com/jgrahamc/jgc-vula-september-2024/blob/main/RANDOM.BAS&quot;&gt;RANDOM.BAS&lt;/a&gt;, was used to create disks of random numbers to be used as a one time pad, the other, &lt;a href=&quot;https://github.com/jgrahamc/jgc-vula-september-2024/blob/main/TECOD.BAS&quot;&gt;TECOD.BAS&lt;/a&gt;, was used to encrypt and decrypt messages sent via email. The code I compiled and the generated executables &lt;a href=&quot;https://github.com/jgrahamc/jgc-vula-september-2024/&quot;&gt;can be found here&lt;/a&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;white-space-collapse: preserve;&quot;&gt;&lt;span face=&quot;Arial, sans-serif&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;white-space-collapse: preserve;&quot;&gt;&lt;span face=&quot;Arial, sans-serif&quot;&gt;Compilation is simply running the PowerBASIC compiler as follows:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;white-space-collapse: preserve;&quot;&gt;&lt;span face=&quot;Arial, sans-serif&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;white-space-collapse: preserve;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;C:\&amp;gt;EXE\PBC TECOD.BAS
PowerBASIC Compiler Version 3.00b  Copyright (c) 1989-1993 by Robert S. Zale
Spectra Publishing, Sunnyvale, CA, USA
C:\TECOD.BAS
2575 statements, 2329 lines
Compile time: 00:12.0 Compilation speed: 12600 stmts/minute
45984 bytes code, 4880 bytes data, 2048 bytes stack
Segments(1): 46k

C:\&amp;gt;EXE\PBC RANDOM.BAS
PowerBASIC Compiler Version 3.00b  Copyright (c) 1989-1993 by Robert S. Zale
Spectra Publishing, Sunnyvale, CA, USA
C:\RANDOM.BAS
2194 statements, 1940 lines
Compile time: 00:10.1 Compilation speed: 12600 stmts/minute
33328 bytes code, 4704 bytes data, 3072 bytes stack
Segments(1): 34k

C:\&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;white-space-collapse: preserve;&quot;&gt;&lt;span face=&quot;Arial, sans-serif&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;white-space-collapse: preserve;&quot;&gt;The first step is to create random data on disk to be used as a one time pad. RANDOM.EXE uses three different randomness generating algorithms (one based on a random key you type in yourself). &lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;white-space-collapse: preserve;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuN0UGsMke0l_vABWoFgNkdBjmLu0FgzTgETRQgfSXVMJUlFo3rd6KGlzyGuGnVCIKN9bz4wS486EgARYw2OXCAqnPGanBalLVniCOUT_RzJywx9wjTnImPCe-GafBpPKIIFiHDxMUhubZVpYKoyRM1A9N_HUOCGgrZH8LSQDf06IKvD1mKWWtoQ/s1664/vula-1.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1080&quot; data-original-width=&quot;1664&quot; height=&quot;415&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuN0UGsMke0l_vABWoFgNkdBjmLu0FgzTgETRQgfSXVMJUlFo3rd6KGlzyGuGnVCIKN9bz4wS486EgARYw2OXCAqnPGanBalLVniCOUT_RzJywx9wjTnImPCe-GafBpPKIIFiHDxMUhubZVpYKoyRM1A9N_HUOCGgrZH8LSQDf06IKvD1mKWWtoQ/w640-h415/vula-1.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;Encryption and decryption is done through TECOD.EXE which is password protected.&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnvCtEckKgHs-Pn02d1A6vrV9QjuOpc0P7ViAsQClIefLJ3UXh4FyxMYjbJSuSzOQo7mHjvMbaoc1_vIqDqB79kAGOYEYi0Hk9O9KUM62zx3-M_Mhmuktt3XdmNq12R3ta9UmhZV4_SEUw5wYBTyETGXrYlVlqvKkHAjwzRfPKV3veDcPsnCxoXg/s1664/vula-2.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1080&quot; data-original-width=&quot;1664&quot; height=&quot;416&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnvCtEckKgHs-Pn02d1A6vrV9QjuOpc0P7ViAsQClIefLJ3UXh4FyxMYjbJSuSzOQo7mHjvMbaoc1_vIqDqB79kAGOYEYi0Hk9O9KUM62zx3-M_Mhmuktt3XdmNq12R3ta9UmhZV4_SEUw5wYBTyETGXrYlVlqvKkHAjwzRfPKV3veDcPsnCxoXg/w640-h416/vula-2.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;Although the password is embedded in the program and quite simple Tim Jenkin did obfuscate it as follows:&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;DIM PW$(PL)&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;PW$(9)=CHR$(66):PW$(4)=CHR$(66):PW$(1)=CHR$(84):PW$(5)=CHR$(79):PW$(2) =&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;CHR$(73)&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;PW$(3)=CHR$(77):PW$(6)=CHR$(66):PW$(8)=CHR$(77):PW$(10)=CHR$(79):PW$(7)=CHR$(&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;73)&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;In this particular version of the program that makes the password TIMBOBIMBO which when entered takes you to the main menu. Note that each version of these programs being sent to different members of the ANC had different passwords.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPEhfbubWzqACAf56urzB4c2MkrCyJVC9EcFocsHkWu8gTC5KCP80Ido9K_iAopeG9nYwV0tsOUtFlB_yXcwHn7OiklEDJop9UwWTk3B3pgT8N1P1APv7wODILo_ryQXS6ojfizJm2rcBrLgPav2uPsg3s3O7-Yl28PPFIJT0hMG7m66mtGwCVSQ/s1664/vula-3.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1080&quot; data-original-width=&quot;1664&quot; height=&quot;416&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPEhfbubWzqACAf56urzB4c2MkrCyJVC9EcFocsHkWu8gTC5KCP80Ido9K_iAopeG9nYwV0tsOUtFlB_yXcwHn7OiklEDJop9UwWTk3B3pgT8N1P1APv7wODILo_ryQXS6ojfizJm2rcBrLgPav2uPsg3s3O7-Yl28PPFIJT0hMG7m66mtGwCVSQ/w640-h416/vula-3.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;If you&#39;re interested in running these programs yourself, &lt;a href=&quot;https://github.com/Vulacode/TECOD/blob/main/TECOD_HLP.pdf&quot;&gt;the manual is here&lt;/a&gt;.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;Here are three short videos showing the creation of random data in &lt;a href=&quot;https://github.com/jgrahamc/jgc-vula-september-2024/blob/main/RANDATA.1&quot;&gt;RANDATA.1&lt;/a&gt; for the key using RANDOM.EXE, followed by encrypting a message stored in &lt;a href=&quot;https://github.com/jgrahamc/jgc-vula-september-2024/blob/main/PLAIN.TXT&quot;&gt;PLAIN.TXT&lt;/a&gt; on a RAM disk (all crypto operations were meant to happen on a RAM disk) and turning it into &lt;a href=&quot;https://github.com/jgrahamc/jgc-vula-september-2024/blob/main/PLAIN.BIN&quot;&gt;PLAIN.BIN&lt;/a&gt; (and the reverse).&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;&lt;span&gt;

Creating random data to be used as an encryption key&lt;/span&gt;&lt;/h3&gt;&lt;div&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;span&gt;&lt;div&gt;
  &lt;iframe allow=&quot;accelerometer; gyroscope; autoplay; encrypted-media; picture-in-picture;&quot; allowfullscreen=&quot;true&quot; loading=&quot;lazy&quot; src=&quot;https://customer-rww76yind8iym5aw.cloudflarestream.com/fba76afea511fe18ace045bd2500d257/iframe?poster=https%3A%2F%2Fcustomer-rww76yind8iym5aw.cloudflarestream.com%2Ffba76afea511fe18ace045bd2500d257%2Fthumbnails%2Fthumbnail.jpg%3Ftime%3D%26height%3D600&quot; style=&quot;border: none; height: 400px; left: 0; position: relative; top: 0; width: 100%;&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;&lt;/span&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/h3&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;&lt;span&gt;

Encrypting a file
  
&lt;/span&gt;&lt;/h3&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here the programs (TECOD.EXE/TECOD.CNF) are on a floppy disk in A:, the data disk (containing the key file created above) are in B: and there&#39;s a RAM disk on R:. To get this to work the RANDATA.1 file created in the step above needs to be renamed to SNUM.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;span&gt;&lt;div&gt;
  &lt;iframe allow=&quot;accelerometer; gyroscope; autoplay; encrypted-media; picture-in-picture;&quot; allowfullscreen=&quot;true&quot; loading=&quot;lazy&quot; src=&quot;https://customer-rww76yind8iym5aw.cloudflarestream.com/7bc06352d23ddfa1a8ef3e3fa3c4575a/iframe?poster=https%3A%2F%2Fcustomer-rww76yind8iym5aw.cloudflarestream.com%2F7bc06352d23ddfa1a8ef3e3fa3c4575a%2Fthumbnails%2Fthumbnail.jpg%3Ftime%3D%26height%3D600&quot; style=&quot;border: none; height: 400px; left: 0; position: relative; top: 0; width: 100%;&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;/span&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/h3&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;&lt;span&gt;

Decrypting a file&lt;/span&gt;&lt;/h3&gt;&lt;div&gt;&lt;span&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here the programs (TECOD.EXE/TECOD.CNF) are on a floppy disk in A:, the data disk (containing the key file created above) are in B: and there&#39;s a RAM disk on R:. The RANDATA.1 needs to be called RNUM on B:.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;&lt;span&gt;&lt;iframe allow=&quot;accelerometer; gyroscope; autoplay; encrypted-media; picture-in-picture;&quot; allowfullscreen=&quot;true&quot; loading=&quot;lazy&quot; src=&quot;https://customer-rww76yind8iym5aw.cloudflarestream.com/0239333a091d0e8c8d0c9e5302c29260/iframe?poster=https%3A%2F%2Fcustomer-rww76yind8iym5aw.cloudflarestream.com%2F0239333a091d0e8c8d0c9e5302c29260%2Fthumbnails%2Fthumbnail.jpg%3Ftime%3D%26height%3D600&quot; style=&quot;border: none; height: 400px; left: 0; position: relative; top: 0; width: 100%;&quot;&gt;&lt;/iframe&gt;&lt;/span&gt;&lt;/h3&gt;&lt;span&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;There are lots of interesting details of how these programs work that deserve another longer blog post when I have time. Or a detailed study by someone else. For example, the key material is destroyed after use, the RANDOM.EXE program has multiple ways of making randomness and code to check the distribution of the random bytes created. There&#39;s an emphasis on using the RAM disk for all cryptographic operations.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;</content>
        <link rel="replies" type="application/atom+xml" href="http://blog.jgc.org/feeds/105942708803926021/comments/default" title="Post Comments"/>
        <link rel="replies" type="text/html" href="http://www.blogger.com/comment/fullpage/post/19303585/105942708803926021" title="0 Comments"/>
        <link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19303585/posts/default/105942708803926021"/>
        <link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19303585/posts/default/105942708803926021"/>
        <link rel="alternate" type="text/html" href="http://blog.jgc.org/2024/09/cracking-old-zip-file-to-help-open.html" title="Cracking an old ZIP file to help open source the ANC&#39;s &quot;Operation Vula&quot; secret crypto code"/>
        <author>
            <name>Unknown</name>
            <email>[email protected]</email>
            <gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="https://img1.blogblog.com/img/b16-rounded.gif"/>
        </author>
        <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7c14emcAhruoYELH_YTk0Gl_SMkPPV8rRdmnjs21QQGiGZoAGn0rnBR2SeSXd4bAQqF83Kgu6bRKkeGjhWXPpzlqJfKkrnuMfNlfZ0CCej9dmGMDlQvDP24Ka3iorprn474jZ_ZUCANTiu9EBC0FLUmjpug9avwL4eoCx3qeX9afO2v3SsqaGdg/s72-c/171421935.png" height="72" width="72"/>
        <thr:total>0</thr:total>
    </entry>
    <entry>
        <id>tag:blogger.com,1999:blog-19303585.post-8452693863720025641</id>
        <published>2024-09-03T10:16:00.005+00:00</published>
        <updated>2024-09-12T08:57:41.586+00:00</updated>
        <category scheme="http://www.blogger.com/atom/ns#" term="hits"/>
        <category scheme="http://www.blogger.com/atom/ns#" term="mathematics"/>
        <category scheme="http://www.blogger.com/atom/ns#" term="pseudo-randomness"/>
        <title type="text">Steve Ballmer&#39;s incorrect binary search interview question</title>
        <content type="html">&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;In this short video &lt;a href=&quot;https://en.wikipedia.org/wiki/Steve_Ballmer&quot;&gt;Steve Ballmer&lt;/a&gt; talks about a puzzle question he would ask candidates interviewing at Microsoft. Solving it is based on &lt;a href=&quot;https://en.wikipedia.org/wiki/Binary_search&quot;&gt;binary search&lt;/a&gt; and the &lt;a href=&quot;https://en.wikipedia.org/wiki/Expected_value&quot;&gt;expected value&lt;/a&gt;.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;iframe allowfullscreen=&quot;&quot; class=&quot;BLOG_video_class&quot; height=&quot;266&quot; src=&quot;https://www.youtube.com/embed/svCYbkS0Sjk&quot; width=&quot;320&quot; youtube-src-id=&quot;svCYbkS0Sjk&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;Here&#39;s what he says: &quot;&lt;i&gt;I&#39;m thinking of a number between 1 and 100. You can guess, after each guess I&#39;ll tell you whether high or low. You get it the first guess I&#39;ll give you five bucks. Four bucks, three, two, one, zero, you pay me a buck, you pay me two, you pay me three&lt;/i&gt;&quot;.&amp;nbsp;&lt;/p&gt;&lt;p&gt;The question is &quot;&lt;i&gt;Should you accept to play this game?&lt;/i&gt;&quot;. In the interview, Ballmer states that the answer is &quot;No&quot; for two reasons: firstly, because he can pick numbers that&#39;ll be the most difficult for you to determine, secondly because the expected value of the game (assuming Ballmer chooses randomly) is negative: you end up paying Ballmer.&lt;/p&gt;&lt;p&gt;He&#39;s right on the first count. If you follow a binary search strategy (which will be optimal if he&#39;s choosing randomly) and he chooses one of&amp;nbsp;2, 5, 8, 11, 14, 17, 20, 22, 24, 27, 30, 33, 36, 39, 42, 45, 47, 49, 52, 55, 58, 61, 64, 67, 70, 72, 74, 77, 80, 83, 85, 87, 90, 93, 96, 98 or 100 then you owe him $1. For all other numbers you get $0 (if he chose&amp;nbsp;1, 4, 7, 10, 13, 16, 19, 23, 26, 29, 32, 35, 38, 41, 44, 48, 51, 54, 57, 60, 63, 66, 69, 73, 76, 79, 82, 86, 89, 92, 95 or 99) or a positive outcome (some of his money!).&lt;/p&gt;&lt;p&gt;In the video above Ballmer chooses 59 which a binary search strategy would have found in 5 steps resulting in the interviewer, Emily Chang, winning $1. She was actually pretty close to doing that. The binary search steps would be 50, 75,&amp;nbsp;62, 56, 59 and she guessed 50, 75, 60, 55, 57, 58, 59.&amp;nbsp;&lt;/p&gt;&lt;p&gt;On the second count (Baller implies the expected value is negative), if he&#39;s choosing randomly, then he&#39;s wrong. The expected value is $0.20 (calculated discretely using the code below). The code calculates the number of guesses for each value and an overall expected value assuming Ballmer chooses randomly.&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;use strict;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;use warnings;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;my @v = (0, 5, 4, 3, 2, 1, 0, -1, -2);&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;my $ev = 0;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;my $ec = 0;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;my @range = (1..100);&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;foreach my $r (@range) {&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; my $l = $range[0];&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; my $h = $range[$#range];&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; my $s = 0;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; while (1) {&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $s += 1;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; my $g = int(($l + $h)/2);&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if ($r == $g) {&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print &quot;$r found in $s steps (&quot; . dollar($v[$s]) . &quot;)\n&quot;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $ev += $v[$s];&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $ec += 1;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; last;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if ($g &amp;lt; $r) {&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $l = $g + 1;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; next;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if ($g &amp;gt; $r) {&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $h = $g - 1;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; next;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;}&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;$ev /= $ec;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;print &quot;Game expected value is &quot; . dollar($ev) . &quot;\n&quot;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;sub dollar {&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; my ($d) = @_;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; my $f = (int($d) == $d)?&#39;%d&#39;:&#39;%.2f&#39;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; return sprintf(&quot;%s\$$f&quot;, ($d&amp;lt;0)?&#39;-&#39;:&#39;&#39;, abs($d));&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;}&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;This chart shows the expected winnings (or loss) depending on the number Ballmer chooses. The shape of the binary search can be seen in the chart itself.&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiElRkalAf71qPuh9a1t0yhsoAO5ZPQ-mR3NpSBwwuYpdsbkASynXT_JOwyrOkzWUNJ1ZWGnArmU4tKHEQpsMVxe9s5h7qdXgZRaMprV8dV2X_0-dXG195Dsi7S3hnJknshVyiRIgKUXCRcy4RZcDv0tI_bWQd6OwzkdEfNavHTm8HV4NH4ZP4itg/s1800/bs-1.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;702&quot; data-original-width=&quot;1800&quot; height=&quot;250&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiElRkalAf71qPuh9a1t0yhsoAO5ZPQ-mR3NpSBwwuYpdsbkASynXT_JOwyrOkzWUNJ1ZWGnArmU4tKHEQpsMVxe9s5h7qdXgZRaMprV8dV2X_0-dXG195Dsi7S3hnJknshVyiRIgKUXCRcy4RZcDv0tI_bWQd6OwzkdEfNavHTm8HV4NH4ZP4itg/w640-h250/bs-1.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;A different way to think about the expected value and binary search is as follows:&lt;/p&gt;&lt;p&gt;1. On the first guess you choose 50 and win $5 with a probability of 1/100&lt;/p&gt;&lt;p&gt;2. On the second guess you choose 25 or 75 and win $4 with a probability of 2/100&lt;/p&gt;&lt;p&gt;3. On the third guess you choose 12, 37, 62 or 88 and win $3 with a probability of 4/100&lt;/p&gt;&lt;p&gt;4. On the fourth guess you choose 6, 18, 31, 43, 56, 68, 81 or 94 and win $2 with a probability of 8/100&lt;/p&gt;&lt;p&gt;5. And so on.&lt;/p&gt;&lt;p&gt;The gives the expected value as 5 * 1/100 + 4 * 2/100 + 3 * 4/100 + 2 * 8/100 + 1 * 16/100 + 0 * 32/100 + -1 * 37/100 (note the last term is the remaining possible numbers having reached the end of the binary search). That&#39;s 0.2.&lt;/p&gt;&lt;p&gt;&lt;i&gt;Why was Ballmer wrong?&lt;/i&gt;&lt;/p&gt;&lt;p&gt;One possibility is that he didn&#39;t mean to have the $0 for 6 guesses. If he&#39;d said &quot;&lt;i&gt;I&#39;m thinking of a number between 1 and 100. You can guess, after each guess I&#39;ll tell you whether high or low. You get it the first guess I&#39;ll give you five bucks. Four bucks, three, two, one, you pay me a buck, you pay me two, you pay me three&lt;/i&gt;&quot; then the expected value is -$0.49.&lt;/p&gt;</content>
        <link rel="replies" type="application/atom+xml" href="http://blog.jgc.org/feeds/8452693863720025641/comments/default" title="Post Comments"/>
        <link rel="replies" type="text/html" href="http://www.blogger.com/comment/fullpage/post/19303585/8452693863720025641" title="16 Comments"/>
        <link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19303585/posts/default/8452693863720025641"/>
        <link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19303585/posts/default/8452693863720025641"/>
        <link rel="alternate" type="text/html" href="http://blog.jgc.org/2024/09/steve-ballmers-binary-search-interview.html" title="Steve Ballmer&#39;s incorrect binary search interview question"/>
        <author>
            <name>Unknown</name>
            <email>[email protected]</email>
            <gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="https://img1.blogblog.com/img/b16-rounded.gif"/>
        </author>
        <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/svCYbkS0Sjk/default.jpg" height="72" width="72"/>
        <thr:total>16</thr:total>
    </entry>
    <entry>
        <id>tag:blogger.com,1999:blog-19303585.post-8870263574877874516</id>
        <published>2024-06-19T07:43:00.016+00:00</published>
        <updated>2024-06-20T12:38:31.606+00:00</updated>
        <category scheme="http://www.blogger.com/atom/ns#" term="hardware"/>
        <title type="text">Two ways to use  an LED as a light sensor with Arduino</title>
        <content type="html">&lt;p&gt;I needed to log when a light switched on and off during the night as part of debugging an oddly behaving movement sensor. To do that I built a really simple light sensor logger using an Arduino Leonardo, a large LED and a resistor or three. Here it is:&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXokF70rNbNS2w0ei9bHqVGaFi6KVXF6Cjlnd3Hp9yhhSD38FrvHTbdFRYr1JE4GUTywylxdFse1dKiBoO98IY3IYqpq8MSaUq6iAyq36rGKzgnli8gUKw_QmgleW2eJlX6Ns6MOukC_K3HvjRXfakGLjoHmCKL3Bj_-ful7Rz779ZPTy8UH-qXQ/s800/light-sense-1.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;768&quot; data-original-width=&quot;800&quot; height=&quot;614&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXokF70rNbNS2w0ei9bHqVGaFi6KVXF6Cjlnd3Hp9yhhSD38FrvHTbdFRYr1JE4GUTywylxdFse1dKiBoO98IY3IYqpq8MSaUq6iAyq36rGKzgnli8gUKw_QmgleW2eJlX6Ns6MOukC_K3HvjRXfakGLjoHmCKL3Bj_-ful7Rz779ZPTy8UH-qXQ/w640-h614/light-sense-1.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;And here&#39;s the entire Arduino code:&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;blockquote style=&quot;border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;void setup() {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; Serial.begin(9600);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; analogReference(EXTERNAL);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;void loop() {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; Serial.println(analogRead(A1));&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; delay(1000);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;The main &lt;span style=&quot;font-family: courier;&quot;&gt;loop()&lt;/span&gt; just reads the voltage across the LED from analog input A1 and writes it to the serial port. Then it waits for a second. The &lt;span style=&quot;font-family: courier;&quot;&gt;setup()&lt;/span&gt; routine tells the ADC converter to use the voltage on AREF as the reference maximum voltage for the ADC.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;The LED has a voltage of between about 0mV and 400mV depending on the amount of light.&amp;nbsp;&lt;/div&gt;
  &lt;br /&gt;
  &lt;iframe allow=&quot;accelerometer; gyroscope; autoplay; encrypted-media; picture-in-picture;&quot; allowfullscreen=&quot;true&quot; loading=&quot;lazy&quot; src=&quot;https://customer-rww76yind8iym5aw.cloudflarestream.com/036d470ad7ea9dfb3e7207f81d19feaa/iframe?poster=https%3A%2F%2Fcustomer-rww76yind8iym5aw.cloudflarestream.com%2F036d470ad7ea9dfb3e7207f81d19feaa%2Fthumbnails%2Fthumbnail.jpg%3Ftime%3D%26height%3D600&quot; style=&quot;border: none; height: 400px; left: 0; position: relative; top: 0; width: 100%;&quot;&gt;&lt;/iframe&gt;
  &lt;br /&gt;
  &lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span&gt;By default the voltage range of the ADC on the Arduino Leonardo is 0V to 5V but it&#39;s possible to scale it with a call to &lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;a href=&quot;https://www.arduino.cc/reference/en/language/functions/analog-io/analogreference/&quot;&gt;analogReference&lt;/a&gt;()&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Calling&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;analogReference(INTERNAL)&lt;/span&gt;&lt;span&gt;&amp;nbsp;would set the range to 0V to 2.56V which is still a bit large given the small voltage across the LED. AREF to the rescue!&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;The AREF pin allows a range to be set for the ADC. It has an internal resistance of 32K and I added a 66K resistor (made from three resistors I had lying around) connected to the Arduino&#39;s 3.3V pin. The 66K and 32K form a voltage divider giving an AREF of 1.1V (which is the low end of valid AREF values). Then it&#39;s just necessary to call&amp;nbsp;&lt;span style=&quot;font-family: courier;&quot;&gt;analogReference(EXTERNAL)&lt;/span&gt;.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;Here&#39;s the output of the program when I had covered the LED with my hand and then uncovered it.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5C4KpjJPdeYzeMG_mGgLzz_rlRxpzg4NQA_kLMTs-YTcuotxyRdN-mSKALKT-RXDF-SsinkMmjWoZ5XdydL3OlNcc8msaA1-q4kU1PDf0Sfc7H7HG2bKcZsIWrmywzl5JKTew7STFQOU2U7J4B_OITOqG3MZdZxmIa54QelvvjHJK2h8dQjhkdA/s1908/light-sense-2.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1314&quot; data-original-width=&quot;1908&quot; height=&quot;440&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5C4KpjJPdeYzeMG_mGgLzz_rlRxpzg4NQA_kLMTs-YTcuotxyRdN-mSKALKT-RXDF-SsinkMmjWoZ5XdydL3OlNcc8msaA1-q4kU1PDf0Sfc7H7HG2bKcZsIWrmywzl5JKTew7STFQOU2U7J4B_OITOqG3MZdZxmIa54QelvvjHJK2h8dQjhkdA/w640-h440/light-sense-2.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;You can also use the built in Arduino Serial Plotter to get an instant chart. Here I covered the LED with my hand, took my hand away and then shone a torch directly into the LED.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2jnALyAtZGaxR_bgWBPHA4XvF-WN-u2uBru3P_1KMtVFQ_b_RdwgriJTjG4t3hn8cIdSURke7W_SRpq_mQjYK7kZLmTWSgrEcykLnIYSDDAbCWD2Q5bWNmpXpIM3H4ERg4jyFXb-IDDwkqV-_8haWN1najFGHfufcU-YM8M36uS6FLt35qagV5Q/s1908/light-sense-3.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1314&quot; data-original-width=&quot;1908&quot; height=&quot;440&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2jnALyAtZGaxR_bgWBPHA4XvF-WN-u2uBru3P_1KMtVFQ_b_RdwgriJTjG4t3hn8cIdSURke7W_SRpq_mQjYK7kZLmTWSgrEcykLnIYSDDAbCWD2Q5bWNmpXpIM3H4ERg4jyFXb-IDDwkqV-_8haWN1najFGHfufcU-YM8M36uS6FLt35qagV5Q/w640-h440/light-sense-3.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;To get timestamped output I am using &lt;a href=&quot;https://freeware.the-meiers.org/&quot;&gt;CoolTerm&lt;/a&gt; which will automatically save to a file and add timestamps.&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7jHD3aMjlC14A1AvxHpk2sD7BDr1cti8yHmEVQ2QYz0p0935ip3Br3hFKKi1VHxff5vYjBsOg4FgK3N7AfAoK9AhD0L-BDt_IZxAzPOWWImTyyOR3z8FMJZhhAvqbCiwfcfvRITmJGdaeAmjokKtMFK14E1J-_ahX_dwctcTCLacHzvkBeMCPHA/s1624/light-sense-5.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1344&quot; data-original-width=&quot;1624&quot; height=&quot;530&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7jHD3aMjlC14A1AvxHpk2sD7BDr1cti8yHmEVQ2QYz0p0935ip3Br3hFKKi1VHxff5vYjBsOg4FgK3N7AfAoK9AhD0L-BDt_IZxAzPOWWImTyyOR3z8FMJZhhAvqbCiwfcfvRITmJGdaeAmjokKtMFK14E1J-_ahX_dwctcTCLacHzvkBeMCPHA/w640-h530/light-sense-5.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;That light sensor via LED relies on the photovoltaic effect: when light strikes the PN junction inside the LED it creates a voltage (albeit a small one). But there&#39;s another way to measure the light hitting an LED.&lt;/div&gt;&lt;h3 style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/h3&gt;&lt;h3 style=&quot;clear: both; text-align: left;&quot;&gt;Reverse bias&lt;/h3&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;If the LED is reverse biased (i.e. connected to a voltage source the wrong way round) then it won&#39;t light up but it will &lt;a href=&quot;https://playground.arduino.cc/Learning/LEDSensor/&quot;&gt;act as a capacitor that charges when light hits it&lt;/a&gt;. So the idea is to reverse bias the LED using two digital pins on the Arduino (one set HIGH and one set LOW) and then remove the bias and measure how long the LED (acting as a capacitor) takes to discharge. The brighter the light the faster the discharge.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;This can be achieved with a single LED connected between two digital pins like this: the +ve lead of the LED goes into the pin identified by LED_P and the -ve into the pin identified by LED_N.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzcPt_arHEonZr14PoYz7qDp3W-2aUlU_2CqeAoqIAnLASKQHAkYcrVsfhN2V1wWd9dX7u0P-HRPSPc5AQBv6exjrCakObSKg4C0_KRzPzWPUA1i37Dlx_5qdMjCGLNMZXJqIBFt2FXf82TFps23Qechway9f20uBX7lNX0LBaAsnzRw-3dSJkjA/s578/light-sense-6.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;478&quot; data-original-width=&quot;578&quot; height=&quot;530&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzcPt_arHEonZr14PoYz7qDp3W-2aUlU_2CqeAoqIAnLASKQHAkYcrVsfhN2V1wWd9dX7u0P-HRPSPc5AQBv6exjrCakObSKg4C0_KRzPzWPUA1i37Dlx_5qdMjCGLNMZXJqIBFt2FXf82TFps23Qechway9f20uBX7lNX0LBaAsnzRw-3dSJkjA/w640-h530/light-sense-6.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;And here&#39;s the code.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;blockquote style=&quot;border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;#define LED_N 4&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;#define LED_P 5&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;void setup()&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; Serial.begin(9600);&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;void loop()&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; unsigned long maxtime = 5000;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; pinMode(LED_N, OUTPUT);&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; pinMode(LED_P, OUTPUT);&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; digitalWrite(LED_N, HIGH);&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; digitalWrite(LED_P, LOW);&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; pinMode(LED_N, INPUT);&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; digitalWrite(LED_N,LOW);&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; unsigned long elapsed = 0;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; unsigned long start = millis();&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; while ((digitalRead(LED_N) != 0) &amp;amp;&amp;amp; (elapsed &amp;lt; maxtime)) {&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; elapsed = millis() - start;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; Serial.println(elapsed);&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; if (elapsed &amp;lt; maxtime) {&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; delay(&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;maxtime - elapsed&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;I found this worked better than the first version with more sensitive output. Note that smaller numbers mean brighter here (whereas in the previous code smaller meant darker). Here&#39;s a plot showing me covering the LED twice with my hand, followed by shining a torch at it. Each time I let the LED be exposed to ambient light between tests.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhU9XtvQK_LGnB-qHkJAj7oeXNiYMjBLMIql4tUTfgkRSH993an_KUcFhchLh8sCiwXIJMHL52zAAXzXCk9UC65DY5KPT48Wo9qiX8svrTdu6CqGxoz1b4TH2dSHjk6SOeMhg8FdWz2PaZ1opmDmKy3Y2JFkgo2bmsI29p0LC5Y5yAVkXltJfYa5g/s1908/light-sense-4.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1314&quot; data-original-width=&quot;1908&quot; height=&quot;440&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhU9XtvQK_LGnB-qHkJAj7oeXNiYMjBLMIql4tUTfgkRSH993an_KUcFhchLh8sCiwXIJMHL52zAAXzXCk9UC65DY5KPT48Wo9qiX8svrTdu6CqGxoz1b4TH2dSHjk6SOeMhg8FdWz2PaZ1opmDmKy3Y2JFkgo2bmsI29p0LC5Y5yAVkXltJfYa5g/w640-h440/light-sense-4.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3 style=&quot;clear: both; text-align: left;&quot;&gt;In action&lt;/h3&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;Certainly looks like that motion sensor is turning the light on in the night uselessly.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEguPSeXwgqstXmsa2s_b8K9nR3bMNPNekwykDxlX3o6_xjm3Tk0QMWvpZsx45ANjV9LSn0f9YnIA79IgKZ04dHZ3ashLcG2oC2YK8RfwkUSFtxWarNYRTqru7DH79E0b1aDqBAhJrjLSQAU0l66JOpbgmZOzGx4guMW8MAhvjGzQsLIAc7oGy7SLw/s1045/light-sense-7.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;646&quot; data-original-width=&quot;1045&quot; height=&quot;396&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEguPSeXwgqstXmsa2s_b8K9nR3bMNPNekwykDxlX3o6_xjm3Tk0QMWvpZsx45ANjV9LSn0f9YnIA79IgKZ04dHZ3ashLcG2oC2YK8RfwkUSFtxWarNYRTqru7DH79E0b1aDqBAhJrjLSQAU0l66JOpbgmZOzGx4guMW8MAhvjGzQsLIAc7oGy7SLw/w640-h396/light-sense-7.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;</content>
        <link rel="replies" type="application/atom+xml" href="http://blog.jgc.org/feeds/8870263574877874516/comments/default" title="Post Comments"/>
        <link rel="replies" type="text/html" href="http://www.blogger.com/comment/fullpage/post/19303585/8870263574877874516" title="3 Comments"/>
        <link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19303585/posts/default/8870263574877874516"/>
        <link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19303585/posts/default/8870263574877874516"/>
        <link rel="alternate" type="text/html" href="http://blog.jgc.org/2024/06/two-ways-to-use-led-as-light-sensor.html" title="Two ways to use  an LED as a light sensor with Arduino"/>
        <author>
            <name>Unknown</name>
            <email>[email protected]</email>
            <gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="https://img1.blogblog.com/img/b16-rounded.gif"/>
        </author>
        <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXokF70rNbNS2w0ei9bHqVGaFi6KVXF6Cjlnd3Hp9yhhSD38FrvHTbdFRYr1JE4GUTywylxdFse1dKiBoO98IY3IYqpq8MSaUq6iAyq36rGKzgnli8gUKw_QmgleW2eJlX6Ns6MOukC_K3HvjRXfakGLjoHmCKL3Bj_-ful7Rz779ZPTy8UH-qXQ/s72-w640-h614-c/light-sense-1.jpg" height="72" width="72"/>
        <thr:total>3</thr:total>
    </entry>
    <entry>
        <id>tag:blogger.com,1999:blog-19303585.post-6968922646267599704</id>
        <published>2024-06-15T16:36:00.003+00:00</published>
        <updated>2024-06-15T16:36:27.119+00:00</updated>
        <category scheme="http://www.blogger.com/atom/ns#" term="retro"/>
        <title type="text">Acorn Computer Systems catalogue circa 1983</title>
        <content type="html">&lt;p&gt;I unearthed a catalogue that I&#39;d picked up in around 1983 of &lt;a href=&quot;https://en.wikipedia.org/wiki/Acorn_System&quot;&gt;Acorn Computer Systems&lt;/a&gt;. This catalogue overlaps the BBC Micro era (which was released in 1981) as it goes up to the final Acorn System 5 (released in 1983).&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYB_ryt3FgR3bm1pwlfDV1jRwCeCUsS1mZT4i5TcAnMLi97PmT1pY10luDQifXwfB6Fj0ZSXRBQ9VoOkvtaGdVnmt7ewBTnwvOR4p4pFh_739x5QF68AsfJui7HOhTmfFyxXWmYI65F5pymISiQ6BvV-C4b-ApbQHJr_1chswGLAfu5wwTyePBmQ/s1820/acs-1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1820&quot; data-original-width=&quot;1284&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYB_ryt3FgR3bm1pwlfDV1jRwCeCUsS1mZT4i5TcAnMLi97PmT1pY10luDQifXwfB6Fj0ZSXRBQ9VoOkvtaGdVnmt7ewBTnwvOR4p4pFh_739x5QF68AsfJui7HOhTmfFyxXWmYI65F5pymISiQ6BvV-C4b-ApbQHJr_1chswGLAfu5wwTyePBmQ/w452-h640/acs-1.png&quot; width=&quot;452&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;The Acorn Computer Systems were based on the &lt;a href=&quot;https://en.wikipedia.org/wiki/Eurocard_(printed_circuit_board)&quot;&gt;Eurocard&lt;/a&gt; format for PCBs that can be mounted in a standard chassis.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhD9H3L4jE0uGxHaedCcbSJ_SgbU6JYz4oc2b4AJ8dPqUQZOQPeRXakUwiGR5PO5yuqN_x42FNkcbFS0J8lzilUEFFRLJDMFXRet23td9eTFXKGI1ykIZiQ1Ncs7Z5qPsqFR9S11CGTh6u8pcZMN6dQaQZYhJZ6I0t38UMjpzMlyZsqgkAHO3C18Q/s2576/acs-2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1832&quot; data-original-width=&quot;2576&quot; height=&quot;456&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhD9H3L4jE0uGxHaedCcbSJ_SgbU6JYz4oc2b4AJ8dPqUQZOQPeRXakUwiGR5PO5yuqN_x42FNkcbFS0J8lzilUEFFRLJDMFXRet23td9eTFXKGI1ykIZiQ1Ncs7Z5qPsqFR9S11CGTh6u8pcZMN6dQaQZYhJZ6I0t38UMjpzMlyZsqgkAHO3C18Q/w640-h456/acs-2.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;The Eurocard format meant that you could design a system for your needs, including handling&amp;nbsp;&lt;a href=&quot;https://en.wikipedia.org/wiki/Prestel&quot;&gt;Prestel&lt;/a&gt;/Teletext.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsON78AbO8VJDb3GukdR6KseGoFfxzzegqHcwKs9puAVI21QtObA67KglXU33UgJYyODviq0jaAMATccfey2Vxgee6FdLqvol0VNFhomGJuWVmUhgzRiPIp_vzHyCmJ0l35ldp6ivogczNXRHJcudL5OtbeB6Bl0N5KDUPN05iZrgw7_9WTE8jwA/s2576/acs-3.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1832&quot; data-original-width=&quot;2576&quot; height=&quot;456&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsON78AbO8VJDb3GukdR6KseGoFfxzzegqHcwKs9puAVI21QtObA67KglXU33UgJYyODviq0jaAMATccfey2Vxgee6FdLqvol0VNFhomGJuWVmUhgzRiPIp_vzHyCmJ0l35ldp6ivogczNXRHJcudL5OtbeB6Bl0N5KDUPN05iZrgw7_9WTE8jwA/w640-h456/acs-3.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;And, of course, you could add RAM.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNqOO-CoDyKGq8YC3uMyVJDC0Uyc0Bm8LRM99hWEWoZxXL5M36AyX1pxdcvX1KskI_93IIE1FvYZVF0ESfsF1MfEJ20_iHsAguH3MMyPLma1mR3fZVm5NSAtrLfzNi4M1kK4m4V-_63roMoIq36wIkGOeZicdjwr7ORBdj6LfBIfxqe6Mja9mSFA/s2576/acs-4.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1832&quot; data-original-width=&quot;2576&quot; height=&quot;456&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNqOO-CoDyKGq8YC3uMyVJDC0Uyc0Bm8LRM99hWEWoZxXL5M36AyX1pxdcvX1KskI_93IIE1FvYZVF0ESfsF1MfEJ20_iHsAguH3MMyPLma1mR3fZVm5NSAtrLfzNi4M1kK4m4V-_63roMoIq36wIkGOeZicdjwr7ORBdj6LfBIfxqe6Mja9mSFA/w640-h456/acs-4.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;A complete scan of the catalogue is available &lt;a href=&quot;https://drive.google.com/file/d/1SuvuhgH5UQz12DHGqSy5rZFS4aavdGf7/view?usp=sharing&quot;&gt;here&lt;/a&gt; as a PDF.&lt;/div&gt;</content>
        <link rel="replies" type="application/atom+xml" href="http://blog.jgc.org/feeds/6968922646267599704/comments/default" title="Post Comments"/>
        <link rel="replies" type="text/html" href="http://www.blogger.com/comment/fullpage/post/19303585/6968922646267599704" title="1 Comments"/>
        <link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19303585/posts/default/6968922646267599704"/>
        <link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19303585/posts/default/6968922646267599704"/>
        <link rel="alternate" type="text/html" href="http://blog.jgc.org/2024/06/acorn-computer-systems-catalogue-circa.html" title="Acorn Computer Systems catalogue circa 1983"/>
        <author>
            <name>Unknown</name>
            <email>[email protected]</email>
            <gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="https://img1.blogblog.com/img/b16-rounded.gif"/>
        </author>
        <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYB_ryt3FgR3bm1pwlfDV1jRwCeCUsS1mZT4i5TcAnMLi97PmT1pY10luDQifXwfB6Fj0ZSXRBQ9VoOkvtaGdVnmt7ewBTnwvOR4p4pFh_739x5QF68AsfJui7HOhTmfFyxXWmYI65F5pymISiQ6BvV-C4b-ApbQHJr_1chswGLAfu5wwTyePBmQ/s72-w452-h640-c/acs-1.png" height="72" width="72"/>
        <thr:total>1</thr:total>
    </entry>
    <entry>
        <id>tag:blogger.com,1999:blog-19303585.post-5445303529809922034</id>
        <published>2024-06-05T17:29:00.007+00:00</published>
        <updated>2024-06-07T16:20:02.448+00:00</updated>
        <title type="text">Fixing my iPhone 13 Pro cameras at -18C</title>
        <content type="html">&lt;p&gt;Look, I don&#39;t recommend you do this with your phone because bad things may happen, but the front and back cameras on my iPhone 13 Pro stopped working (in the camera app the image was black) and I &quot;fixed&quot; them myself using only a household appliance.&amp;nbsp;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjO4w9hVxSZm6TGzsmvw1GUKUb4eN109N4zqYyIE_Ptj3ZqOS8whM9P6Dao0TQBFvakuNjRm-9_7HFkAuTOqQDqtRue0wpcP2p2yMyyfyOan4OTsyaWrVmkoqoLzJMuLN8LXDh8aAyiPyzJi-8aQv23U11opY56U-ylSyLFGmAC4pVOKf9kjGl_wg/s1082/255k-1.jpeg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1082&quot; data-original-width=&quot;500&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjO4w9hVxSZm6TGzsmvw1GUKUb4eN109N4zqYyIE_Ptj3ZqOS8whM9P6Dao0TQBFvakuNjRm-9_7HFkAuTOqQDqtRue0wpcP2p2yMyyfyOan4OTsyaWrVmkoqoLzJMuLN8LXDh8aAyiPyzJi-8aQv23U11opY56U-ylSyLFGmAC4pVOKf9kjGl_wg/w185-h400/255k-1.jpeg&quot; width=&quot;185&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;I was planning to get them replaced but to do that I&#39;d need to replace the screen (because it has a crack in it) and it turned out to be €€€ so I figured I&#39;d soldier on with a phone with a broken camera. Oddly, the flashlight still worked and FaceID.&lt;/p&gt;&lt;p&gt;But, hey, in the past I&#39;d retrieved &lt;a href=&quot;https://blog.jgc.org/2023/08/retrieving-1tb-of-data-from-faulty.html&quot;&gt;1TB of data using woodworking tools&lt;/a&gt; and this camera problem looked like yet another small connection fault to me. And connection faults like this shout &quot;cool the thing down&quot; to me, so I figured it was worth a try cooling the phone down (a lot). To be fair, I don&#39;t have a case on my phone have dropped it a few times.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJ-0hfZKAopa8bT_2U6yRCeIu5DMg3xLsOQxdx02inFIY4wuQvohZhTTFrxEDNzE4WmPvotdsXOklojkpKMSYnz-MlkvtBM97hlNRwFNedJ_2PBT9u658mCjlbSNZNjUtMfqBMv_gS3Q8dSaB-WMWRVxxjOVnRgk90IIj3PGVWr5HCl9xcNKsWkQ/s500/255k-3.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;342&quot; data-original-width=&quot;500&quot; height=&quot;274&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJ-0hfZKAopa8bT_2U6yRCeIu5DMg3xLsOQxdx02inFIY4wuQvohZhTTFrxEDNzE4WmPvotdsXOklojkpKMSYnz-MlkvtBM97hlNRwFNedJ_2PBT9u658mCjlbSNZNjUtMfqBMv_gS3Q8dSaB-WMWRVxxjOVnRgk90IIj3PGVWr5HCl9xcNKsWkQ/w400-h274/255k-3.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;Apple says the &lt;a href=&quot;https://support.apple.com/en-gb/guide/iphone/iphbbe12ba1/&quot;&gt;iPhone can be stored at -20C switched off&lt;/a&gt; and a quick check of my freezer showed it was at -18C. So, one switched off iPhone in a ziplock bag and fifteen minutes later I had a phone with working cameras again.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjiZ-5OQdBlGA7FvhMSapl4b5aFORcG4EBFqceijo_ckLLkK1QI_IXMHg-nfZTm1MFbsQHZE-hvQlKJTnsIjaNB9nMhaeQJ0GL0uacI_dz-z-mNx8NO58d7xv2DZjj0wRHGCFZiTV391Rs-iOPLBsfjNHaFcH9_DzbXO1jwAumMGJ-VHaIt3iKlUA/s747/255k-2.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;747&quot; data-original-width=&quot;500&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjiZ-5OQdBlGA7FvhMSapl4b5aFORcG4EBFqceijo_ckLLkK1QI_IXMHg-nfZTm1MFbsQHZE-hvQlKJTnsIjaNB9nMhaeQJ0GL0uacI_dz-z-mNx8NO58d7xv2DZjj0wRHGCFZiTV391Rs-iOPLBsfjNHaFcH9_DzbXO1jwAumMGJ-VHaIt3iKlUA/w268-h400/255k-2.jpg&quot; width=&quot;268&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;And a battery that needed recharging.&lt;/p&gt;</content>
        <link rel="replies" type="application/atom+xml" href="http://blog.jgc.org/feeds/5445303529809922034/comments/default" title="Post Comments"/>
        <link rel="replies" type="text/html" href="http://www.blogger.com/comment/fullpage/post/19303585/5445303529809922034" title="0 Comments"/>
        <link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19303585/posts/default/5445303529809922034"/>
        <link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19303585/posts/default/5445303529809922034"/>
        <link rel="alternate" type="text/html" href="http://blog.jgc.org/2024/06/fixing-my-iphone-13-pro-cameras-at-18c.html" title="Fixing my iPhone 13 Pro cameras at -18C"/>
        <author>
            <name>Unknown</name>
            <email>[email protected]</email>
            <gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="https://img1.blogblog.com/img/b16-rounded.gif"/>
        </author>
        <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjO4w9hVxSZm6TGzsmvw1GUKUb4eN109N4zqYyIE_Ptj3ZqOS8whM9P6Dao0TQBFvakuNjRm-9_7HFkAuTOqQDqtRue0wpcP2p2yMyyfyOan4OTsyaWrVmkoqoLzJMuLN8LXDh8aAyiPyzJi-8aQv23U11opY56U-ylSyLFGmAC4pVOKf9kjGl_wg/s72-w185-h400-c/255k-1.jpeg" height="72" width="72"/>
        <thr:total>0</thr:total>
    </entry>
    <entry>
        <id>tag:blogger.com,1999:blog-19303585.post-4308511000929231325</id>
        <published>2024-05-27T16:55:00.004+00:00</published>
        <updated>2024-09-12T08:58:20.564+00:00</updated>
        <category scheme="http://www.blogger.com/atom/ns#" term="hits"/>
        <category scheme="http://www.blogger.com/atom/ns#" term="pseudo-randomness"/>
        <title type="text">Controlling the Taylor Swift Eras Tour wristbands with Flipper Zero</title>
        <content type="html">&lt;p&gt;Many large concerts feature wristbands that light up on command. They are used to produce varied visual effects across a stadium. One company that makes these is &lt;a href=&quot;https://pixmob.com/&quot;&gt;PixMob&lt;/a&gt;. Their controllable, illuminated wristbands are currently being used as part of &lt;a href=&quot;https://en.wikipedia.org/wiki/The_Eras_Tour&quot;&gt;Taylor Swift&#39;s Eras Tour&lt;/a&gt;. A short Wired article &lt;a href=&quot;https://wired.me/technology/the-tech-behind-taylor-swift-concert-wristbands/&quot;&gt;here&lt;/a&gt; gives some details and here&#39;s a video from the Wall Street Journal:&lt;/p&gt;&lt;div style=&quot;text-align: center;&quot;&gt;&lt;iframe allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;315&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot; src=&quot;https://www.youtube.com/embed/GCsmZA08oD8?si=e3755KHJFdna_zBV&quot; title=&quot;YouTube video player&quot; width=&quot;560&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;p&gt;For the Eras Tour the company&#39;s X2 product is being used. It looks like this:&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQg9Q19zegc3hBuX2vNtiBNssn2XKYwLKBcAw1y34T1bEwMY3ITvksGMnVa4Ifzt_yaCsWHZf8AJjHRMoiodRsSMp8nKfm13E-oldA1RQ9UEqRxJkF98UzunZfGwo49Nwp7xjCMGl56Prugv67T6tXT9msEmRpl2FDuvLMXef31xgDZij7j-5sdg/s3731/eras-1.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1340&quot; data-original-width=&quot;3731&quot; height=&quot;230&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQg9Q19zegc3hBuX2vNtiBNssn2XKYwLKBcAw1y34T1bEwMY3ITvksGMnVa4Ifzt_yaCsWHZf8AJjHRMoiodRsSMp8nKfm13E-oldA1RQ9UEqRxJkF98UzunZfGwo49Nwp7xjCMGl56Prugv67T6tXT9msEmRpl2FDuvLMXef31xgDZij7j-5sdg/w640-h230/eras-1.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;Since these wristbands are designed for reuse they are easily opened revealing two batteries and a lovely little circuit board:&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQsQ3X_JVN4fln9WOBbyohyphenhyphenrSuV8jFu_Cm-oYlf9pa7o5_2pv4AEzpDbRNTPGZcfA4bDvzVM_4qpvNB-jZRUuawJo28u9fjCIFNDXEh8SkR5TYxMGBi3B9qNBfNOf6ihbqAn23fhXdwywkCpLqO1nNZ6IroifiZtGkviBfCfKDQtivvgyy07zg-g/s2823/eras-2.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;2234&quot; data-original-width=&quot;2823&quot; height=&quot;506&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQsQ3X_JVN4fln9WOBbyohyphenhyphenrSuV8jFu_Cm-oYlf9pa7o5_2pv4AEzpDbRNTPGZcfA4bDvzVM_4qpvNB-jZRUuawJo28u9fjCIFNDXEh8SkR5TYxMGBi3B9qNBfNOf6ihbqAn23fhXdwywkCpLqO1nNZ6IroifiZtGkviBfCfKDQtivvgyy07zg-g/w640-h506/eras-2.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;Here&#39;s that circuit board with the copyright date of 20230629, clear markings of the components and a little palm tree next to PALM V2.6r1. It does look &quot;Designed with 🖤 in Montréal&quot;!&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgu9JtblHe06nqdgEHaGGxg7jAha5zSxrJnkZYcUoCdAz3jHfeZ07_9waLR0RW8SvvyjkHfDqz_ak_M0bIZCrE0v-08Q5raviX844Mgm_bZf9gpQROLKtlUwuatt0_2ErTXD6HEAsR-vCm8HmYFADwmYYJo490ez5xksNqmlm8v63vBefTl6PQqCg/s3483/eras-3.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1996&quot; data-original-width=&quot;3483&quot; height=&quot;366&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgu9JtblHe06nqdgEHaGGxg7jAha5zSxrJnkZYcUoCdAz3jHfeZ07_9waLR0RW8SvvyjkHfDqz_ak_M0bIZCrE0v-08Q5raviX844Mgm_bZf9gpQROLKtlUwuatt0_2ErTXD6HEAsR-vCm8HmYFADwmYYJo490ez5xksNqmlm8v63vBefTl6PQqCg/w640-h366/eras-3.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;On that board are two RGB LEDs, a little microcontroller, a little bit of EEPROM and an infrared diode to receive a signal. So, simply put, PixMob works by installed a really big (and moveable) IR remote control (you can read about this on their website &lt;a href=&quot;https://pixmob.com/our-effects&quot;&gt;here&lt;/a&gt;) and transmitting commands to the bracelets to produce colours, fades, flashes, etc. Cute.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;There are a bunch of hardware details &lt;a href=&quot;https://yeokhengmeng.com/2019/08/teardown-of-ndp2019-led-wristband/&quot;&gt;here&lt;/a&gt;.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;Since they are projecting infrared with moveable projector they can sweep effects around the stadium, and cover the projector with cut outs to make things like hearts. It&#39;s simple technology that works very nicely. And, of course, there&#39;s a reverse engineering community built up around this.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;The best place to start learning about that is &lt;a href=&quot;https://github.com/danielweidman/pixmob-ir-reverse-engineering&quot;&gt;this&lt;/a&gt; GitHub repository. It brings together a bunch of reverse engineering efforts that have looked into the IR protocol. These have been somewhat successful and, since the &lt;a href=&quot;https://flipperzero.one/&quot;&gt;Flipper Zero&lt;/a&gt; has IR capability, there&#39;s a &lt;a href=&quot;https://github.com/danielweidman/flipper-pixmob-ir-codes&quot;&gt;project&lt;/a&gt; that makes it control the wristband.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;Here&#39;s a short video of me making the wristbands fade orange.&lt;/div&gt;&lt;br /&gt;&lt;iframe allow=&quot;accelerometer; gyroscope; autoplay; encrypted-media; picture-in-picture;&quot; allowfullscreen=&quot;true&quot; loading=&quot;lazy&quot; src=&quot;https://customer-rww76yind8iym5aw.cloudflarestream.com/e2e26c96afd3438d0114d293ec4c0cac/iframe?poster=https%3A%2F%2Fcustomer-rww76yind8iym5aw.cloudflarestream.com%2Fe2e26c96afd3438d0114d293ec4c0cac%2Fthumbnails%2Fthumbnail.jpg%3Ftime%3D%26height%3D600&quot; style=&quot;border: none; height: 400px; left: 0; position: relative; top: 0; width: 100%;&quot;&gt;&lt;/iframe&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;Such nice simple technology that produces very cool effects.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;/div&gt;</content>
        <link rel="replies" type="application/atom+xml" href="http://blog.jgc.org/feeds/4308511000929231325/comments/default" title="Post Comments"/>
        <link rel="replies" type="text/html" href="http://www.blogger.com/comment/fullpage/post/19303585/4308511000929231325" title="8 Comments"/>
        <link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19303585/posts/default/4308511000929231325"/>
        <link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19303585/posts/default/4308511000929231325"/>
        <link rel="alternate" type="text/html" href="http://blog.jgc.org/2024/05/controlling-taylor-swift-eras-tour.html" title="Controlling the Taylor Swift Eras Tour wristbands with Flipper Zero"/>
        <author>
            <name>Unknown</name>
            <email>[email protected]</email>
            <gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="https://img1.blogblog.com/img/b16-rounded.gif"/>
        </author>
        <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/GCsmZA08oD8/default.jpg" height="72" width="72"/>
        <thr:total>8</thr:total>
    </entry>
    <entry>
        <id>tag:blogger.com,1999:blog-19303585.post-974739914720448872</id>
        <published>2024-04-11T12:22:00.000+00:00</published>
        <updated>2024-04-11T12:22:22.922+00:00</updated>
        <title type="text">The Economist&#39;s ugly new print typeface</title>
        <content type="html">Turning to the back page of a recent copy of The Economist to read the obituary of &lt;a href=&quot;https://www.economist.com/obituary/2024/04/03/paul-alexander-lived-longer-than-anyone-in-an-iron-lung&quot;&gt;Paul Alexander&lt;/a&gt; the eye is assaulted by The Economist&#39;s &lt;a href=&quot;https://www.economist.com/the-economist-explains/2024/02/07/why-has-the-economist-changed-its-typeface&quot;&gt;new, ugly, hard-to-read typeface&lt;/a&gt;&amp;nbsp;(which came about because: &quot;In early 2023, as our font licence was coming up for renewal, we decided that we wanted to create something unique to The Economist.&quot;)&amp;nbsp;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The very first letter of the obituary, the drop capital, seems set adrift from the rest of the word it belongs to and about to slam into a letter on the following line. This really bugs me,&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghV9qeDSGH6Ovc6e5iAMyqf49Eu0IPh119LHE9auqRtrdu1O2kyDw43UUcsBFErDJVJonAm8w8y6lyL1ep8B101kuPajzafqdt-HPl-3bBI7gd-rAPBSewzvy_7i86UQdPBJzxMvtS4Hm4USPFp-Bf-5khaE7oOqsqlB7VdxZwqcDhkmKZUamXuA/s1243/economist-1.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;317&quot; data-original-width=&quot;1243&quot; height=&quot;163&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghV9qeDSGH6Ovc6e5iAMyqf49Eu0IPh119LHE9auqRtrdu1O2kyDw43UUcsBFErDJVJonAm8w8y6lyL1ep8B101kuPajzafqdt-HPl-3bBI7gd-rAPBSewzvy_7i86UQdPBJzxMvtS4Hm4USPFp-Bf-5khaE7oOqsqlB7VdxZwqcDhkmKZUamXuA/w640-h163/economist-1.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;The problems don&#39;t stop with drop capitals. Here&#39;s a short part of the article&amp;nbsp;&lt;a href=&quot;https://www.economist.com/united-states/2024/04/04/the-biden-campaign-in-michigan-has-a-tremendous-ground-game-advantage&quot;&gt;The Biden campaign in Michigan has a tremendous ground-game advantage&lt;/a&gt;. The W from Wolverine seems to be about snag on the g of campaign.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFvtQ8nmx_4FA6ouIMAY-hPCFMgxzOhqbTzslvyTOwM4_SwRlQ14EtFOz1weN6Iqq_NmYDP6XjNI67EPpzzllYqn-dcKKIBRTEAGvMgHxZdSjvHjFjzEvFyRsEs-DepJY7283m4kxp9XdRiKBmwgpqYm7BlMPnSOgWZub_3nvmjQt7Du-0i-h6XA/s847/economist-2.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;260&quot; data-original-width=&quot;847&quot; height=&quot;196&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFvtQ8nmx_4FA6ouIMAY-hPCFMgxzOhqbTzslvyTOwM4_SwRlQ14EtFOz1weN6Iqq_NmYDP6XjNI67EPpzzllYqn-dcKKIBRTEAGvMgHxZdSjvHjFjzEvFyRsEs-DepJY7283m4kxp9XdRiKBmwgpqYm7BlMPnSOgWZub_3nvmjQt7Du-0i-h6XA/w640-h196/economist-2.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;And here&#39;s a little bit of&amp;nbsp;&lt;a href=&quot;https://www.economist.com/the-americas/2024/04/04/justin-trudeau-is-beset-by-a-divided-party-and-an-angry-electorate&quot;&gt;Justin Trudeau is beset by a divided party and an angry electorate&lt;/a&gt;. The gg in staggering and the T in The draw the eye to their closeness. The overall effect in this excerpt is that some lines seem closer together than others.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhilAeEgDN-pajI_J5k5XzY7OX80s1diWLIYG42qpnpRoxnvzPBP-ckDrjv8_QdhyphenhyphenWQAsEB1zB9UIryzOeUu-tqgXedTlTD_AHLGsL3KqlTvGcXSU6nVk1FRSx9IM3oBZI-nmw-_uMpMYUzI1L-lF-FSdxJaX1ZsXcrZn-csvoJHG1aayureHu2ig/s858/economist-3.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;352&quot; data-original-width=&quot;858&quot; height=&quot;262&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhilAeEgDN-pajI_J5k5XzY7OX80s1diWLIYG42qpnpRoxnvzPBP-ckDrjv8_QdhyphenhyphenWQAsEB1zB9UIryzOeUu-tqgXedTlTD_AHLGsL3KqlTvGcXSU6nVk1FRSx9IM3oBZI-nmw-_uMpMYUzI1L-lF-FSdxJaX1ZsXcrZn-csvoJHG1aayureHu2ig/w640-h262/economist-3.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;The new typeface makes the print edition of The Economist hard to read. As the eye scans across the page it snags on lines that seem on a collision course. And at the end of a line finding the corresponding next line is harder than before.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;These problems do not occur when the new typeface is used online. Something about the line spacing in print makes the new typeface hard to read on paper and easy on screen. Perhaps print doesn&#39;t matter any more to The Economist. In the article about the new typeface they say that &quot;Most of our readers subscribe to us digitally&quot;.&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</content>
        <link rel="replies" type="application/atom+xml" href="http://blog.jgc.org/feeds/974739914720448872/comments/default" title="Post Comments"/>
        <link rel="replies" type="text/html" href="http://www.blogger.com/comment/fullpage/post/19303585/974739914720448872" title="3 Comments"/>
        <link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19303585/posts/default/974739914720448872"/>
        <link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19303585/posts/default/974739914720448872"/>
        <link rel="alternate" type="text/html" href="http://blog.jgc.org/2024/04/the-economists-ugly-new-print-typeface.html" title="The Economist&#39;s ugly new print typeface"/>
        <author>
            <name>Unknown</name>
            <email>[email protected]</email>
            <gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="https://img1.blogblog.com/img/b16-rounded.gif"/>
        </author>
        <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghV9qeDSGH6Ovc6e5iAMyqf49Eu0IPh119LHE9auqRtrdu1O2kyDw43UUcsBFErDJVJonAm8w8y6lyL1ep8B101kuPajzafqdt-HPl-3bBI7gd-rAPBSewzvy_7i86UQdPBJzxMvtS4Hm4USPFp-Bf-5khaE7oOqsqlB7VdxZwqcDhkmKZUamXuA/s72-w640-h163-c/economist-1.jpg" height="72" width="72"/>
        <thr:total>3</thr:total>
    </entry>
    <entry>
        <id>tag:blogger.com,1999:blog-19303585.post-1499907955973408015</id>
        <published>2024-03-13T17:54:00.005+00:00</published>
        <updated>2024-03-13T17:55:56.255+00:00</updated>
        <title type="text">The formal development of secure systems (my 1992 doctoral thesis)</title>
        <content type="html">&lt;p&gt;Since this doesn&#39;t seem to be findable online anywhere here&#39;s &lt;a href=&quot;https://jgc.org/jgc-thesis.pdf&quot;&gt;a PDF generated from the original .tex files&lt;/a&gt; that I kept on a floppy for 30 years!&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPr9V1X6gahw9x5YhG_1dOF0m5vM937lO4xgvtxdLhLrp_x9Sv9pPatWgfXfKyV-td-TG1AlcCofPoy8zAubokQmL64wxKTpc8T7FYfa9y-at545Yr06_Y62XK5G49H9wEJCcmSIiwmGFprTUodBHyoltlEDhEbG7ad7_7nYlarcI9ljCxD97x4A/s1828/thesis-1.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1828&quot; data-original-width=&quot;1294&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPr9V1X6gahw9x5YhG_1dOF0m5vM937lO4xgvtxdLhLrp_x9Sv9pPatWgfXfKyV-td-TG1AlcCofPoy8zAubokQmL64wxKTpc8T7FYfa9y-at545Yr06_Y62XK5G49H9wEJCcmSIiwmGFprTUodBHyoltlEDhEbG7ad7_7nYlarcI9ljCxD97x4A/w454-h640/thesis-1.png&quot; width=&quot;454&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjA7oV4zi-An_TKRShSa1bZYhhxn0r3ueZ9pVZNnZTi-8tlBQguQst-QRYZm8kBdbchHU1p3TCyMAp8SKgaaag_Ie_VqxQKkex7zasZI2rSCtjsAToN5JUeVLUxY8_rz1coao2aTHkMXXiN-Qo0NasrOI1Tj3CZHFO3HCPLqvH2DLzaOH4HIuxJmw/s1828/thesis-2.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1828&quot; data-original-width=&quot;1294&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjA7oV4zi-An_TKRShSa1bZYhhxn0r3ueZ9pVZNnZTi-8tlBQguQst-QRYZm8kBdbchHU1p3TCyMAp8SKgaaag_Ie_VqxQKkex7zasZI2rSCtjsAToN5JUeVLUxY8_rz1coao2aTHkMXXiN-Qo0NasrOI1Tj3CZHFO3HCPLqvH2DLzaOH4HIuxJmw/w454-h640/thesis-2.png&quot; width=&quot;454&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;If you&#39;re curious about formal methods and computer security in 1992, or just want to read some &lt;a href=&quot;https://en.wikipedia.org/wiki/Communicating_sequential_processes&quot;&gt;CSP&lt;/a&gt; and &lt;a href=&quot;https://en.wikipedia.org/wiki/Occam_(programming_language)&quot;&gt;occam&lt;/a&gt; code, you may enjoy it. It does get a little technical:&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjA6DyYdI95wN_Kt1-y7BXDj3kgF5r5L1IeOeTVnLGLsub9koKlN8WaLLE1Snc-NppZmsxQ0D7b5V25BDgSYtABQKbDgc7vtBbfxqEwg7ZNrW4EvNO4ZsisCJcSuWtuyVLZzxJZg_ttld1eVUNyInF4BrbLHMlKm9B3ENlqTIqsZDbG90ASSHpUg/s1828/thesis-3.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1828&quot; data-original-width=&quot;1294&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjA6DyYdI95wN_Kt1-y7BXDj3kgF5r5L1IeOeTVnLGLsub9koKlN8WaLLE1Snc-NppZmsxQ0D7b5V25BDgSYtABQKbDgc7vtBbfxqEwg7ZNrW4EvNO4ZsisCJcSuWtuyVLZzxJZg_ttld1eVUNyInF4BrbLHMlKm9B3ENlqTIqsZDbG90ASSHpUg/w454-h640/thesis-3.png&quot; width=&quot;454&quot; /&gt;&lt;/a&gt;&lt;/div&gt;</content>
        <link rel="replies" type="application/atom+xml" href="http://blog.jgc.org/feeds/1499907955973408015/comments/default" title="Post Comments"/>
        <link rel="replies" type="text/html" href="http://www.blogger.com/comment/fullpage/post/19303585/1499907955973408015" title="0 Comments"/>
        <link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19303585/posts/default/1499907955973408015"/>
        <link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19303585/posts/default/1499907955973408015"/>
        <link rel="alternate" type="text/html" href="http://blog.jgc.org/2024/03/the-formal-development-of-secure.html" title="The formal development of secure systems (my 1992 doctoral thesis)"/>
        <author>
            <name>Unknown</name>
            <email>[email protected]</email>
            <gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="https://img1.blogblog.com/img/b16-rounded.gif"/>
        </author>
        <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPr9V1X6gahw9x5YhG_1dOF0m5vM937lO4xgvtxdLhLrp_x9Sv9pPatWgfXfKyV-td-TG1AlcCofPoy8zAubokQmL64wxKTpc8T7FYfa9y-at545Yr06_Y62XK5G49H9wEJCcmSIiwmGFprTUodBHyoltlEDhEbG7ad7_7nYlarcI9ljCxD97x4A/s72-w454-h640-c/thesis-1.png" height="72" width="72"/>
        <thr:total>0</thr:total>
    </entry>
    <entry>
        <id>tag:blogger.com,1999:blog-19303585.post-6683007227968107268</id>
        <published>2024-03-13T09:06:00.003+00:00</published>
        <updated>2024-03-13T10:31:19.587+00:00</updated>
        <title type="text">Taschen, Acorn and Knoll&#39;s Law</title>
        <content type="html">&lt;p&gt;I have a copy of Taschen&#39;s huge book &lt;a href=&quot;https://www.taschen.com/en/books/popculture/04692/the-computer&quot;&gt;The Computer&lt;/a&gt;. 472 pages of computer history with lots of lovely photographs.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheoT_uB9SbbnOoCjcAqXc1datswx92Hq9vHSJ-DU5hCn05tGCF_3n9KjGcrU7eMcL-c8WQDKcH-8WhVjNe3HR1MIpLTmp9x8r6OkuoWuViCL_oRsWgwKeupH08DG8efLcHTV9stZyB3-wyE8wB9T45fjn8vt4W0ju7MwTvx0x3GiLF-yL9Vzc8ww/s1004/book.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1004&quot; data-original-width=&quot;674&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheoT_uB9SbbnOoCjcAqXc1datswx92Hq9vHSJ-DU5hCn05tGCF_3n9KjGcrU7eMcL-c8WQDKcH-8WhVjNe3HR1MIpLTmp9x8r6OkuoWuViCL_oRsWgwKeupH08DG8efLcHTV9stZyB3-wyE8wB9T45fjn8vt4W0ju7MwTvx0x3GiLF-yL9Vzc8ww/w430-h640/book.png&quot; width=&quot;430&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;Which is great, except that I turned to the page that covers one of the computers I know well, the &lt;a href=&quot;https://en.wikipedia.org/wiki/BBC_Micro&quot;&gt;BBC Micro&lt;/a&gt;, and see this:&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIs3Hspf8ci09EX9FljbKSUhWryOz3RJAxB1AbeTabozF_KU4_Rm4DcIQdu7VUzJAqXsc1AiIjvvi0H4zqhIRlig_lwcEH9LvZmFiPpXZqr-LTAEykE9Gilg3E_FlAGZaUVNw4-Ns7GViGWuZPz_lir_RCGb_fhf2or8Mc9X3u_P77PjNrfhKhhQ/s3220/amneisa.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1752&quot; data-original-width=&quot;3220&quot; height=&quot;348&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIs3Hspf8ci09EX9FljbKSUhWryOz3RJAxB1AbeTabozF_KU4_Rm4DcIQdu7VUzJAqXsc1AiIjvvi0H4zqhIRlig_lwcEH9LvZmFiPpXZqr-LTAEykE9Gilg3E_FlAGZaUVNw4-Ns7GViGWuZPz_lir_RCGb_fhf2or8Mc9X3u_P77PjNrfhKhhQ/w640-h348/amneisa.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;Which, at first glance, look fine, or rather it doesn&#39;t. The machine on the right is not an &quot;Acorn BBC Micro, 1981&quot;, it&#39;s an &quot;Acorn BBC Master 128, 1986&quot;. Sure, it&#39;s part of the BBC Micro line of computers but it&#39;s not what the caption says.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;So now I&#39;m stuck looking at the book thinking about Knoll&#39;s Law of Media Accuracy: &quot;Everything you read in the newspapers is absolutely true except for the rare story of which you happen to have firsthand knowledge.&quot;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;PS Also, I&#39;d argue that Acorn did &quot;stand a chance in the face of competition from Silicon Valley&quot; because it pivoted (as the Silicon Valley types like to say) into &lt;a href=&quot;https://www.arm.com/&quot;&gt;Arm&lt;/a&gt;.&lt;/div&gt;</content>
        <link rel="replies" type="application/atom+xml" href="http://blog.jgc.org/feeds/6683007227968107268/comments/default" title="Post Comments"/>
        <link rel="replies" type="text/html" href="http://www.blogger.com/comment/fullpage/post/19303585/6683007227968107268" title="0 Comments"/>
        <link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19303585/posts/default/6683007227968107268"/>
        <link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19303585/posts/default/6683007227968107268"/>
        <link rel="alternate" type="text/html" href="http://blog.jgc.org/2024/03/taschen-acorn-and-knolls-law.html" title="Taschen, Acorn and Knoll&#39;s Law"/>
        <author>
            <name>Unknown</name>
            <email>[email protected]</email>
            <gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="https://img1.blogblog.com/img/b16-rounded.gif"/>
        </author>
        <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheoT_uB9SbbnOoCjcAqXc1datswx92Hq9vHSJ-DU5hCn05tGCF_3n9KjGcrU7eMcL-c8WQDKcH-8WhVjNe3HR1MIpLTmp9x8r6OkuoWuViCL_oRsWgwKeupH08DG8efLcHTV9stZyB3-wyE8wB9T45fjn8vt4W0ju7MwTvx0x3GiLF-yL9Vzc8ww/s72-w430-h640-c/book.png" height="72" width="72"/>
        <thr:total>0</thr:total>
    </entry>
    <entry>
        <id>tag:blogger.com,1999:blog-19303585.post-6321735604645731335</id>
        <published>2024-03-09T13:42:00.002+00:00</published>
        <updated>2024-05-08T13:28:46.298+00:00</updated>
        <title type="text">The Acme Klein Bottle (from Cliff Stoll and family)</title>
        <content type="html">&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Clifford_Stoll&quot;&gt;Cliff Stoll&lt;/a&gt; (who is probably most famous for writing the wonderful &lt;a href=&quot;https://en.wikipedia.org/wiki/The_Cuckoo%27s_Egg_(book)&quot;&gt;Cuckoo&#39;s Egg&lt;/a&gt; about tracking a hacker when doing so was almost recreational) runs a business making Klein bottles: &lt;a href=&quot;https://www.kleinbottle.com/&quot;&gt;Acme Klein Bottle&lt;/a&gt;. A Klein bottle is a weird shape (that doesn&#39;t actually exist in three dimensions) with only one side. A bottle with no inside and outside. A bit like the &lt;a href=&quot;https://en.wikipedia.org/wiki/M%C3%B6bius_strip&quot;&gt;Möbius strip&lt;/a&gt; has only one side.&lt;/p&gt;&lt;p&gt;In fact a Klein bottle can be made from two Möbius strips glued together along their edges. Unfortunately, that doesn&#39;t actually work in three dimensions so we&#39;re left with doing something called &quot;immersing&quot; the bottle in our three dimensional world.&lt;/p&gt;&lt;p&gt;The result is the bottle has to intersect itself. And that&#39;s what Cliff Stoll sells: immersions of Klein bottles in three dimensions. The real Klein bottle would need an extra dimension to not intersect itself. Here&#39;s my Acme Klein Bottle:&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUn4GP_thu9QY6vATo6fr7wJpGJoiAnFO1o8Ef0qNZ6pFyoCre2LrqTmwKiJm1S23u-ACP2keYHUsmASAVCRARoU7plviSUEIsNxNHbccKBxyM4Ov5XEkJLhyphenhyphen4I2D23sTBLnU7wnaLvfVSzZPXZZr1JoiJTkT6I76dtPxaeY51E_yZwib4j5RFjg/s3309/klein-1.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;3309&quot; data-original-width=&quot;2145&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUn4GP_thu9QY6vATo6fr7wJpGJoiAnFO1o8Ef0qNZ6pFyoCre2LrqTmwKiJm1S23u-ACP2keYHUsmASAVCRARoU7plviSUEIsNxNHbccKBxyM4Ov5XEkJLhyphenhyphen4I2D23sTBLnU7wnaLvfVSzZPXZZr1JoiJTkT6I76dtPxaeY51E_yZwib4j5RFjg/w414-h640/klein-1.jpg&quot; width=&quot;414&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;Cliff has &lt;a href=&quot;https://www.kleinbottle.com/whats_a_klein_bottle.htm&quot;&gt;a whole page&lt;/a&gt; describing the properties of a Klein Bottle. It&#39;s worth a read. Buying from Cliff is an experience in itself. Here&#39;s the packaging mine came in:&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaGdvQ8rNva9n8FhVc69v5I0gq0bjcAKS1VpLVkyoNtk58aqrT7t0Vxz4vRwBmmxTrQgVdcaCRbgo2IRapUglXh10zsmgtNgK3DLF4mm0fDfclOXD1fWSQiC99lylTdwOkg79VkrTH8CHYRnih4itTKzbCzE2nvTD1D5rkj3UObEvlipRD0r_-2g/s2989/1.jpeg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1999&quot; data-original-width=&quot;2989&quot; height=&quot;428&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaGdvQ8rNva9n8FhVc69v5I0gq0bjcAKS1VpLVkyoNtk58aqrT7t0Vxz4vRwBmmxTrQgVdcaCRbgo2IRapUglXh10zsmgtNgK3DLF4mm0fDfclOXD1fWSQiC99lylTdwOkg79VkrTH8CHYRnih4itTKzbCzE2nvTD1D5rkj3UObEvlipRD0r_-2g/w640-h428/1.jpeg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2Qz2olMfKIjous1YyCQyUmczPqywUNcBVoSn5BywW5hCj2-LxtZToZfHlakb_GtNkm3ejmz1bim9bdU8WhOatFrPqwbxGZNWm-wSf4Sjtll-cjqBePrHrk1Ee-_Nc-WOvRqXjtdpOtv3Gziz6upJVMGclQPmTCFq3MjgEDYGiho_WVOxRKg2-pg/s3417/2.jpeg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;2308&quot; data-original-width=&quot;3417&quot; height=&quot;432&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2Qz2olMfKIjous1YyCQyUmczPqywUNcBVoSn5BywW5hCj2-LxtZToZfHlakb_GtNkm3ejmz1bim9bdU8WhOatFrPqwbxGZNWm-wSf4Sjtll-cjqBePrHrk1Ee-_Nc-WOvRqXjtdpOtv3Gziz6upJVMGclQPmTCFq3MjgEDYGiho_WVOxRKg2-pg/w640-h432/2.jpeg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqeJR36T10S9LbdrulIwHtL9Mdx5ixV3u2DNYkr7wG3wvRNlPzT_p2xDLvAYeyI1GQOnLhHpROOaxlSMvs99FWo-3PtSbX3lEZMgi_ShFzwO-kOLrQtCBmBVV67DFA5Uq0dMX3wDrZKHV-SfqPqdKYbK9qyyaJnNnS6BGBY9r68WO9qFQgd2cwbg/s3166/5.jpeg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;2100&quot; data-original-width=&quot;3166&quot; height=&quot;424&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqeJR36T10S9LbdrulIwHtL9Mdx5ixV3u2DNYkr7wG3wvRNlPzT_p2xDLvAYeyI1GQOnLhHpROOaxlSMvs99FWo-3PtSbX3lEZMgi_ShFzwO-kOLrQtCBmBVV67DFA5Uq0dMX3wDrZKHV-SfqPqdKYbK9qyyaJnNnS6BGBY9r68WO9qFQgd2cwbg/w640-h424/5.jpeg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5-1bqhJSKD1EV4p60PllG0H4WW_fe4q0hjgyCvsq1DexCdkNKVPD0B89MD5mLzZ_LfJXiOIqbpxQx9m6JVRmQX-kQ6ttSiAbUoavAe_eTgyCEJ-okruPoWiXdvKyZiOWt9KmTD2mVuXX9nM6IfFg2bDQVm0tH47xovNQLn-KBxFpYapvjTStI0Q/s3111/6.jpeg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;2125&quot; data-original-width=&quot;3111&quot; height=&quot;438&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5-1bqhJSKD1EV4p60PllG0H4WW_fe4q0hjgyCvsq1DexCdkNKVPD0B89MD5mLzZ_LfJXiOIqbpxQx9m6JVRmQX-kQ6ttSiAbUoavAe_eTgyCEJ-okruPoWiXdvKyZiOWt9KmTD2mVuXX9nM6IfFg2bDQVm0tH47xovNQLn-KBxFpYapvjTStI0Q/w640-h438/6.jpeg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;Plus it comes with a free slide rule (every detail of every document included is worth reading):&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizANwZNwKGBeEYNMjP66mwT4toeyBI0SnpGjeqmCSfwwbPRd9cj7yYs1I69ZOIyLg9rv8AqmKrTZGfCYlrN7CL_5zbY39nkGy2OGzm4u2GSb8ds3O95_CY5-UG5ZHWuqdFFFYwQiB6gBTkRdenGuuKvvihedQYaDba72GURipBhuhktj3hgayD5g/s3713/klein-2.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;3713&quot; data-original-width=&quot;2817&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizANwZNwKGBeEYNMjP66mwT4toeyBI0SnpGjeqmCSfwwbPRd9cj7yYs1I69ZOIyLg9rv8AqmKrTZGfCYlrN7CL_5zbY39nkGy2OGzm4u2GSb8ds3O95_CY5-UG5ZHWuqdFFFYwQiB6gBTkRdenGuuKvvihedQYaDba72GURipBhuhktj3hgayD5g/w486-h640/klein-2.jpg&quot; width=&quot;486&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;Inspection report:&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjx24K8Q2Tqs92-IiqqPLc-U5xDRVhCs9vA3T57v1foXp6Zb3lxx-P3H4iVlfxkiXVtFThQhyphenhyphenC2ZWAKG1CPBdzxFEAhyphenhyphenj6RuOsgTTxZkIHKj8hKFpTQtEBh-kk8B8k5ooklp_MnObpg0oI46V4Lxhiv-Qu5nQon7RGXak1Rq-LivfD0rjNOzWp1nA/s3577/klein-3.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;3577&quot; data-original-width=&quot;2838&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjx24K8Q2Tqs92-IiqqPLc-U5xDRVhCs9vA3T57v1foXp6Zb3lxx-P3H4iVlfxkiXVtFThQhyphenhyphenC2ZWAKG1CPBdzxFEAhyphenhyphenj6RuOsgTTxZkIHKj8hKFpTQtEBh-kk8B8k5ooklp_MnObpg0oI46V4Lxhiv-Qu5nQon7RGXak1Rq-LivfD0rjNOzWp1nA/w508-h640/klein-3.jpg&quot; width=&quot;508&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;Safety instructions:&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhubiVSlEn7l9l56F4DYVLPFe-_ryfRHcWhiIs7W48ggdeGcf6Fewh73igMJ9BxgHKayXY8ze4TjZDJqD8O54N60xOWaT_et3LeBLY48uOYXWiPeJmhyATxuYYo2oJMUvuB8UEOqgf2lzfuxtlYiD0t-ysrFooywOiNGW-SR2s_STZHrXn_q955mg/s3653/klein-4.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;3653&quot; data-original-width=&quot;2842&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhubiVSlEn7l9l56F4DYVLPFe-_ryfRHcWhiIs7W48ggdeGcf6Fewh73igMJ9BxgHKayXY8ze4TjZDJqD8O54N60xOWaT_et3LeBLY48uOYXWiPeJmhyATxuYYo2oJMUvuB8UEOqgf2lzfuxtlYiD0t-ysrFooywOiNGW-SR2s_STZHrXn_q955mg/w498-h640/klein-4.jpg&quot; width=&quot;498&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;For best results, avoid doing stupid things.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6fSCT-KO4GUrEA6pFS4FG5_OhphSUEFZjDOiq0cqZFJSplOnr2IX6Z3ybvqThyphenhyphen4Z54RTdsfQP9izT5BxurLK31JT3gQMMvX2X8fOa7Ky4CHf2j441VVpvZtAxWIGwQt65NXpAcNFBJHPjmxbGmhZEJzcLpYiMm6iCxo3cTSc7vdZlHVC_tKNhJA/s3743/klein-5.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;3743&quot; data-original-width=&quot;2883&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6fSCT-KO4GUrEA6pFS4FG5_OhphSUEFZjDOiq0cqZFJSplOnr2IX6Z3ybvqThyphenhyphen4Z54RTdsfQP9izT5BxurLK31JT3gQMMvX2X8fOa7Ky4CHf2j441VVpvZtAxWIGwQt65NXpAcNFBJHPjmxbGmhZEJzcLpYiMm6iCxo3cTSc7vdZlHVC_tKNhJA/w492-h640/klein-5.jpg&quot; width=&quot;492&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;And there are some stickers, and a graduated scale you can add to the bottle (plus Cliff threw in a punched card to use as a bookmark):&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTo66hRgVGpOdNi9ELUbMiOVdZkrh9sR2rX8-7cB0nNWgDmS9iPHiesU7448ElLCWwcEzapsiml0ejXGAmYxX4CDjWOco6HJPbJchLX6yIE7-T_gLKePCsmr3n9bbdQn-qHbjHplPE8rBkupWKkhuxLPxLUJVL7obSNxL6rRkKOiRgLXWg-gw9ng/s3577/klein-6.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;3577&quot; data-original-width=&quot;2904&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTo66hRgVGpOdNi9ELUbMiOVdZkrh9sR2rX8-7cB0nNWgDmS9iPHiesU7448ElLCWwcEzapsiml0ejXGAmYxX4CDjWOco6HJPbJchLX6yIE7-T_gLKePCsmr3n9bbdQn-qHbjHplPE8rBkupWKkhuxLPxLUJVL7obSNxL6rRkKOiRgLXWg-gw9ng/w520-h640/klein-6.jpg&quot; width=&quot;520&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;So, if like me you were tired of the Möbius strip being the only &lt;a href=&quot;https://en.wikipedia.org/wiki/Orientability&quot;&gt;non-orientable surface&lt;/a&gt; you have in your home, rush over to Acme Klein Bottle and peruse the fine selection of bottles, large and klein, at &lt;a href=&quot;https://www.kleinbottle.com/&quot;&gt;Acme Klein Bottle&lt;/a&gt;.&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;I haven&#39;t described all that comes in the package, or what communication with Cliff via email is like. But if you want an experience that ends with a Klein bottle in your home, buy one.&lt;/div&gt;</content>
        <link rel="replies" type="application/atom+xml" href="http://blog.jgc.org/feeds/6321735604645731335/comments/default" title="Post Comments"/>
        <link rel="replies" type="text/html" href="http://www.blogger.com/comment/fullpage/post/19303585/6321735604645731335" title="2 Comments"/>
        <link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19303585/posts/default/6321735604645731335"/>
        <link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19303585/posts/default/6321735604645731335"/>
        <link rel="alternate" type="text/html" href="http://blog.jgc.org/2024/03/the-acme-klein-bottle-from-cliff-stoll.html" title="The Acme Klein Bottle (from Cliff Stoll and family)"/>
        <author>
            <name>Unknown</name>
            <email>[email protected]</email>
            <gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="https://img1.blogblog.com/img/b16-rounded.gif"/>
        </author>
        <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUn4GP_thu9QY6vATo6fr7wJpGJoiAnFO1o8Ef0qNZ6pFyoCre2LrqTmwKiJm1S23u-ACP2keYHUsmASAVCRARoU7plviSUEIsNxNHbccKBxyM4Ov5XEkJLhyphenhyphen4I2D23sTBLnU7wnaLvfVSzZPXZZr1JoiJTkT6I76dtPxaeY51E_yZwib4j5RFjg/s72-w414-h640-c/klein-1.jpg" height="72" width="72"/>
        <thr:total>2</thr:total>
    </entry>
    <entry>
        <id>tag:blogger.com,1999:blog-19303585.post-1960659042426703991</id>
        <published>2024-02-13T14:05:00.014+00:00</published>
        <updated>2024-02-14T08:24:05.461+00:00</updated>
        <category scheme="http://www.blogger.com/atom/ns#" term="pseudo-randomness"/>
        <title type="text">The original WWW proposal is a Word for Macintosh 4.0 file from 1990, can we open it?</title>
        <content type="html">&lt;p&gt;The W3C has a page with the &lt;a href=&quot;https://www.w3.org/History/1989/proposal.html&quot;&gt;original WWW proposal&lt;/a&gt; from Tim Berners-Lee. One of the downloads says&amp;nbsp;&lt;/p&gt;&lt;ul style=&quot;color: #302005;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://www.w3.org/History/1989/proposal&quot;&gt;The original document file (I think - I can&#39;t test it)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span style=&quot;color: #302005;&quot;&gt;The &quot;I can&#39;t test it&quot; made me sad. There are two other files (an RTF version and an HTML version generated in 1998 from the original file). But can we open the original document?&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #302005;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #302005;&quot;&gt;The original document is 68,608 bytes and &lt;span style=&quot;font-family: courier;&quot;&gt;file&lt;/span&gt; on my Mac says it&#39;s a&amp;nbsp;&lt;span style=&quot;font-family: courier;&quot;&gt;Microsoft Word for Macintosh 4.0&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt; file&lt;/span&gt;. That matches with TBL&#39;s note on the W3C page saying: &quot;A hand conversion to HTML of the original MacWord (or Word for Mac?) document written in March 1989 and later redistributed unchanged apart from the date added in May 1990.&quot;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #302005;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #302005;&quot;&gt;Microsoft Office for Mac came out in 1989 with System 6.0. That was Microsoft Word 4.0 so we&#39;re looking for compatibility with Microsoft Word for Macintosh 4.0. Let&#39;s see what modern software can open this. What I really want to be able to do is open it and convert it to, say, PDF with high fidelity.&lt;/span&gt;&lt;/div&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;color: #302005;&quot;&gt;Microsoft Word&lt;/span&gt;&lt;/h2&gt;&lt;div&gt;&lt;span style=&quot;color: #302005;&quot;&gt;Let&#39;s begin with Microsoft Word itself. I uploaded the file to Microsoft OneDrive with the extension .doc and clicked on it to open it in Microsoft Word.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #302005;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivCGzwNqeNyN4mZPNF593LeO14xECSZPabgJK43_trMY-NNlDrGrUYeGPAQ11lVk4vmh8o9U05sPW7xIYx1vDLIGDQWHFo9x6gEwqkvA3JzPkmLhyVS8HGHSCRXqH-yQXFo3Q9qxsje_rF5Vuzzm1YfxlIU2mlCXEvjDJ1ebeSl8G6gDD9zJ7iRA/s1358/proposal-1.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;524&quot; data-original-width=&quot;1358&quot; height=&quot;246&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivCGzwNqeNyN4mZPNF593LeO14xECSZPabgJK43_trMY-NNlDrGrUYeGPAQ11lVk4vmh8o9U05sPW7xIYx1vDLIGDQWHFo9x6gEwqkvA3JzPkmLhyVS8HGHSCRXqH-yQXFo3Q9qxsje_rF5Vuzzm1YfxlIU2mlCXEvjDJ1ebeSl8G6gDD9zJ7iRA/w640-h246/proposal-1.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;h2 style=&quot;clear: both; text-align: left;&quot;&gt;Apple Pages&lt;/h2&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;I switched to the Mac and hoped that Apple Pages might understand an old Microsoft Word for Macintosh file. No such luck.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisHsxI8gafx3rr9vSA7jui-HrzV_8CQYERBqT-6gQJwr1QbIiaIzYedxMRkiULhHaDkE8f0Lc7F-9erQ620RSRR_9e0qgX2tqoN1cxfScEwu7zzk2XO4LFiHAUbdOnvnRQNUGp8jt_p0r8cfiTw84qyH1JKCUFGK7-WQD2A2SqIYNA8BVCM_iSZw/s744/proposal-2.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;664&quot; data-original-width=&quot;744&quot; height=&quot;358&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisHsxI8gafx3rr9vSA7jui-HrzV_8CQYERBqT-6gQJwr1QbIiaIzYedxMRkiULhHaDkE8f0Lc7F-9erQ620RSRR_9e0qgX2tqoN1cxfScEwu7zzk2XO4LFiHAUbdOnvnRQNUGp8jt_p0r8cfiTw84qyH1JKCUFGK7-WQD2A2SqIYNA8BVCM_iSZw/w400-h358/proposal-2.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;h2 style=&quot;clear: both; text-align: left;&quot;&gt;Apache OpenOffice&lt;/h2&gt;&lt;div&gt;&lt;div&gt;Next let&#39;s hope open source software will come to the rescue. I downloaded the latest Apache OpenOffice and it did open the file but the formatting is gone and the diagrams are missing.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8eASEUl_mTNLs2hF2Fi-omu_5WvEjHONP_sAi8Wwn5R5GO0gciGwx7E-TySj-NUiz-xFxQ0XjDgRMcvKtJFPP6MLWOcwwBwBrpG50e2f8m3ld6eD23Afq-kCRT4Eb9_K4W_j1OaqeWP9aOYnIY7uaJ0E3iWyH2xXnSDL2UJF5TSI_zhKa_fI6CQ/s2652/proposal-3.png&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1920&quot; data-original-width=&quot;2652&quot; height=&quot;464&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8eASEUl_mTNLs2hF2Fi-omu_5WvEjHONP_sAi8Wwn5R5GO0gciGwx7E-TySj-NUiz-xFxQ0XjDgRMcvKtJFPP6MLWOcwwBwBrpG50e2f8m3ld6eD23Afq-kCRT4Eb9_K4W_j1OaqeWP9aOYnIY7uaJ0E3iWyH2xXnSDL2UJF5TSI_zhKa_fI6CQ/w640-h464/proposal-3.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;LibreOffice&lt;/h2&gt;&lt;div&gt;OK, maybe I need different open source software, so I switched to the latest &lt;a href=&quot;https://www.libreoffice.org/&quot;&gt;LibreOffice&lt;/a&gt; and it opened it. And the diagrams are crisp! Although there&#39;s something weird about the margins and there are other formatting problems.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMG83H6sPE9zk7abtg9woYAM6ryYid5DOmz_yegn0x7U_B5rkalViax7vrgAI2b6Zy9dD39gsMjBwmMhMMlefWQu0DfdT9ELMSlFcNFKh2DNRr7KsKMGwJgGmXUvhXiEd_OrE93V99yBr6c4WMS7Ak_7W0DSH5ezoYX3ob1gut5Nhd0XDyp63szA/s2644/proposal-4.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;2158&quot; data-original-width=&quot;2644&quot; height=&quot;522&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMG83H6sPE9zk7abtg9woYAM6ryYid5DOmz_yegn0x7U_B5rkalViax7vrgAI2b6Zy9dD39gsMjBwmMhMMlefWQu0DfdT9ELMSlFcNFKh2DNRr7KsKMGwJgGmXUvhXiEd_OrE93V99yBr6c4WMS7Ak_7W0DSH5ezoYX3ob1gut5Nhd0XDyp63szA/w640-h522/proposal-4.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;&lt;br /&gt;&lt;/h2&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;CERN PDF&lt;/h2&gt;&lt;div&gt;CERN makes available &lt;a href=&quot;https://cds.cern.ch/record/369245/files/dd-89-001.pdf&quot;&gt;a PDF version&lt;/a&gt; of the proposal which was apparently created in 1998 using&amp;nbsp;Acrobat Distiller Daemon 2.1 for SunOS/Solaris (SPARC). It has 20 pages. The LibreOffice imported version has 24 pages.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To get an overview of what&#39;s different I created a PDF from the LibreOffice version and then looked at it and the CERN PDF in the contact sheet version in Apple Preview.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here&#39;s the CERN PDF:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtmLx2yw7hBNA1hZ0YGxlcvJee0qSv5IoSm6ytWun-nEFw7z-5yWT0Ckc7pzcW6SGZl72nM-jYZUbV5ZUhUlfrGjYWcmz6HVD_p6XI1bEegfQucRbHhjfaPwnlz4mH_V-ANzeCzsMNDX8Fr5vsBpTi8oY1M-zCB26mlpsvCwdUzWXGi9mSNUfBrg/s2444/proposal-5.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;700&quot; data-original-width=&quot;2444&quot; height=&quot;184&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtmLx2yw7hBNA1hZ0YGxlcvJee0qSv5IoSm6ytWun-nEFw7z-5yWT0Ckc7pzcW6SGZl72nM-jYZUbV5ZUhUlfrGjYWcmz6HVD_p6XI1bEegfQucRbHhjfaPwnlz4mH_V-ANzeCzsMNDX8Fr5vsBpTi8oY1M-zCB26mlpsvCwdUzWXGi9mSNUfBrg/w640-h184/proposal-5.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here&#39;s the LibreOffice-generated PDF:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKTElIxIWy-jOHKCzOuLo8pd1rk_9ChaGL93vgNMElSsu9eRgIh_LHJ3yDVXzOvHFfF5iDEwRoPMH_Dyeuk1HNcB5K6wZOKu229VWK7kNpvpgGMXF7oekB5C-O4sRxK9fRPFTxSqEj8u3fUH7t9p8Un9on_hKu8sh0vliaQ98GRtp-TYRrrQ2PYQ/s2444/proposal-6.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1052&quot; data-original-width=&quot;2444&quot; height=&quot;276&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKTElIxIWy-jOHKCzOuLo8pd1rk_9ChaGL93vgNMElSsu9eRgIh_LHJ3yDVXzOvHFfF5iDEwRoPMH_Dyeuk1HNcB5K6wZOKu229VWK7kNpvpgGMXF7oekB5C-O4sRxK9fRPFTxSqEj8u3fUH7t9p8Un9on_hKu8sh0vliaQ98GRtp-TYRrrQ2PYQ/w640-h276/proposal-6.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Things that are different:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1. The right-hand margin is missing in the LibreOffice version.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;2. The LibreOffice version is using 14 pt vs. 12 pt for most of the text.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;3. The LibreOffice version has turned headers with TBL&#39;s initials in them into footers.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;4. The page breaks look in the right places (see how the images are correctly placed towards the end); thus it&#39;s probably the font size that&#39;s the biggest problem.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;5. There CERN PDF has a space under the heading and the LibreOffice version does not.&lt;/div&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Emulation&lt;/h2&gt;&lt;div&gt;To make sure that I knew what the actual original document looked like I decided to use &lt;a href=&quot;https://infinitemac.org/1990/System%206.0.5&quot;&gt;Infinite Mac&lt;/a&gt; to boot a 1990-era Macintosh and run actual Word for Macintosh 4.0 on the original document.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiijOiXeCEF_J1oTZBDun1YT3lye7507nTXRpEAUjYW6CQOVFhI6Qb1jGJhDgAJeOEA1BwmDFLqPYnq25JSXaK5zw2oZOFBTvZiVqmNfhf8Vfp4UYQ_HwJzIKuC_a3kAfvGNhR3U6rSlB77KUFilVUX2lVL7SKnnaQU4ZHkwilImtVFGqKak4kG1w/s1411/proposal-9.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1081&quot; data-original-width=&quot;1411&quot; height=&quot;490&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiijOiXeCEF_J1oTZBDun1YT3lye7507nTXRpEAUjYW6CQOVFhI6Qb1jGJhDgAJeOEA1BwmDFLqPYnq25JSXaK5zw2oZOFBTvZiVqmNfhf8Vfp4UYQ_HwJzIKuC_a3kAfvGNhR3U6rSlB77KUFilVUX2lVL7SKnnaQU4ZHkwilImtVFGqKak4kG1w/w640-h490/proposal-9.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;That way I can see actual fonts, font sizes and layout to confirm how the document should have looked. And that&#39;s where it became obvious that the original document on the original Mac and the CERN PDF are quite different. The CERN PDF has 20 pages. On the Mac running Word for Macintosh 4.0 with A4 paper it has 22 pages. So I decided to aim to get us close to the original document on the Mac.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjM3_thqxV_ZB-VqLJRytn7oA8LbAMlQ2a3kRZrubYhWt4M8ns2R-3nHFXFG-367BDUJQkHtLO6oqFNrZWGXhwlQfarVp_ih1SDBgBWsWGBKqKmZUYD51WLmLIGCQ1no0EcAPeTidkHBb52Y-EY7AXYnBX9nll33G7FuZofLN9XgpD0bWak-T1ONQ/s1389/proposal-10.png&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1062&quot; data-original-width=&quot;1389&quot; height=&quot;490&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjM3_thqxV_ZB-VqLJRytn7oA8LbAMlQ2a3kRZrubYhWt4M8ns2R-3nHFXFG-367BDUJQkHtLO6oqFNrZWGXhwlQfarVp_ih1SDBgBWsWGBKqKmZUYD51WLmLIGCQ1no0EcAPeTidkHBb52Y-EY7AXYnBX9nll33G7FuZofLN9XgpD0bWak-T1ONQ/w640-h490/proposal-10.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;div&gt;&lt;span style=&quot;color: #302005;&quot;&gt;So... set to A4 paper and set right margin to same size as left margin. Change the first page format to be different since it doesn&#39;t have the same gutters, footers or headers.&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #302005;&quot;&gt;Manually change the body text from 14 pt (and other sizes) to 12 pt. Manually deal with text that breaks across pages incorrectly and other alignment problems. Fix the footer that should be a header.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #302005;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #302005;&quot;&gt;In the end I got pretty close to what&#39;s visible on the Mac.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #302005;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOA-gPDF3aSCcLgZumx8lW7yXDF34EKE6VIUUcyp7etjaA66vInZOvD7Dxa3DPBGQmKbKlTQQxThHv48XrTdcTWaaLYEacOYAvk2J0qLfEPLOeUWiii286namyfei9NHd2F3pokvQoOEFrRhxWnHi254ONzTxfgFhKMBr6mFcXOcSu7U2DgkIMWQ/s2408/proposal-11.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1040&quot; data-original-width=&quot;2408&quot; height=&quot;276&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOA-gPDF3aSCcLgZumx8lW7yXDF34EKE6VIUUcyp7etjaA66vInZOvD7Dxa3DPBGQmKbKlTQQxThHv48XrTdcTWaaLYEacOYAvk2J0qLfEPLOeUWiii286namyfei9NHd2F3pokvQoOEFrRhxWnHi254ONzTxfgFhKMBr6mFcXOcSu7U2DgkIMWQ/w640-h276/proposal-11.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;h2&gt;Conclusion&lt;/h2&gt;&lt;/div&gt;&lt;div&gt;Converting this document from its original format was a bit of a victory for open source software. And a lesson in how hard document preservation is. To help preserve it a bit, and in an open format, I&#39;ve uploaded my .odt version to GitHub &lt;a href=&quot;https://github.com/jgrahamc/www-proposal&quot;&gt;here&lt;/a&gt;. It&#39;s interesting, and a little disheartening to see that this 34 year old document is difficult to open, and even when opened the resulting output isn&#39;t exactly the same as the original.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;PS If you&#39;re wondering why I ever started this project. I just wanted a high quality version of the diagrams in the original proposal for a presentation. Took me a lot longer than I thought it would.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;PPS A &lt;a href=&quot;https://news.ycombinator.com/item?id=39358074&quot;&gt;comment&lt;/a&gt; on Hacker News pointed out that I could probably either create a PostScript file or a PDF via an emulated Mac. I was able to boot another Mac (System 7) that had Word from 1992 and Print2PDF (a driver that creates a printer that makes a PDF file) and print directly from Word for Macintosh 5.1a.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgx49b2BxnfgvZQp6amCJ3JWT_B0Fcgyv-hz6O4rG0vxhImvBWk_3WvYJhFcv6rwE45ySKg1GBJchujq4AJE2s8emtZm8B1YuwmXtEeCAE6m4wRhjQxnCrHRZ1XRTJK4CwjZJy9xsYQIH2ZFHEpRUzrMynlP2QddrGZl6ol5YJIRWA-xjRHY97jow/s1969/proposal-12.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1573&quot; data-original-width=&quot;1969&quot; height=&quot;512&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgx49b2BxnfgvZQp6amCJ3JWT_B0Fcgyv-hz6O4rG0vxhImvBWk_3WvYJhFcv6rwE45ySKg1GBJchujq4AJE2s8emtZm8B1YuwmXtEeCAE6m4wRhjQxnCrHRZ1XRTJK4CwjZJy9xsYQIH2ZFHEpRUzrMynlP2QddrGZl6ol5YJIRWA-xjRHY97jow/w640-h512/proposal-12.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;I&#39;ve added the generated PDF file to the GitHub. This version has 20 pages and the fonts are different but it does meet my original requirement of a PDF.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;PPPS A Hacker News &lt;a href=&quot;https://news.ycombinator.com/item?id=39363611&quot;&gt;comment&lt;/a&gt; links to another conversion done using different versions of Word and bit of fiddling around to get a really nice version of the document in modern formats.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;</content>
        <link rel="replies" type="application/atom+xml" href="http://blog.jgc.org/feeds/1960659042426703991/comments/default" title="Post Comments"/>
        <link rel="replies" type="text/html" href="http://www.blogger.com/comment/fullpage/post/19303585/1960659042426703991" title="18 Comments"/>
        <link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19303585/posts/default/1960659042426703991"/>
        <link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19303585/posts/default/1960659042426703991"/>
        <link rel="alternate" type="text/html" href="http://blog.jgc.org/2024/02/the-original-www-proposal-is-word-for.html" title="The original WWW proposal is a Word for Macintosh 4.0 file from 1990, can we open it?"/>
        <author>
            <name>Unknown</name>
            <email>[email protected]</email>
            <gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="https://img1.blogblog.com/img/b16-rounded.gif"/>
        </author>
        <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivCGzwNqeNyN4mZPNF593LeO14xECSZPabgJK43_trMY-NNlDrGrUYeGPAQ11lVk4vmh8o9U05sPW7xIYx1vDLIGDQWHFo9x6gEwqkvA3JzPkmLhyVS8HGHSCRXqH-yQXFo3Q9qxsje_rF5Vuzzm1YfxlIU2mlCXEvjDJ1ebeSl8G6gDD9zJ7iRA/s72-w640-h246-c/proposal-1.png" height="72" width="72"/>
        <thr:total>18</thr:total>
    </entry>
    <entry>
        <id>tag:blogger.com,1999:blog-19303585.post-2834485746776529070</id>
        <published>2024-02-04T20:52:00.005+00:00</published>
        <updated>2024-02-04T22:41:36.150+00:00</updated>
        <category scheme="http://www.blogger.com/atom/ns#" term="hardware"/>
        <category scheme="http://www.blogger.com/atom/ns#" term="pseudo-randomness"/>
        <title type="text">Repairing (sort of) a Dyson fan remote control</title>
        <content type="html">&lt;p&gt;I have a couple of fancy Dyson fans that do cooling (or at least blowing air around) and heating. They use a little IR remote control that attaches to the top with magnets. One of the remotes decided to stop working; its failure mode was: consume an entire CR2032 battery in a few days. Apparently, &lt;a href=&quot;https://www.reddit.com/r/dyson/comments/f5rt1m/dyson_am09_remote_control_battery_needs_replacing/&quot;&gt;I&#39;m not alone&lt;/a&gt; in experiencing this problem.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJwRJuZfFNpzHSiOsaj1oEyeiKLlTMBb3No8S26vg7rgvVlER-6mdNJE_e8_GWZmsQyA-xohZphLvFttRmdjbYbBJoOv0gnXdT2Kj98pza7ayVkyh5kFp_quzbjcx0vJmTk3aQ0o0h_r5bY8C6IsQq5YOeaHwx-z6pKWJZL-uIDDmwwEZJgTaV8g/s496/dyson-8.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;355&quot; data-original-width=&quot;496&quot; height=&quot;286&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJwRJuZfFNpzHSiOsaj1oEyeiKLlTMBb3No8S26vg7rgvVlER-6mdNJE_e8_GWZmsQyA-xohZphLvFttRmdjbYbBJoOv0gnXdT2Kj98pza7ayVkyh5kFp_quzbjcx0vJmTk3aQ0o0h_r5bY8C6IsQq5YOeaHwx-z6pKWJZL-uIDDmwwEZJgTaV8g/w400-h286/dyson-8.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;Before seeing if I could repair it, I made a backup of the IR codes from the remote using my Flipper Zero:&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgOMLvNXN1CihUrjCQGB7q9M5h9TaKQbjZapuTyFHh6ad4OwYW4a48HQ722IoDnhVmGWvv1mMqRHXD77wGiEH1ysgTzR8aQISRMI3-R2ewjj7MNqdS7prkG552uMVOpsM5H6ieLoPnR9m61AnEuhpB-CbOVsSYuGoT7lYlzDsGPg30ZoNQhP_RaQ/s750/dyson-7.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;350&quot; data-original-width=&quot;750&quot; height=&quot;186&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgOMLvNXN1CihUrjCQGB7q9M5h9TaKQbjZapuTyFHh6ad4OwYW4a48HQ722IoDnhVmGWvv1mMqRHXD77wGiEH1ysgTzR8aQISRMI3-R2ewjj7MNqdS7prkG552uMVOpsM5H6ieLoPnR9m61AnEuhpB-CbOVsSYuGoT7lYlzDsGPg30ZoNQhP_RaQ/w400-h186/dyson-7.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;Dyson were good enough to replace the remote but I began to wonder why this was happening and so I opened it. Here&#39;s the little circuit board inside. The pads are the underside of the buttons.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh92uQYxF5oL0ncvi2wKle1f9DpkWeVp9pn507Nzcjhr4g669-VZx25DWj9H8Z6yCW4B7KZmGG37msYSr-lX_z6HHHFzhULOPF0h0ydeJn_RPKbPtID3GPcD9oOhTecJklgQCfH88roqd5yNYiKLpZt-Yfc3fVJPk-F34D8h2488OFjlgD24bPJVw/s3463/dyson-1.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;3463&quot; data-original-width=&quot;1561&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh92uQYxF5oL0ncvi2wKle1f9DpkWeVp9pn507Nzcjhr4g669-VZx25DWj9H8Z6yCW4B7KZmGG37msYSr-lX_z6HHHFzhULOPF0h0ydeJn_RPKbPtID3GPcD9oOhTecJklgQCfH88roqd5yNYiKLpZt-Yfc3fVJPk-F34D8h2488OFjlgD24bPJVw/w288-h640/dyson-1.jpg&quot; width=&quot;288&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEju16NBKQgWeraenUz0Tm4RnoNHLcW67OANzCRdl4C_cOdcZq8WHn0iu0H8fa96GnNjnBMTiJWefRq1VW020LDli1UUuLuIs4JL7ZgLP-3i5MvT9xIrlvlzYQgZ5X66CxjxFSMcO1QL0lD3Z5rw3tJa20KsRR2pXTenvnRcw0Ec1LpU2nW31IbT1Q/s3161/dyson-2.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;3161&quot; data-original-width=&quot;1266&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEju16NBKQgWeraenUz0Tm4RnoNHLcW67OANzCRdl4C_cOdcZq8WHn0iu0H8fa96GnNjnBMTiJWefRq1VW020LDli1UUuLuIs4JL7ZgLP-3i5MvT9xIrlvlzYQgZ5X66CxjxFSMcO1QL0lD3Z5rw3tJa20KsRR2pXTenvnRcw0Ec1LpU2nW31IbT1Q/w256-h640/dyson-2.jpg&quot; width=&quot;256&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;Using a multimeter I discovered that the resistance across the battery terminals was 2.5kΩ when I was expecting it to be very, very high or even infinite.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmXInq3B_Bdg9aoUOymUFK1uQl_jXXztK4-6-Xfe774nkNJNxWifQdw2UnSFS5tGxZ7VxWDg3ocMhw2DuFndPfkMykaf-fP29ibzd5R_gnGb_GJMq8eimYwwUgWl_Ebu-b6GPzmQai4ryOCqGn6FcJryUR97xblrZ_5F0yInG_RfK7gDgWT_a2YA/s1738/dyson-3.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1641&quot; data-original-width=&quot;1738&quot; height=&quot;378&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmXInq3B_Bdg9aoUOymUFK1uQl_jXXztK4-6-Xfe774nkNJNxWifQdw2UnSFS5tGxZ7VxWDg3ocMhw2DuFndPfkMykaf-fP29ibzd5R_gnGb_GJMq8eimYwwUgWl_Ebu-b6GPzmQai4ryOCqGn6FcJryUR97xblrZ_5F0yInG_RfK7gDgWT_a2YA/w400-h378/dyson-3.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;And that the remote control was drawing 1.1mA when doing nothing.&amp;nbsp;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDevJLZYjCVQ2xHp764sFp4A1mWpsTgryeH-mXsTu1PV-i00a9xmdl2Tyr5n89tibrYpVJW6s7EyaWkSUHhyphenhyphenDVOFFvo33vdgk0VIQhuJ3aG2MyJv0pt1kONR23C4FchUT5eKBGJMJ9C4AaiM0hCVBp0eaCD1-Ee_Oi0rZVSFqlkTcBoTyAKW5HIg/s1375/dyson-4.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1065&quot; data-original-width=&quot;1375&quot; height=&quot;310&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDevJLZYjCVQ2xHp764sFp4A1mWpsTgryeH-mXsTu1PV-i00a9xmdl2Tyr5n89tibrYpVJW6s7EyaWkSUHhyphenhyphenDVOFFvo33vdgk0VIQhuJ3aG2MyJv0pt1kONR23C4FchUT5eKBGJMJ9C4AaiM0hCVBp0eaCD1-Ee_Oi0rZVSFqlkTcBoTyAKW5HIg/w400-h310/dyson-4.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;A quick check of Ohm&#39;s law gives I = V/R, I = 3V/2500Ω, I = 1.2mA. Close enough.&amp;nbsp;&lt;/p&gt;&lt;p&gt;The capacity of a CR2032 battery varies a lot from manufacturer to manufacturer but seems to be between 150mAh and 250mAh (roughly). At 1.2mA constant current that&#39;s between 125h and 208h to drain the battery (about 5 to 7 days).&amp;nbsp;&lt;/p&gt;&lt;p&gt;But why was there 2.5kΩ across the battery? The culprit is the capacitor C1 which is in parallel with the CR2032. It&#39;s decided that it would prefer to be a resistor! Sometimes capacitors fail like this.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBF9m6Ss1Ai5TWar2eHt1gIf_XzQwFiVAYHQ8qv4Y9xqwa57A2qX1pQu9sx8XJDSL2JVjVI2qtIgxilfAdMY3E_olJOxhx-suFtMVkCumsPlDdOrseh33P1toyU8cekxfj5CmZwVrFNHcHjuOPvAbcmK7pOQsDh2UWmmI5sJIiw5Nj-mYrJYFOhg/s2156/dyson-5.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1631&quot; data-original-width=&quot;2156&quot; height=&quot;303&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBF9m6Ss1Ai5TWar2eHt1gIf_XzQwFiVAYHQ8qv4Y9xqwa57A2qX1pQu9sx8XJDSL2JVjVI2qtIgxilfAdMY3E_olJOxhx-suFtMVkCumsPlDdOrseh33P1toyU8cekxfj5CmZwVrFNHcHjuOPvAbcmK7pOQsDh2UWmmI5sJIiw5Nj-mYrJYFOhg/w400-h303/dyson-5.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;Aside: why is there a capacitor in parallel with the battery? Almost certainly because it&#39;s the capacitor that powers the remote when a button is pressed. Most of the time no button is pressed and the capacitor will sit charged fully. When a button is pressed a load is applied to the battery/capacitor combination and it&#39;s the capacitor which will provide the needed current. This will likely prolong the life of the battery as it will slowly charge a capacitor and not have to provide a sudden larger current when a button is pressed.&lt;/p&gt;&lt;p&gt;I didn&#39;t have a spare surface mount capacitor around so I simply removed C1. With C1 removed there&#39;s no current drain when idle and the remote works fine. Unfortunately, Dyson didn&#39;t design the remote to be opened and so the case didn&#39;t survive. Also, I&#39;m sure I&#39;ve shortened the life of the CR2032 battery by removing C1, but at least it&#39;ll last longer than a week!&lt;/p&gt;&lt;p&gt;I fixed the remote up so I could use it by printing a picture of what it should look like and taping the paper into place. You may also notice the small felt pad. That&#39;s there to &lt;strike&gt;make it pleasant to hold&lt;/strike&gt;&amp;nbsp;prevent you from being stabbed by the mechanism that connects to the +ve terminal of the battery.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiPD5Pc0lNO5k1leWW9TskgjjvhxQLRm1CofXGZLi6V6LXCwp12uhxHKcmMhk44jZ-jrsqdE0wIs-nkUm5cD1F_kiPYjmhkKACJh-3Slmf154b57HVrNwb9sl4YxZv6T612YjL-jODfgy45SILV7MF4VP65xSGo3frwvnWrmU37QP2QQBFhy4SjxQ/s3078/dyson-9.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;3078&quot; data-original-width=&quot;1255&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiPD5Pc0lNO5k1leWW9TskgjjvhxQLRm1CofXGZLi6V6LXCwp12uhxHKcmMhk44jZ-jrsqdE0wIs-nkUm5cD1F_kiPYjmhkKACJh-3Slmf154b57HVrNwb9sl4YxZv6T612YjL-jODfgy45SILV7MF4VP65xSGo3frwvnWrmU37QP2QQBFhy4SjxQ/w261-h640/dyson-9.jpg&quot; width=&quot;261&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;As good as new! Or at least it works and I can keep using the fan until the replacement Dyson is sending arrives.&lt;/div&gt;</content>
        <link rel="replies" type="application/atom+xml" href="http://blog.jgc.org/feeds/2834485746776529070/comments/default" title="Post Comments"/>
        <link rel="replies" type="text/html" href="http://www.blogger.com/comment/fullpage/post/19303585/2834485746776529070" title="3 Comments"/>
        <link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19303585/posts/default/2834485746776529070"/>
        <link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19303585/posts/default/2834485746776529070"/>
        <link rel="alternate" type="text/html" href="http://blog.jgc.org/2024/02/repairing-sort-of-dyson-fan-remote.html" title="Repairing (sort of) a Dyson fan remote control"/>
        <author>
            <name>Unknown</name>
            <email>[email protected]</email>
            <gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="https://img1.blogblog.com/img/b16-rounded.gif"/>
        </author>
        <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJwRJuZfFNpzHSiOsaj1oEyeiKLlTMBb3No8S26vg7rgvVlER-6mdNJE_e8_GWZmsQyA-xohZphLvFttRmdjbYbBJoOv0gnXdT2Kj98pza7ayVkyh5kFp_quzbjcx0vJmTk3aQ0o0h_r5bY8C6IsQq5YOeaHwx-z6pKWJZL-uIDDmwwEZJgTaV8g/s72-w400-h286-c/dyson-8.jpg" height="72" width="72"/>
        <thr:total>3</thr:total>
    </entry>
    <entry>
        <id>tag:blogger.com,1999:blog-19303585.post-2628625242840790888</id>
        <published>2024-01-17T12:19:00.004+00:00</published>
        <updated>2024-01-18T12:59:23.311+00:00</updated>
        <title type="text">My daily driver is older than I thought; it&#39;s positively vintage!</title>
        <content type="html">&lt;p&gt;I was doing some clean up on my main laptop and realized it had been a while since bought a new computer. Turns out it was a lot older than I thought:&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvzO4ipKTzs-wGERqTADkb60TVjR1Lk1TQVSNkeik6A0tfdToCWa5cdDlyM6B4_4YfG76iJQyuFQsY8_zD8P9wH6sZc3fcFsNeiWuQ4mlIVc4dA8vYn71DWI_n-Xl8hRl6Nwg_Y5NQs8_JVfcadvmPx3Rshtkz0x5YnHDn-apiuP_CAAtqQbDriQ/s1338/mac-1.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1338&quot; data-original-width=&quot;784&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvzO4ipKTzs-wGERqTADkb60TVjR1Lk1TQVSNkeik6A0tfdToCWa5cdDlyM6B4_4YfG76iJQyuFQsY8_zD8P9wH6sZc3fcFsNeiWuQ4mlIVc4dA8vYn71DWI_n-Xl8hRl6Nwg_Y5NQs8_JVfcadvmPx3Rshtkz0x5YnHDn-apiuP_CAAtqQbDriQ/w375-h640/mac-1.jpg&quot; width=&quot;375&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;Apple considers this machine to be &lt;a href=&quot;https://support.apple.com/en-us/HT201624&quot;&gt;vintage&lt;/a&gt;&amp;nbsp;but I don&#39;t have any compelling reason to upgrade it. Apple still supports it in macOS (although I can&#39;t upgrade beyond macOS Ventura), all the hardware works, and I haven&#39;t run out of disk space (although I did have to offload all the the work on &lt;a href=&quot;https://behind-the-screens.tv/&quot;&gt;Behind The Screens&lt;/a&gt; to an external drive because of their size).&lt;/div&gt;&lt;p&gt;But there is one thing I hate about it: the bloody Touch Bar and its phony ESC key. I thought I&#39;d get used to the Touch Bar but it turns out I didn&#39;t.&amp;nbsp;&lt;/p&gt;&lt;p&gt;This is the longest I&#39;ve ever owned a laptop without upgrading and I think that comes down to a few things. Firstly, I spend most of my time on this machine either in a web browser, or using a terminal to SSH to somewhere else. Secondly, the most powerful program I tend to use on it is Final Cut Pro but my videos tend to me short and not particularly complicated to output.&lt;/p&gt;&lt;p&gt;So, a combination of Apple&#39;s hardware and software holding up and a lot of my computing needs being offloaded to the cloud means this old machine is banging along nicely.&lt;/p&gt;&lt;p&gt;PS If you&#39;re interested in a really vintage machine, &lt;a href=&quot;https://blog.jgc.org/2023/12/restoration-of-ibm-thinkpad-701c.html&quot;&gt;read about my complete restoration of an IBM ThinkPad 701c&lt;/a&gt; (the one with the butterfly keyboard).&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0w9j6ps4wMjnvsJkGCtrjkn1E98IL3px8ijlwGW2fEq7wzhgVi0DQH-8JinjPBbCOb4ycfi66mp8irN3wU8FOl2KAW1cKmh5m9jQ_aqtPBk_LGitLZr991Pp-K2FsPjrn97dWMZWY1AoIkSTe2J4AhUz64pekzCzX2ECXoVNP3SZ8Jp6HTnCLHQ/s639/701c-40.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;524&quot; data-original-width=&quot;639&quot; height=&quot;524&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0w9j6ps4wMjnvsJkGCtrjkn1E98IL3px8ijlwGW2fEq7wzhgVi0DQH-8JinjPBbCOb4ycfi66mp8irN3wU8FOl2KAW1cKmh5m9jQ_aqtPBk_LGitLZr991Pp-K2FsPjrn97dWMZWY1AoIkSTe2J4AhUz64pekzCzX2ECXoVNP3SZ8Jp6HTnCLHQ/w640-h524/701c-40.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;</content>
        <link rel="replies" type="application/atom+xml" href="http://blog.jgc.org/feeds/2628625242840790888/comments/default" title="Post Comments"/>
        <link rel="replies" type="text/html" href="http://www.blogger.com/comment/fullpage/post/19303585/2628625242840790888" title="4 Comments"/>
        <link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19303585/posts/default/2628625242840790888"/>
        <link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19303585/posts/default/2628625242840790888"/>
        <link rel="alternate" type="text/html" href="http://blog.jgc.org/2024/01/my-daily-driver-is-older-than-i-thought.html" title="My daily driver is older than I thought; it&#39;s positively vintage!"/>
        <author>
            <name>Unknown</name>
            <email>[email protected]</email>
            <gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="https://img1.blogblog.com/img/b16-rounded.gif"/>
        </author>
        <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvzO4ipKTzs-wGERqTADkb60TVjR1Lk1TQVSNkeik6A0tfdToCWa5cdDlyM6B4_4YfG76iJQyuFQsY8_zD8P9wH6sZc3fcFsNeiWuQ4mlIVc4dA8vYn71DWI_n-Xl8hRl6Nwg_Y5NQs8_JVfcadvmPx3Rshtkz0x5YnHDn-apiuP_CAAtqQbDriQ/s72-w375-h640-c/mac-1.jpg" height="72" width="72"/>
        <thr:total>4</thr:total>
    </entry>
    <entry>
        <id>tag:blogger.com,1999:blog-19303585.post-8778475752762716090</id>
        <published>2023-12-27T15:43:00.007+00:00</published>
        <updated>2024-01-24T15:42:07.935+00:00</updated>
        <category scheme="http://www.blogger.com/atom/ns#" term="pseudo-randomness"/>
        <title type="text">Compression of the lyrics of the &quot;12 Days Of Christmas&quot;</title>
        <content type="html">&lt;p&gt;Eleven years ago I blogged about a solution to the &quot;Never Gonna Give You Up&quot; compression code golf challenge: what&#39;s the smallest program that output the lyrics of Rick Astley&#39;s phenomenon? My solution was 589 bytes of Perl that looked like this:&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;$b=&amp;lt;&amp;lt;E;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp;gÐngÑveÒe &amp;gt;ÓthÔouÕo Önd× yÕØÖloÙiÑ Út&#39;s Û(OohÜe&#39;reÝ&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;YÕÞ knowß,ÐivàÚoá I&#39;m â tÖsãtell ä a× åØ æeåçay it&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;è äértØêß ëÐonna ì oÔer íæupîmakeæïÛbeen ðëÔÓñÕ&#39;rÓtoÖòeî)&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;óeÒrìô&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;We&#39;Òßõ&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;NôöóÜ÷ôgiÒø howâfeeliÑ&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;ù&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;Nøú÷)ú, nø&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;(Givû&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;I just wannaéyÕùGotta ïu×ersta×&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;þü eachífor sÙÑÞr hearðachÚbut&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;YòshyãèInsidÓwÓboÔëwhaðgoán&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;WeñgamçwÝìplèýúîöletædownörun arÕ×ådeseêöïcryösayÐoodbyeöäa liçhuê&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;þWÝ nÖstraÑers tÙÒÞñrulesåsÖdÖI&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;A full commitmenÛwhatâÔinkáfÞ wÕldn&#39;tÐet Ôis from anyíguyüõnýA×&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;ifæask meùDon&#39;témÓyòbli×ãee&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;þþ&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;Üà÷àûûóõýüþþ&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;E&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;map{($a,$b)=split($c=chr,$b,2);$b=~s/$c/$a/g}(208..254);print$b&lt;/span&gt;&lt;/p&gt;&lt;p&gt;The &lt;span style=&quot;font-family: courier;&quot;&gt;$b &lt;/span&gt;variable contains a dictionary where the index is made up of ASCII characters above 128 and the single line of Perl code at the end substitutes the dictionary entries until the full lyrics are output.&lt;/p&gt;&lt;p&gt;I wondered about using the same technique on the &quot;12 Days Of Christmas&quot; as there&#39;s a lot of repetition but the song is longer. &quot;Never Gonna Give You Up&quot; is 1,872 bytes and &quot;12 Days Of Christmas&quot; is 2,386. Using the same technique results in this 479 byte Perl program that outputs in the &quot;12 Days Of Christmas&quot;:&lt;/p&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;$b=&amp;lt;&amp;lt;Z;&lt;br /&gt;enÙ tÚ&lt;br /&gt;TÛs,Üe ÝingÞÙ ßvÝgà druás a-âÞ,ãdâäevßåpãæmmãçOnÚhÝè.&lt;br /&gt;èééfêéeëétìésí&lt;br /&gt;NinÝladies dancãþî partridgÝin a pearÚreeïßloräleaæîð day of ChristmaÜ&lt;br /&gt;myÚruÝloàavÝto meñdñòthñónóôóÛõeveôöÛwoÚurtlÝdoveÜ&lt;br /&gt;And aï÷&lt;br /&gt;Elåpipers piæÛðøÛhreÝFrÙch hÙÜ÷ù&lt;br /&gt;Four callÞ birdÜùú&lt;br /&gt;FiàoldßrÞÜúû&lt;br /&gt;Six geesÝa-layãûü&lt;br /&gt;Såswanâswiçüý&lt;br /&gt;Eight maiämilkãýþèfirstñ&lt;br /&gt;Aïíeconò÷ìhiròùêouróúêifóûíixóüíöýëighóþéniôîìÙõðëlöøìwelfõwelveámmersáçø!&lt;br /&gt;Z&lt;br /&gt;map{($a,$b)=split($c=chr,$b,2);$b=~s/$c/$a/g}(217..254);print$b&lt;/span&gt;&lt;/div&gt;&lt;pre class=&quot;prettyprint&quot; style=&quot;line-height: 10pt;&quot;&gt;&lt;pre class=&quot;prettyprint&quot; style=&quot;line-height: 10pt;&quot;&gt;&lt;pre class=&quot;prettyprint&quot; style=&quot;line-height: 10pt;&quot;&gt;&lt;pre class=&quot;prettyprint&quot; style=&quot;line-height: 10pt;&quot;&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;/pre&gt;</content>
        <link rel="replies" type="application/atom+xml" href="http://blog.jgc.org/feeds/8778475752762716090/comments/default" title="Post Comments"/>
        <link rel="replies" type="text/html" href="http://www.blogger.com/comment/fullpage/post/19303585/8778475752762716090" title="1 Comments"/>
        <link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19303585/posts/default/8778475752762716090"/>
        <link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19303585/posts/default/8778475752762716090"/>
        <link rel="alternate" type="text/html" href="http://blog.jgc.org/2023/12/compression-of-lyrics-of-12-days-of.html" title="Compression of the lyrics of the &quot;12 Days Of Christmas&quot;"/>
        <author>
            <name>Unknown</name>
            <email>[email protected]</email>
            <gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="https://img1.blogblog.com/img/b16-rounded.gif"/>
        </author>
        <thr:total>1</thr:total>
    </entry>
</feed>
Raw text
<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-19303585</id><updated>2025-04-01T07:48:22.029+00:00</updated><category term="pseudo-randomness"/><category term="hardware"/><category term="babbage"/><category term="gaga"/><category term="anti-spam"/><category term="gnu make"/><category term="retro"/><category term="security"/><category term="codes and ciphers"/><category term="the geek atlas"/><category term="rants and raves"/><category term="alan turing"/><category term="hits"/><category term="mathematics"/><category term="climate change"/><category term="perl"/><category term="calculators"/><category term="google go"/><category term="minitel"/><category term="toys"/><category term="behind the screens"/><category term="clocks"/><category term="machine learning"/><category term="babygaga"/><category term="games"/><category term="arc"/><category term="my services"/><category term="popfile"/><category term="cansole"/><category term="facebook"/><category term="privacy"/><category term="radio"/><category term="well... actually"/><title type='text'>John Graham-Cumming&#39;s blog</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://blog.jgc.org/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19303585/posts/default'/><link rel='alternate' type='text/html' href='http://blog.jgc.org/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/19303585/posts/default?start-index=26&amp;max-results=25'/><author><name>Unknown</name><email>[email protected]</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>520</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-19303585.post-6045805352103665596</id><published>2025-03-31T15:22:00.008+00:00</published><updated>2025-03-31T15:30:58.521+00:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="retro"/><title type='text'>Debugging Lotus 1-2-3 by fax</title><content type='html'>&lt;p&gt;There isn&#39;t a lot to this story beyond the fact that in around 1990 I helped debug someone&#39;s &lt;a href=&quot;https://en.wikipedia.org/wiki/Lotus_1-2-3&quot;&gt;Lotus 1-2-3&lt;/a&gt; set up via fax. But it&#39;s a good reminder of how important the Zeroth Law of Debugging is (see below).&lt;/p&gt;&lt;p&gt;Without some sort of online connection with these folks, and with transatlantic phone calls being very, very expensive (I was in the UK, they were in the US) fax was the obvious answer.&lt;/p&gt;&lt;p&gt;I was reminded of this when I came across the actual fax itself:&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvBJFVo9lHXKYXrDQLzGXbikkdfnrYIrLIVEfKAtf8xXit4aysAwKI4eGJE7DDtpGox5v5nGtimyBlgEsV2TfFhoJZjOzrMvKn_Y9zWvlnd90WmDJNvY_PhjY-e88ULkTz3anDxMYBTVvcZy6_-WWvwGiNGkfcpE0zZM6ycrTXGZO9d-Qun1QZXg/s1933/123fax-1.jpeg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1933&quot; data-original-width=&quot;1394&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvBJFVo9lHXKYXrDQLzGXbikkdfnrYIrLIVEfKAtf8xXit4aysAwKI4eGJE7DDtpGox5v5nGtimyBlgEsV2TfFhoJZjOzrMvKn_Y9zWvlnd90WmDJNvY_PhjY-e88ULkTz3anDxMYBTVvcZy6_-WWvwGiNGkfcpE0zZM6ycrTXGZO9d-Qun1QZXg/w462-h640/123fax-1.jpeg&quot; width=&quot;462&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;What I asked them to do was give me the output of &lt;span style=&quot;font-family: courier;&quot;&gt;/ppomr&lt;/span&gt;. Hitting &lt;span style=&quot;font-family: courier;&quot;&gt;/&lt;/span&gt; in 1-2-3 started the menu system and each letter took you down a submenu until you hit an actual menu item. &lt;span style=&quot;font-family: courier;&quot;&gt;/ppomr&lt;/span&gt; is &lt;span style=&quot;font-family: courier;&quot;&gt;/Print Printer Options Margins Right&lt;/span&gt; (read all about it in the &lt;a href=&quot;https://ia801706.us.archive.org/25/items/lotus-1-2-3-release-3.1-reference/Lotus%201-2-3%20Release%203.1%20-%20Quick%20Reference.pdf&quot;&gt;Quick Reference&lt;/a&gt;) and so I was asking for the size of the right margin when printing.&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvnfG-rD2_B8Ex1WeGI8rIDmfdkcmWsQXkFB5lW_NdEmgBOImDbwS68iXE2jpDvmEVEq_zfBI3r5HrsWez-n5V_5JL6PFHaKh2kV8S2GW-D92kkp7a1lVlI3vjsThAs_RnkR0XvosVtmqLpDrF-HZGN8hb2qbp5HdE6oNYjlJAbW1zOGOiqMYJ0Q/s1304/123fax-4.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1304&quot; data-original-width=&quot;1118&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvnfG-rD2_B8Ex1WeGI8rIDmfdkcmWsQXkFB5lW_NdEmgBOImDbwS68iXE2jpDvmEVEq_zfBI3r5HrsWez-n5V_5JL6PFHaKh2kV8S2GW-D92kkp7a1lVlI3vjsThAs_RnkR0XvosVtmqLpDrF-HZGN8hb2qbp5HdE6oNYjlJAbW1zOGOiqMYJ0Q/w549-h640/123fax-4.png&quot; width=&quot;549&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;Here&#39;s what that looks like in action:&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyFlohy9zaZQG4F1lVbE5zwbI-atvbCsblhWuExUIGrz-5M8mXowl5pVX-1Z3PvLtk4RRSy4SSIezsdMAxapZNC-haHtW1IATs6KQbUR1xDS6FkD8qGgqonN4u9jWsta6RUFQtrzTB5h1I7AZE0zNNp3As3bKBG3jXqZWwWdU8vzrovjoWAaodww/s4096/123fx-2.gif&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;2304&quot; data-original-width=&quot;4096&quot; height=&quot;360&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyFlohy9zaZQG4F1lVbE5zwbI-atvbCsblhWuExUIGrz-5M8mXowl5pVX-1Z3PvLtk4RRSy4SSIezsdMAxapZNC-haHtW1IATs6KQbUR1xDS6FkD8qGgqonN4u9jWsta6RUFQtrzTB5h1I7AZE0zNNp3As3bKBG3jXqZWwWdU8vzrovjoWAaodww/w640-h360/123fx-2.gif&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;And then I instructed the person on the other end to alter the left margin with &lt;span style=&quot;font-family: courier;&quot;&gt;/ppoml&lt;/span&gt;&amp;nbsp;(&lt;span style=&quot;font-family: courier;&quot;&gt;/Print Printer Options Margins Left&lt;/span&gt;). I also told them if they wanted a change to the page headers I&#39;d need to &quot;send them a disc&quot; (i.e. mail a floppy disc to the US!)&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;If you are going to debug anything you need to tighten the loop between trying something and observing the output of your change. This should be the Zeroth Law of Debugging: get the smallest/fastest test case so you can iterate.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;Worst case send faxes across the Atlantic.&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgHKaAHsFiYNnAH36kFKQdWGdtiPd6-AulKES6UwkiyVVWEZ-fqAZu_53HVlie0Ftz-pFokP24OLBf1792PRTvZAZmJeIYd7_TSTfP9DvSeikXQJzXBj5rXgoRoSv8P3dUXzg4HE9WdbWLwTwB_FdWZB67ddTLVZFaoD0So7K1k7z-JDAJoVfJpA/s529/123fax-3.jpeg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;472&quot; data-original-width=&quot;529&quot; height=&quot;358&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgHKaAHsFiYNnAH36kFKQdWGdtiPd6-AulKES6UwkiyVVWEZ-fqAZu_53HVlie0Ftz-pFokP24OLBf1792PRTvZAZmJeIYd7_TSTfP9DvSeikXQJzXBj5rXgoRoSv8P3dUXzg4HE9WdbWLwTwB_FdWZB67ddTLVZFaoD0So7K1k7z-JDAJoVfJpA/w400-h358/123fax-3.jpeg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jgc.org/feeds/6045805352103665596/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/19303585/6045805352103665596' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19303585/posts/default/6045805352103665596'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19303585/posts/default/6045805352103665596'/><link rel='alternate' type='text/html' href='http://blog.jgc.org/2025/03/debugging-lotus-1-2-3-by-fax.html' title='Debugging Lotus 1-2-3 by fax'/><author><name>Unknown</name><email>[email protected]</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvBJFVo9lHXKYXrDQLzGXbikkdfnrYIrLIVEfKAtf8xXit4aysAwKI4eGJE7DDtpGox5v5nGtimyBlgEsV2TfFhoJZjOzrMvKn_Y9zWvlnd90WmDJNvY_PhjY-e88ULkTz3anDxMYBTVvcZy6_-WWvwGiNGkfcpE0zZM6ycrTXGZO9d-Qun1QZXg/s72-w462-h640-c/123fax-1.jpeg" height="72" width="72"/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19303585.post-5795781756177787948</id><published>2025-02-13T17:55:00.004+00:00</published><updated>2025-02-13T17:59:46.833+00:00</updated><title type='text'>I have come to loathe acronyms</title><content type='html'>&lt;p&gt;Unless they are widely, widely known they make communication worse. And they have a tendency to make the writer seem pompous, or a member of some special clique, while making a reader who doesn&#39;t know the acronym feel foolish.&amp;nbsp;&lt;/p&gt;&lt;p&gt;They are the opposite of clear communication, and are often accompanied by unclear, complex language.&lt;/p&gt;&lt;p&gt;The writer&#39;s goal (whether of a book, an email, or whatever the hell we call a tweet now) should be to be understood. Acronyms are an impediment to that and are often more difficult to read or say than actual words.&amp;nbsp;&lt;/p&gt;&lt;p&gt;And don&#39;t fall into the awful trap of defining an acronym in a document and then using it later. That&#39;s a substitute for using plain language. Always use plain language.&lt;/p&gt;&lt;p&gt;Unless your goal is to be misunderstood.&amp;nbsp;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jgc.org/feeds/5795781756177787948/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/19303585/5795781756177787948' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19303585/posts/default/5795781756177787948'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19303585/posts/default/5795781756177787948'/><link rel='alternate' type='text/html' href='http://blog.jgc.org/2025/02/i-have-come-to-loath-acronyms.html' title='I have come to loathe acronyms'/><author><name>Unknown</name><email>[email protected]</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19303585.post-2972398345099268358</id><published>2025-02-10T17:09:00.000+00:00</published><updated>2025-02-10T17:09:09.529+00:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="hardware"/><title type='text'>Archiving hardware projects</title><content type='html'>&lt;p&gt;From time to time I do some project involving old hardware that requires connecting it to a modern computer. For example,&lt;/p&gt;&lt;p&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://blog.jgc.org/2025/02/getting-kim-1-to-talk-to-my-mac.html&quot;&gt;Getting the KIM-1 to talk to my Mac&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://blog.jgc.org/2022/03/resurrecting-dataman-s4-prom-programmer.html&quot;&gt;Resurrecting a Dataman S4 PROM programmer&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://blog.jgc.org/2022/04/ripping-old-mini-dv-video-tapes-on-mac.html&quot;&gt;Ripping old mini DV video tapes on a Mac&lt;/a&gt;&lt;/p&gt;&lt;p&gt;And I&#39;ve come to the conclusion that archiving the related hardware is important. For example, I got this Dataman S4 talking to my Mac using a few different cables. I bought a set of cables and archived them in a bag for the next time I need to do this.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_A37qHS8SIBr146GTQt5yyNg3AENYhRcyj6vAbQCCJeCaSpXI5Mh8IiMRhQMYLGqtqoIeGhgFK5VarUgScWfPV_jlhcyZEXdbtcjUCIgpdz6WG903sxPYD6g9c3rG3hyphenhyphenNcf06m0cyeKQn1OkAVMy_4fFLoiDbNAs1Z2KhlFET2S_rDJY9yZpc1w/s2664/dataman5.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;2664&quot; data-original-width=&quot;2381&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_A37qHS8SIBr146GTQt5yyNg3AENYhRcyj6vAbQCCJeCaSpXI5Mh8IiMRhQMYLGqtqoIeGhgFK5VarUgScWfPV_jlhcyZEXdbtcjUCIgpdz6WG903sxPYD6g9c3rG3hyphenhyphenNcf06m0cyeKQn1OkAVMy_4fFLoiDbNAs1Z2KhlFET2S_rDJY9yZpc1w/w573-h640/dataman5.jpg&quot; width=&quot;573&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;The Dataman S4 project required three things: a USB-C to USB-A adapter, a USB-A to RS-232 adapter and a 9 pin to 25 pin serial cable.&amp;nbsp;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBw-gv1T6yK7NS-YQn7wHnDNK61-ow4R6AYjWETsNLG-IQ7pXIcni3NQg0MpcFWKaNyTE6edLK3whoeDL_cvm5M4DzwHm7ytq3zngw5GAwEM3I4wfHlLZdXIruTlCLbpooZi9FZPOQ5Axdq-O8IqUVOFbVpRmNR8NZlE9-Y39vvjUta7XR3UgUug/s4234/archive-1.jpeg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;4234&quot; data-original-width=&quot;3902&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBw-gv1T6yK7NS-YQn7wHnDNK61-ow4R6AYjWETsNLG-IQ7pXIcni3NQg0MpcFWKaNyTE6edLK3whoeDL_cvm5M4DzwHm7ytq3zngw5GAwEM3I4wfHlLZdXIruTlCLbpooZi9FZPOQ5Axdq-O8IqUVOFbVpRmNR8NZlE9-Y39vvjUta7XR3UgUug/w590-h640/archive-1.jpeg&quot; width=&quot;590&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;These things are fairly inexpensive making it viable to archive them. Now I only have to worry about the drivers being available!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8oe93fugNv6GtBjc9-RkAdaU3jo5Cruy6-BxJH-5uX_k7eFtKFqTBODWC9VXHVSBWRRAHNt5djl1DSNlJ3-mzuSuWZYFR_kK0R7gGSH1zxuL87xhen5ysQTBmh7shP0t4yR4iVQJXXqPsGSI3cSFlQdrROEWokFWiCNCcYNxO0NiQrp4a1T5xfw/s4083/archive-2.jpeg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;4083&quot; data-original-width=&quot;3763&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8oe93fugNv6GtBjc9-RkAdaU3jo5Cruy6-BxJH-5uX_k7eFtKFqTBODWC9VXHVSBWRRAHNt5djl1DSNlJ3-mzuSuWZYFR_kK0R7gGSH1zxuL87xhen5ysQTBmh7shP0t4yR4iVQJXXqPsGSI3cSFlQdrROEWokFWiCNCcYNxO0NiQrp4a1T5xfw/w590-h640/archive-2.jpeg&quot; width=&quot;590&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jgc.org/feeds/2972398345099268358/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/19303585/2972398345099268358' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19303585/posts/default/2972398345099268358'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19303585/posts/default/2972398345099268358'/><link rel='alternate' type='text/html' href='http://blog.jgc.org/2025/02/archiving-hardware-projects.html' title='Archiving hardware projects'/><author><name>Unknown</name><email>[email protected]</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_A37qHS8SIBr146GTQt5yyNg3AENYhRcyj6vAbQCCJeCaSpXI5Mh8IiMRhQMYLGqtqoIeGhgFK5VarUgScWfPV_jlhcyZEXdbtcjUCIgpdz6WG903sxPYD6g9c3rG3hyphenhyphenNcf06m0cyeKQn1OkAVMy_4fFLoiDbNAs1Z2KhlFET2S_rDJY9yZpc1w/s72-w573-h640-c/dataman5.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19303585.post-3528602294442713744</id><published>2025-02-09T20:28:00.005+00:00</published><updated>2025-02-09T20:36:02.125+00:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="retro"/><title type='text'>Getting the KIM-1 to talk to my Mac</title><content type='html'>&lt;p&gt;I&#39;ve written before about &lt;a href=&quot;https://blog.jgc.org/2023/11/my-1976-kim-1.html&quot;&gt;my 1976 KIM-1&lt;/a&gt; and &lt;a href=&quot;https://blog.jgc.org/2013/04/how-i-coded-in-1985.html&quot;&gt;code I wrote&lt;/a&gt; for a similar one long ago. But I hadn&#39;t done much with the KIM-1 and strongly believe that old hardware need to be living machines not still lives. But using the KIM-1 directly (via its keypad and little hexadecimal display) is painful. I wanted to be able to use it with a terminal.&lt;/p&gt;&lt;p&gt;Luckily, the KIM-1 was designed to interface to a terminal: a &lt;a href=&quot;https://en.wikipedia.org/wiki/Teletype_Model_33&quot;&gt;Model 33 ASR Teletype&lt;/a&gt;. Teletypes use a type of interface which is unusual to most people (unless you work with industrial machinery where it&#39;s pretty common). That interface is a &lt;a href=&quot;https://en.wikipedia.org/wiki/Digital_current_loop_interface&quot;&gt;current loop&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;A current loop uses current (often 20mA) rather than voltage (such as the voltage levels seen in common serial interfaces). Prior to the creation of &lt;a href=&quot;https://en.wikipedia.org/wiki/RS-232&quot;&gt;RS-232&lt;/a&gt;, current loops were very common. Current loops are still used in industrial settings partly because they have good noise immunity, can go for long distances, and are simple and reliable.&amp;nbsp;&lt;/p&gt;&lt;p&gt;In the KIM-1 manual there&#39;s a picture of the way its current loop works when connected to a Teletype:&amp;nbsp;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNI4PoUrRp6VTMXV5sTj-cbd5KxPR0J4kMurosS_YawM1EPLVcKsq-4MIVitMa48NSS9nPgfYU2eui9t6UcwwHXSjzVwrYUIVmGWC1Ex7jFBgjyKnJ0sY7WpVmCbloaGjL5zeRAwX6XtS4l_lHwH88ihpgZ-awjCfDIcFdgCvBJ4MZ-b3pQydWNg/s1368/kim-1-1.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1176&quot; data-original-width=&quot;1368&quot; height=&quot;550&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNI4PoUrRp6VTMXV5sTj-cbd5KxPR0J4kMurosS_YawM1EPLVcKsq-4MIVitMa48NSS9nPgfYU2eui9t6UcwwHXSjzVwrYUIVmGWC1Ex7jFBgjyKnJ0sY7WpVmCbloaGjL5zeRAwX6XtS4l_lHwH88ihpgZ-awjCfDIcFdgCvBJ4MZ-b3pQydWNg/w640-h550/kim-1-1.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;When the KIM-1 wants to send data to the Teletype it uses pins S and U of one of its edge connectors. S is permanently connected to +5V via a 150 ohm resistor. When the KIM-1 receives data from the Teletype&#39;s keyboard it uses pins R and T. Just like S, R is permanently connected to +5V. The important thing to note is that the KIM-1 is responsible for the current: the Teletype is entirely &quot;dumb&quot;. This will matter later in this blog post.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;I happened to have lying around &lt;a href=&quot;https://www.horter-shop.de/de/rs232-tty-adapter-passiv/151-bausatz-rs232-tty-adapter-passiv-4260404260127.html&quot;&gt;a kit to make an adapter between RS-232 and the Siemens SIMATIC S5 current loop&lt;/a&gt;.&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAeSbQlVy8BJolG0uDvmgGgtdDsoDFLV6Qo0sHrg-iVI8P0stXBdUg_HsRJqAAIToLVMsjMQu0EQeDfhja17tH9se1YtZXs3yccjPKcwmIUILqzB0I9xizoo8U7jLx_JXb8q2uenEPW7Tc_hv3sGrj7G9CRuep8WmkpyU13Beigo4jbMFZxiAjZw/s982/kim-1-2.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;946&quot; data-original-width=&quot;982&quot; height=&quot;616&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAeSbQlVy8BJolG0uDvmgGgtdDsoDFLV6Qo0sHrg-iVI8P0stXBdUg_HsRJqAAIToLVMsjMQu0EQeDfhja17tH9se1YtZXs3yccjPKcwmIUILqzB0I9xizoo8U7jLx_JXb8q2uenEPW7Tc_hv3sGrj7G9CRuep8WmkpyU13Beigo4jbMFZxiAjZw/w640-h616/kim-1-2.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;A simple kit to build and since USB to RS-232 adapters are easy to find with this I&#39;d be able to communicate with the KIM-1. But first check the circuit diagram of this adapter. There&#39;s a small problem on the receive side.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCYmSOPwceRgzMBw50FJPAOYpZdhpJp0Yh3WhN120WAo6qEHLwzn2a5CwFTXAYINa_36dofqGtjI7RXdbVWbcVenGRU4f7f6l-Mhb7lc0DEYEc6aicS7EFNqWhg6ynje8sxQcqZQVyWujO1ARaJUotW1M8gijQh0X27xcgnN3y32U5FNllgFWX7A/s1758/kim-1-3.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;874&quot; data-original-width=&quot;1758&quot; height=&quot;318&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCYmSOPwceRgzMBw50FJPAOYpZdhpJp0Yh3WhN120WAo6qEHLwzn2a5CwFTXAYINa_36dofqGtjI7RXdbVWbcVenGRU4f7f6l-Mhb7lc0DEYEc6aicS7EFNqWhg6ynje8sxQcqZQVyWujO1ARaJUotW1M8gijQh0X27xcgnN3y32U5FNllgFWX7A/w640-h318/kim-1-3.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;As it pretty common with current loop applications, optoisolators are used. OK1 handles when the device connected to the RS-232 transmits something. And you can see from the diagram that it expects to be getting 5V, 20mA in on its pin 5 and then out again on pin 4. So, that&#39;ll work perfectly for the &quot;keyboard&quot; connection to the KIM-1 (pins R and T).&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;But the receive side is a different story. It&#39;s handled by OK2 and it&#39;s expecting 5V, 20mA on pin 1,p but pin 2 goes to GND. So, there&#39;s no &quot;loop&quot; present. This won&#39;t work with the KIM-1 without a small modification.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;I built the kit and and tested it against the KIM-1 like this:&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghrUvvLUgSr3RZhod4XiIyxt8viOVH-NQwoLikQMDsZM6jf17czwBXfMYjJKhiB0DeTZMp8ryHVitx-8g1TolmqxAhxfE633YHYpoGBidPl1hcs3eBGgcPeGpE1VULmDIXNxOPGk9D5eiRK7TfxMcWc7uvnXLm3Ht7pP5gBBIq9Ms93bhuvCgyDg/s1280/kim-1-4.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;744&quot; data-original-width=&quot;1280&quot; height=&quot;372&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghrUvvLUgSr3RZhod4XiIyxt8viOVH-NQwoLikQMDsZM6jf17czwBXfMYjJKhiB0DeTZMp8ryHVitx-8g1TolmqxAhxfE633YHYpoGBidPl1hcs3eBGgcPeGpE1VULmDIXNxOPGk9D5eiRK7TfxMcWc7uvnXLm3Ht7pP5gBBIq9Ms93bhuvCgyDg/w640-h372/kim-1-4.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;Looks messy but it validated the little modification I needed to make and that I could talk to the KIM-1. Here it is talking at 300 baud using the RS-232 to USB adapter seen above.&amp;nbsp;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQxkZf-cbzjvBVaBvQGWO3XeLjzf6k7kzf0uM0sczMbzcLYzSoZ6sUXsg47ey0zq4VautycgRmuAz1MVwBIbrS01NywuIKJZSoBvvnj7T8kEP8kzpBBPmwndpaBqp7JpibNfBRYRGlHQHh0MShzorcPoQYeN541YcXG3gK__dTB5kvdR6lw3bnUg/s1146/kim-1.gif&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1020&quot; data-original-width=&quot;1146&quot; height=&quot;570&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQxkZf-cbzjvBVaBvQGWO3XeLjzf6k7kzf0uM0sczMbzcLYzSoZ6sUXsg47ey0zq4VautycgRmuAz1MVwBIbrS01NywuIKJZSoBvvnj7T8kEP8kzpBBPmwndpaBqp7JpibNfBRYRGlHQHh0MShzorcPoQYeN541YcXG3gK__dTB5kvdR6lw3bnUg/w640-h570/kim-1.gif&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;So, what&#39;s the modification? Well, pin 2 of OK2 goes to ground and we don&#39;t want it to, we want it to go the KIM-1&#39;s pin U. There are two ways to do this. I could have cut the track on the back of the board that goes from pin 2 to ground, and soldered a wire on the back.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixwnVKqFHl5uFIx6voI_JNpHEdW1WRpV8-zv4w6QydXJ0CTPSLced0JGZgZe8rucLGJG_AqZJzDk2V-7iC1kYzi7o0i-OmKObeNXGq_CjBaSxcbPX0VlK_eGEznspzc6nZ-btpSZdkyL9NZ-6lChzPpcZCz-rEFODbiN5WSQT-jCdVHbTbizarkQ/s540/kim-1-5.png&quot; style=&quot;margin-left: 1em; margin-right: 1em; text-align: center;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;488&quot; data-original-width=&quot;540&quot; height=&quot;289&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixwnVKqFHl5uFIx6voI_JNpHEdW1WRpV8-zv4w6QydXJ0CTPSLced0JGZgZe8rucLGJG_AqZJzDk2V-7iC1kYzi7o0i-OmKObeNXGq_CjBaSxcbPX0VlK_eGEznspzc6nZ-btpSZdkyL9NZ-6lChzPpcZCz-rEFODbiN5WSQT-jCdVHbTbizarkQ/s320/kim-1-5.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;But this kit came with all the chips socketed so I took an even simpler route. Bend pin 2 away from the socket and solder directly to it.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdUEHXkzdm5jFklLlLDNbtbLnPCKx7RELxbJMLj2-0lGW7nFmcOD_qzOp8UReQ7tyMTTbaHtjA6_NlwUd0O4Cr48_2T60ZVRf8CGEpAfcjv8qECa7aFXoOFy5kLvMUBa3ZOE_y8ng7kDFry6PALL4aB2aTxRl9kDjWP9ubNAC_l4cs3rrUBAtEvQ/s3193/kim-1-6.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;2698&quot; data-original-width=&quot;3193&quot; height=&quot;540&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdUEHXkzdm5jFklLlLDNbtbLnPCKx7RELxbJMLj2-0lGW7nFmcOD_qzOp8UReQ7tyMTTbaHtjA6_NlwUd0O4Cr48_2T60ZVRf8CGEpAfcjv8qECa7aFXoOFy5kLvMUBa3ZOE_y8ng7kDFry6PALL4aB2aTxRl9kDjWP9ubNAC_l4cs3rrUBAtEvQ/w640-h540/kim-1-6.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;And that worked fine. The kit also came with a nice little box and so the final adapter looks neat.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfUeBT17s3TjORhTssUtiUGLaW1M_CpBMrWIwnNG737fVgehQnvGZ9-9VoHNNFOeDzNCtUrjQwO82_4VMayPlsyQhOwI23jMH-1rPcHCzkVWi9ZkJe8T1zICJAcAjRnyJaqNyr8ZZj7IRLZn3ivPDXWUQFV5VkuNaKU1H-cSDk07jFKqq6it_PxQ/s1280/kim-1-7.jpeg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;960&quot; data-original-width=&quot;1280&quot; height=&quot;480&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfUeBT17s3TjORhTssUtiUGLaW1M_CpBMrWIwnNG737fVgehQnvGZ9-9VoHNNFOeDzNCtUrjQwO82_4VMayPlsyQhOwI23jMH-1rPcHCzkVWi9ZkJe8T1zICJAcAjRnyJaqNyr8ZZj7IRLZn3ivPDXWUQFV5VkuNaKU1H-cSDk07jFKqq6it_PxQ/w640-h480/kim-1-7.jpeg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;The grey wire goes to the KIM-1, the white wire is a USB-A cable that I&#39;m using to power the adapter and the KIM-1 itself.&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRNc94lv50bDs6CSJnYk8rEeC9wAiQlf_tIUCAgHw203ey4NJwxBF8MyhroSH1TyB6FPqsk4i4VTQGUbQwYcXBGvlCv5fI6P0qOYMcE5sB2t3VDm-ebZY-iMjZgWndXe2Gs5_bY4cHcwNNUpXKMBr8GXj-C_dkNU7oDPRYYKoqrgdfJQOBb1nDTw/s1280/kim-1-8.jpeg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;960&quot; data-original-width=&quot;1280&quot; height=&quot;480&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRNc94lv50bDs6CSJnYk8rEeC9wAiQlf_tIUCAgHw203ey4NJwxBF8MyhroSH1TyB6FPqsk4i4VTQGUbQwYcXBGvlCv5fI6P0qOYMcE5sB2t3VDm-ebZY-iMjZgWndXe2Gs5_bY4cHcwNNUpXKMBr8GXj-C_dkNU7oDPRYYKoqrgdfJQOBb1nDTw/w640-h480/kim-1-8.jpeg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The KIM-1 will happily communicate as 1200 baud with 7 bit ASCII and 2 stop bits. I&#39;m using minicom to communicate with it. The main thing is to set the delete key to send DEL instead of BS since the KIM-1 needs to receive a DEL on start up so that it can measure the Mac&#39;s transmission speed.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;One of the Teletype functions available is to load a program from punched tape. I don&#39;t have an actual Teletype but I can emulate the punched tape format and that&#39;ll allow me to upload programs easily.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9IJ_wZJFKEaDD5UhZ_cb3FiMO9IHgOfrMnrKOQjYdMuSvZNwO7cxND1M774qpg639z71zcWxWUPrvc-YFYLWIS5SdfzlZ0nMFZpaUKHE5JANoIwmHLXEa6NDE-oAkgwPyukU3RtHTmdhisdCeYCaD_SgRDAldBPtge1gbSAbM8XLe-hQEccRrqg/s1208/kim-1-9.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1208&quot; data-original-width=&quot;1016&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9IJ_wZJFKEaDD5UhZ_cb3FiMO9IHgOfrMnrKOQjYdMuSvZNwO7cxND1M774qpg639z71zcWxWUPrvc-YFYLWIS5SdfzlZ0nMFZpaUKHE5JANoIwmHLXEa6NDE-oAkgwPyukU3RtHTmdhisdCeYCaD_SgRDAldBPtge1gbSAbM8XLe-hQEccRrqg/w538-h640/kim-1-9.png&quot; width=&quot;538&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;The format itself is not complicated.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWxEHqPySDq6ch5c9XLYO8NOf7B8x-ExUa0UDgFltgwhqYWDBAyNrgpLmn3EWcnBeWPOcQ6TNOcZOz0ia3TM2MFcvx5ol54r9ENRTb76a_S-jd78mbyl1J85011K7a4wTRgYyTDaPfsOEjdAP-Py9ny5sk-oRxHawHil31r6Wba_QiU8QKcw8etg/s1058/kim-1-10.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1058&quot; data-original-width=&quot;1016&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWxEHqPySDq6ch5c9XLYO8NOf7B8x-ExUa0UDgFltgwhqYWDBAyNrgpLmn3EWcnBeWPOcQ6TNOcZOz0ia3TM2MFcvx5ol54r9ENRTb76a_S-jd78mbyl1J85011K7a4wTRgYyTDaPfsOEjdAP-Py9ny5sk-oRxHawHil31r6Wba_QiU8QKcw8etg/w614-h640/kim-1-10.png&quot; width=&quot;614&quot; /&gt;&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jgc.org/feeds/3528602294442713744/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/19303585/3528602294442713744' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19303585/posts/default/3528602294442713744'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19303585/posts/default/3528602294442713744'/><link rel='alternate' type='text/html' href='http://blog.jgc.org/2025/02/getting-kim-1-to-talk-to-my-mac.html' title='Getting the KIM-1 to talk to my Mac'/><author><name>Unknown</name><email>[email protected]</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNI4PoUrRp6VTMXV5sTj-cbd5KxPR0J4kMurosS_YawM1EPLVcKsq-4MIVitMa48NSS9nPgfYU2eui9t6UcwwHXSjzVwrYUIVmGWC1Ex7jFBgjyKnJ0sY7WpVmCbloaGjL5zeRAwX6XtS4l_lHwH88ihpgZ-awjCfDIcFdgCvBJ4MZ-b3pQydWNg/s72-w640-h550-c/kim-1-1.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19303585.post-8168793316207256718</id><published>2025-02-03T19:27:00.055+00:00</published><updated>2025-02-05T09:50:10.781+00:00</updated><title type='text'>Twenty years of the &quot;GNU Make Standard Library&quot;</title><content type='html'>&lt;p&gt;Twenty years ago, on February 3, 2005, I released v1.0.0 of a project I called &quot;GNU Make Standard Library&quot; (GMSL). That &lt;a href=&quot;https://sourceforge.net/projects/gmsl/files/GNU%20Make%20Standard%20Library/v1.0.0/&quot;&gt;first release&lt;/a&gt; can still be found in its original location on SourceForge. I moved the project from SourceForge to &lt;a href=&quot;https://github.com/jgrahamc/gmsl&quot;&gt;GitHub&lt;/a&gt; and newer releases are there. The latest release is &lt;a href=&quot;https://github.com/jgrahamc/gmsl/releases/tag/v1.2.2&quot;&gt;v1.2.2&lt;/a&gt; on March 30, 2024.&lt;/p&gt;&lt;p&gt;The project has its own homepage at&amp;nbsp;&lt;a href=&quot;https://gmsl.jgc.org/&quot;&gt;https://gmsl.jgc.org/&lt;/a&gt;. The page describes the GMSL as &quot;a collection of functions implemented using native GNU Make functionality that provide list and string manipulation, integer arithmetic, associative arrays, stacks, and debugging facilities.&quot;&lt;/p&gt;&lt;p&gt;GMSL grew out of work that eventually became my book &quot;&lt;a href=&quot;https://nostarch.com/gnumake&quot;&gt;The GNU Make Book&lt;/a&gt;&quot;. What can it do?&lt;/p&gt;&lt;p&gt;Well, things like this:&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;include gmsl&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;VAR&amp;nbsp; &amp;nbsp; := Here is a string with some words in it.&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;$(info $(VAR))&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;# Convert VAR to lowercase&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;LC_VAR := $(call lc,$(VAR))&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;$(info $(LC_VAR))&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;# Get the length of LC_VAR as a string&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;$(info $(call strlen,$(LC_VAR)))&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;# See if VAR and LC_VAR are the same string&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;$(info $(if $(call seq,$(VAR),$(LC_VAR)),Same,Different))&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;# Treat LC_VAR as a list and get the last element&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;$(info $(call last,$(LC_VAR)))&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;# Get the number of list elements in LC_VAR&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;$(info $(call length,$(LC_VAR)))&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;# Apply the strlen function to each element of LC_VAR&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;$(info $(call map,strlen,$(LC_VAR)))&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;# Deduplicate the list of lenghts of elements of LC_VAR&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;$(info $(call uniq,$(call map,strlen,$(LC_VAR))))&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;# Split LC_VAR on the letter e and replace with 3&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;$(info $(call merge,3,$(call split,e,$(LC_VAR))))&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;# Create an associative array mapping the lengths of words&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;# in LC_VAR to a count for each length&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;increment_aa = $(call set,LC_VAR_AA,$1,$(call&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;inc,$(call&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;get,LC_VAR_AA,$1)))&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;$(call map,increment_aa,$(call map,strlen,$(LC_VAR)))&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;dump_key = $(info $1: $(call get,LC_VAR_AA,$1))&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;$(call map,dump_key,$(call keys,LC_VAR_AA))&lt;/span&gt;&lt;/p&gt;&lt;p&gt;And a whole lot more. The entire GMSL is written using native GNU Make functionality and pull requests are welcome!&lt;/p&gt;&lt;p&gt;Update 2025-02-05: I decided GMSL was missing a &lt;a href=&quot;https://github.com/jgrahamc/gmsl/blob/145bda7295dee873b2c2842f404365857ea24764/__gmsl#L239&quot;&gt;fold&lt;/a&gt; function so I added it. So, latest release is today, &lt;a href=&quot;https://github.com/jgrahamc/gmsl/releases/tag/v1.2.3&quot;&gt;v1.2.3&lt;/a&gt;.&amp;nbsp;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jgc.org/feeds/8168793316207256718/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/19303585/8168793316207256718' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19303585/posts/default/8168793316207256718'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19303585/posts/default/8168793316207256718'/><link rel='alternate' type='text/html' href='http://blog.jgc.org/2025/02/twenty-years-of-gnu-make-standard.html' title='Twenty years of the &quot;GNU Make Standard Library&quot;'/><author><name>Unknown</name><email>[email protected]</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19303585.post-8649792458628677830</id><published>2024-12-26T15:26:00.003+00:00</published><updated>2024-12-26T15:34:02.508+00:00</updated><title type='text'>The complete text of &quot;All Watched Over by Machines of Loving Grace&quot;</title><content type='html'>&lt;p&gt;Richard Brautigan&#39;s poem &quot;&lt;a href=&quot;https://en.wikipedia.org/wiki/All_Watched_Over_by_Machines_of_Loving_Grace&quot;&gt;All Watched Over by Machines of Loving Grace&lt;/a&gt;&quot; is somewhat well known in tech. circles but I couldn&#39;t find a complete PDF of the &lt;a href=&quot;https://en.wikipedia.org/wiki/All_Watched_Over_by_Machines_of_Loving_Grace_(poetry_collection)&quot;&gt;original 1967 publication of it (and other poems)&lt;/a&gt; online.&amp;nbsp;&lt;/p&gt;&lt;p&gt;The copyright notice in Brautigan&#39;s collection reads:&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp;&amp;nbsp;© Copyright 1967 by Richard Brautigan&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;Permission is granted to reprint&lt;br /&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;any of these poems in magazines,&lt;br /&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;books and newspapers if they are&lt;br /&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;given away free.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;I am interpreting &quot;print&quot; as including the availability of a free PDF and making a scan of the complete book available here.&amp;nbsp;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://jgc.org/awobmolg-1967.pdf&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1676&quot; data-original-width=&quot;1392&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGhScUr9y4lWyAZs6B-j7QtJjfqFmt-VrOpfII9BIJYzoGDGCtdUYR0pffEwSIWwDUrIBaj57cz5Uluj8CG1hzA8Oi6Vyvm9Bc3wcDkAxucLJQJGrQHOOYLfwIE0zc-JsnuKfAkwrxQPe1N1RdLV7uOhfQD84r6oCgMuq39ZxVXOTT3sNgxGv9CA/w532-h640/Screenshot%202024-12-26%20at%2015.24.00.png&quot; width=&quot;532&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jgc.org/feeds/8649792458628677830/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/19303585/8649792458628677830' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19303585/posts/default/8649792458628677830'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19303585/posts/default/8649792458628677830'/><link rel='alternate' type='text/html' href='http://blog.jgc.org/2024/12/the-complete-text-of-all-watched-over.html' title='The complete text of &quot;All Watched Over by Machines of Loving Grace&quot;'/><author><name>Unknown</name><email>[email protected]</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGhScUr9y4lWyAZs6B-j7QtJjfqFmt-VrOpfII9BIJYzoGDGCtdUYR0pffEwSIWwDUrIBaj57cz5Uluj8CG1hzA8Oi6Vyvm9Bc3wcDkAxucLJQJGrQHOOYLfwIE0zc-JsnuKfAkwrxQPe1N1RdLV7uOhfQD84r6oCgMuq39ZxVXOTT3sNgxGv9CA/s72-w532-h640-c/Screenshot%202024-12-26%20at%2015.24.00.png" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19303585.post-8901769136152952921</id><published>2024-12-15T16:15:00.003+00:00</published><updated>2024-12-15T16:16:23.395+00:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="pseudo-randomness"/><title type='text'>badkeming: a site for kerning so bad it&#39;s keming</title><content type='html'>&lt;p&gt;I made another silly Tumblr (to go along with &lt;a href=&quot;https://moviecode.tumblr.com/&quot;&gt;Movie Code&lt;/a&gt; and &lt;a href=&quot;https://lowbackgroundsteel.ai/&quot;&gt;Low Background Steel&lt;/a&gt;). This times it&#39;s a Tumblr for all those font disasters and other typographical amusements. Welcome to the wonderful world of &lt;a href=&quot;https://badkeming.com&quot;&gt;badkeming.com&lt;/a&gt;:&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://badkeming.com&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1428&quot; data-original-width=&quot;2174&quot; height=&quot;420&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOnAi31wLwP1beQLc-ylj8D2VpWVsJQkuyVcUMViFFpppM7BmbNgrB36PQWpxETwYpIP2PjkoJ-DnsDabdn5UOJoNvy-vh6oPlh2cISzOiqj-vmc-zfHKzSasC8ZamjWl7vwXU5ee2V7Jfj5wuQEBgfyOniA_1_3Z_RuTDFPv3zmTQVugR1HjOZA/w640-h420/badkeming-1.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;Submissions gladly accepted.&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jgc.org/feeds/8901769136152952921/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/19303585/8901769136152952921' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19303585/posts/default/8901769136152952921'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19303585/posts/default/8901769136152952921'/><link rel='alternate' type='text/html' href='http://blog.jgc.org/2024/12/badkeming-site-for-kerning-so-bad-its.html' title='badkeming: a site for kerning so bad it&#39;s keming'/><author><name>Unknown</name><email>[email protected]</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOnAi31wLwP1beQLc-ylj8D2VpWVsJQkuyVcUMViFFpppM7BmbNgrB36PQWpxETwYpIP2PjkoJ-DnsDabdn5UOJoNvy-vh6oPlh2cISzOiqj-vmc-zfHKzSasC8ZamjWl7vwXU5ee2V7Jfj5wuQEBgfyOniA_1_3Z_RuTDFPv3zmTQVugR1HjOZA/s72-w640-h420-c/badkeming-1.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19303585.post-4119179139891431895</id><published>2024-12-08T17:24:00.004+00:00</published><updated>2024-12-08T17:28:43.687+00:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="anti-spam"/><title type='text'>&quot;All your base are belong to us&quot; introduction to my 2004 MIT Spam Conference talk</title><content type='html'>&lt;p&gt;As I&#39;ve mentioned before &lt;a href=&quot;https://blog.jgc.org/2023/07/how-to-beat-adaptivebayesian-spam.html&quot;&gt;my talk at the 2004 MIT Spam Conference&lt;/a&gt; was about using one machine learning system to beat another. In that case a spammer using machine learning to beat a machine learning spam filter.&lt;/p&gt;&lt;p&gt;The talk started with a short video playing off the &lt;a href=&quot;https://en.wikipedia.org/wiki/All_your_base_are_belong_to_us&quot;&gt;All your base are belong to us&lt;/a&gt; meme. I very carefully edited the images to change the text to be about spam and incorporate Paul Graham (who was the instigator of the MIT Spam Conference and an &lt;a href=&quot;https://paulgraham.com/spam.html&quot;&gt;early machine learning spam filter pioneer&lt;/a&gt;).&amp;nbsp;&lt;/p&gt;&lt;p&gt;I thought I&#39;d &lt;a href=&quot;https://blog.jgc.org/2023/05/bringing-popfile-web-site-back-from-dead.html&quot;&gt;lost the audio of that introduction&lt;/a&gt; and randomly came across it today. So here is the restored introduction to the talk made on a Mac in 2004 (I still haven&#39;t found the audio of the actual talk).&lt;/p&gt;

&lt;div style=&quot;padding-top: 56.25%; position: relative;&quot;&gt;
  &lt;iframe allow=&quot;accelerometer; gyroscope; autoplay; encrypted-media; picture-in-picture;&quot; allowfullscreen=&quot;true&quot; loading=&quot;lazy&quot; src=&quot;https://customer-rww76yind8iym5aw.cloudflarestream.com/41a0f39e1f9d7fcde6dd32bacf628437/iframe?poster=https%3A%2F%2Fcustomer-rww76yind8iym5aw.cloudflarestream.com%2F41a0f39e1f9d7fcde6dd32bacf628437%2Fthumbnails%2Fthumbnail.jpg%3Ftime%3D%26height%3D600&quot; style=&quot;border: none; height: 100%; left: 0; position: absolute; top: 0; width: 100%;&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jgc.org/feeds/4119179139891431895/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/19303585/4119179139891431895' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19303585/posts/default/4119179139891431895'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19303585/posts/default/4119179139891431895'/><link rel='alternate' type='text/html' href='http://blog.jgc.org/2024/12/all-you-base-are-belong-to-us.html' title='&quot;All your base are belong to us&quot; introduction to my 2004 MIT Spam Conference talk'/><author><name>Unknown</name><email>[email protected]</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19303585.post-3123313590817156000</id><published>2024-11-15T19:12:00.001+00:00</published><updated>2024-11-15T19:13:37.606+00:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="popfile"/><category scheme="http://www.blogger.com/atom/ns#" term="pseudo-randomness"/><title type='text'>Personalized voice recordings by Elwood &quot;You&#39;ve got mail!&quot; Edwards</title><content type='html'>If you&#39;re old enough to have ever used, seen or overheard the once ubiquitous AOL software you&#39;ll have heard the voice of Elwood Edwards. His voice was known to millions for saying &quot;You&#39;ve got mail!&quot;, &quot;Welcome&quot;, &quot;File&#39;s done&quot; and &quot;Goodbye&quot; when using the AOL software. He &lt;a href=&quot;https://www.nytimes.com/2024/11/07/technology/elwood-edwards-aol-dead.html&quot;&gt;died last week&lt;/a&gt; which reminded me of the time I paid him to record a customized greeting for me.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here&#39;s Elwood Edwards explaining how that came about:&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;iframe allowfullscreen=&quot;&quot; class=&quot;BLOG_video_class&quot; height=&quot;266&quot; src=&quot;https://www.youtube.com/embed/yKgiqsdyiAA&quot; width=&quot;320&quot; youtube-src-id=&quot;yKgiqsdyiAA&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;Back in the early 2000s I was working on a machine learning email filtering program called &lt;a href=&quot;https://en.wikipedia.org/wiki/POPFile&quot;&gt;POPFile&lt;/a&gt;&amp;nbsp;and I discovered that Elwood Edwards had a web site &lt;a href=&quot;https://web.archive.org/web/20080613203307/http://www.makinwavs.com/&quot;&gt;makinwavs.com&lt;/a&gt;&amp;nbsp;where you could order custom messages recorded by him in that &quot;AOL voice&quot;.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKrbUDC8NAGhFzCk3ztPZbvakGP4LrkXogIWWXL2-Iakrme-DKKvz5FAgA2EWRDA13mOBceClcVlvKvJn5uWH1N2AGjRUh0_ih-wEfORNoApKB-ZOkOQQYa52qPUYHVzsierokO3eterq0eTxlVsMhfalgbtUTYrzAcKIvyOkPEl_vHrWEbh0BYg/s1536/aol-1.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1022&quot; data-original-width=&quot;1536&quot; height=&quot;426&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKrbUDC8NAGhFzCk3ztPZbvakGP4LrkXogIWWXL2-Iakrme-DKKvz5FAgA2EWRDA13mOBceClcVlvKvJn5uWH1N2AGjRUh0_ih-wEfORNoApKB-ZOkOQQYa52qPUYHVzsierokO3eterq0eTxlVsMhfalgbtUTYrzAcKIvyOkPEl_vHrWEbh0BYg/w640-h426/aol-1.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;So, I ordered &quot;Mail classified by POPFile&quot; and &quot;Use the source, Luke!&quot; from him for a total cost of $30. Here&#39;s the original PayPal receipt:&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; Date: Wed, 13 Nov 2002 11:54:25 -0800&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; From: [email protected]&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; Subject: Receipt for your Payment&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; This email confirms that you have paid EVO, Inc. $30.00&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; using PayPal.&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; This credit card transaction will appear on your bill as&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &quot;PAYPAL*EVO INC&quot;.&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; SHOPPING CART CONTENTS:&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; 1.&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; Item Name:&amp;nbsp; &amp;nbsp;Custom set of 5 non-AOL&amp;nbsp; .WAV Files&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; Option 1:&amp;nbsp; &amp;nbsp; Enter your 5 scripts:: &quot;Use the source, Luke!&quot;,&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;Mail classified by POPFile&quot;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; Option 2:&amp;nbsp; &amp;nbsp; (If needed, enter more info):: (Yep, I know it&#39;s&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; only two, but that&#39;s all I need...)&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; Item Number: EVO-4&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; Item Amount: $30.00&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; Quantity:&amp;nbsp; &amp;nbsp; 1&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Total:&amp;nbsp; &amp;nbsp; $30.00&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Cart Subtotal:&amp;nbsp; $30.00&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Handling:&amp;nbsp; $0.00&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Shipping:&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; Sales Tax (0.000%):&amp;nbsp; $0.00&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Cart Total:&amp;nbsp; $30.00&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; ------------------------------&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; Payment Details:&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; ------------------------------&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; Amount: $30.00&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; Buyer: John Graham-Cumming&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; ------------------------------&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; Business Information:&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; ------------------------------&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; Business: EVO, Inc.&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; Contact E-Mail: [email protected]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;Three days later I had three voice files (the two I&#39;d ordered plus he threw in &quot;You&#39;ve got mail, John!&quot; for free).&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; From: [email protected]&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; Date: Sat, 16 Nov 2002 22:16:04 -0500&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; Subject: Your files :)&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; Hi, John.&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; Thanks for your order.&amp;nbsp; Here are your files... and I included a&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &quot;You&#39;ve got mail, John&quot; file, too.&amp;nbsp; Enjoy!!&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; El Edwards&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;You can hear all three original files below.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;br /&gt;&lt;/div&gt;
  
  &lt;iframe allow=&quot;autoplay&quot; frameborder=&quot;no&quot; height=&quot;166&quot; scrolling=&quot;no&quot; src=&quot;https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/1953136867&amp;amp;color=%23ff5500&amp;amp;auto_play=false&amp;amp;hide_related=false&amp;amp;show_comments=true&amp;amp;show_user=true&amp;amp;show_reposts=false&amp;amp;show_teaser=true&quot; width=&quot;100%&quot;&gt;&lt;/iframe&gt;&lt;div style=&quot;color: #cccccc; font-family: Interstate, &amp;quot;Lucida Grande&amp;quot;, &amp;quot;Lucida Sans Unicode&amp;quot;, &amp;quot;Lucida Sans&amp;quot;, Garuda, Verdana, Tahoma, sans-serif; font-size: 10px; font-weight: 100; line-break: anywhere; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; word-break: normal;&quot;&gt;&lt;a href=&quot;https://soundcloud.com/john-graham-cumming&quot; style=&quot;color: #cccccc; text-decoration: none;&quot; target=&quot;_blank&quot; title=&quot;John Graham-Cumming&quot;&gt;John Graham-Cumming&lt;/a&gt; · &lt;a href=&quot;https://soundcloud.com/john-graham-cumming/mail-classified-by-popfile&quot; style=&quot;color: #cccccc; text-decoration: none;&quot; target=&quot;_blank&quot; title=&quot;Mail classified by POPFile&quot;&gt;Mail classified by POPFile&lt;/a&gt;&lt;/div&gt;
  
  &lt;iframe allow=&quot;autoplay&quot; frameborder=&quot;no&quot; height=&quot;166&quot; scrolling=&quot;no&quot; src=&quot;https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/1953162831&amp;amp;color=%23ff5500&amp;amp;auto_play=false&amp;amp;hide_related=false&amp;amp;show_comments=true&amp;amp;show_user=true&amp;amp;show_reposts=false&amp;amp;show_teaser=true&quot; width=&quot;100%&quot;&gt;&lt;/iframe&gt;&lt;div style=&quot;color: #cccccc; font-family: Interstate, &amp;quot;Lucida Grande&amp;quot;, &amp;quot;Lucida Sans Unicode&amp;quot;, &amp;quot;Lucida Sans&amp;quot;, Garuda, Verdana, Tahoma, sans-serif; font-size: 10px; font-weight: 100; line-break: anywhere; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; word-break: normal;&quot;&gt;&lt;a href=&quot;https://soundcloud.com/john-graham-cumming&quot; style=&quot;color: #cccccc; text-decoration: none;&quot; target=&quot;_blank&quot; title=&quot;John Graham-Cumming&quot;&gt;John Graham-Cumming&lt;/a&gt; · &lt;a href=&quot;https://soundcloud.com/john-graham-cumming/use-the-source-luke&quot; style=&quot;color: #cccccc; text-decoration: none;&quot; target=&quot;_blank&quot; title=&quot;Use the source, Luke!&quot;&gt;Use the source, Luke!&lt;/a&gt;&lt;/div&gt;
  
  &lt;iframe allow=&quot;autoplay&quot; frameborder=&quot;no&quot; height=&quot;166&quot; scrolling=&quot;no&quot; src=&quot;https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/1953163075&amp;amp;color=%23ff5500&amp;amp;auto_play=false&amp;amp;hide_related=false&amp;amp;show_comments=true&amp;amp;show_user=true&amp;amp;show_reposts=false&amp;amp;show_teaser=true&quot; width=&quot;100%&quot;&gt;&lt;/iframe&gt;&lt;div style=&quot;color: #cccccc; font-family: Interstate, &amp;quot;Lucida Grande&amp;quot;, &amp;quot;Lucida Sans Unicode&amp;quot;, &amp;quot;Lucida Sans&amp;quot;, Garuda, Verdana, Tahoma, sans-serif; font-size: 10px; font-weight: 100; line-break: anywhere; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; word-break: normal;&quot;&gt;&lt;a href=&quot;https://soundcloud.com/john-graham-cumming&quot; style=&quot;color: #cccccc; text-decoration: none;&quot; target=&quot;_blank&quot; title=&quot;John Graham-Cumming&quot;&gt;John Graham-Cumming&lt;/a&gt; · &lt;a href=&quot;https://soundcloud.com/john-graham-cumming/youve-got-mail-john&quot; style=&quot;color: #cccccc; text-decoration: none;&quot; target=&quot;_blank&quot; title=&quot;You&#39;ve got mail, John!&quot;&gt;You&#39;ve got mail, John!&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jgc.org/feeds/3123313590817156000/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/19303585/3123313590817156000' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19303585/posts/default/3123313590817156000'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19303585/posts/default/3123313590817156000'/><link rel='alternate' type='text/html' href='http://blog.jgc.org/2024/11/personalized-voice-recordings-by-elwood.html' title='Personalized voice recordings by Elwood &quot;You&#39;ve got mail!&quot; Edwards'/><author><name>Unknown</name><email>[email protected]</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/yKgiqsdyiAA/default.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19303585.post-1064951669793470512</id><published>2024-10-08T17:13:00.001+00:00</published><updated>2024-10-08T17:13:00.110+00:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="pseudo-randomness"/><title type='text'>Rabbit hole: stumbling across two Portuguese punched cards</title><content type='html'>&lt;p&gt;Look, here&#39;s the thing, I don&#39;t like mysteries that involve technology. I think I hate them because I know that some other human created the thing I&#39;m staring at and, dammit, I should be able to understand it.&amp;nbsp;&lt;/p&gt;&lt;p&gt;And, then one day I was browsing in one of those places where people leave books for others to take. I flipped through an old Portuguese book about computers published in the 1970s and two punched cards fell out.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzBivbRxiU1_S2lVCnPEW6QHF5ZZwXoDF7ODp9vST3nLSOd5cLjto0enI9RiFWSi2WE3iey6pNOhn03neYX5j7JsNjCuvTpyak6WxwJXbEAfa2OILkjlQh7aNSJQGjV_iVKzQbuMvmCHBmWFEc0Gqawtgm5suMfq5CESmvSiDFxwjGgX2_7NST9A/s3078/punch-1.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;2840&quot; data-original-width=&quot;3078&quot; height=&quot;590&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzBivbRxiU1_S2lVCnPEW6QHF5ZZwXoDF7ODp9vST3nLSOd5cLjto0enI9RiFWSi2WE3iey6pNOhn03neYX5j7JsNjCuvTpyak6WxwJXbEAfa2OILkjlQh7aNSJQGjV_iVKzQbuMvmCHBmWFEc0Gqawtgm5suMfq5CESmvSiDFxwjGgX2_7NST9A/w640-h590/punch-1.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;Nerd. Sniped. By. Gravity.&lt;/p&gt;&lt;p&gt;One punched card contains the data &lt;span style=&quot;font-family: courier;&quot;&gt;M000015 JOAO A. FERNANDES 150000190&lt;/span&gt; and the other &lt;span style=&quot;font-family: courier;&quot;&gt;1000015 100170476&lt;/span&gt;. OK, so &lt;span style=&quot;font-family: courier;&quot;&gt;000015&lt;/span&gt; is probably some sort of identifier (employee ID?) but the other numbers are a mystery. Could they be Portuguese &lt;a href=&quot;https://pt.wikipedia.org/wiki/N%C3%BAmero_de_identifica%C3%A7%C3%A3o_fiscal&quot;&gt;tax identification numbers&lt;/a&gt; (NIFs)? Those start with 1, 2 or 3 (for individuals) and are nine digits.&lt;/p&gt;&lt;p&gt;Nope. I wrote some &lt;a href=&quot;https://gist.github.com/jgrahamc/ae5b030be5cdffb424d1ae126023190f&quot;&gt;code to verify the NIF&#39;s&lt;/a&gt; check digit and both aren&#39;t NIFs.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;use strict;&lt;br /&gt;use warnings;&lt;br /&gt;sub nif_check {&lt;br /&gt;&amp;nbsp; &amp;nbsp; my ($nif) = @_;&lt;br /&gt;&amp;nbsp; &amp;nbsp; my $check = 0;&lt;br /&gt;&amp;nbsp; &amp;nbsp; foreach my $i (reverse 0..7) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $check += substr($nif, $i, 1) * (9-$i);&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; $check %= 11;&lt;br /&gt;&amp;nbsp; &amp;nbsp; if ($check &amp;lt; 2) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $check = 0;&lt;br /&gt;&amp;nbsp; &amp;nbsp; } else {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $check = 11 - $check;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; print &quot;$nif $check\n&quot;;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;nif_check($ARGV[0]);&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;$ perl nif.pl 100170476&lt;br /&gt;100170476 1&lt;br /&gt;$ perl nif.pl 150000190&lt;br /&gt;150000190 7&lt;/span&gt;&lt;/p&gt;&lt;p&gt;So what&#39;s encoded on these cards? And does &lt;span style=&quot;font-family: courier;&quot;&gt;000015&lt;/span&gt; mean they are related?&lt;/p&gt;&lt;p&gt;I found the answer starting with the fact that these punched cards are custom printed with the letters&amp;nbsp;&lt;b&gt;In Es Me&lt;/b&gt; on them. What&#39;s In Es Me? It took a while to answer that, but it turns out that In Es Me was a business called &quot;Instituto de Estudos Mecanográficos&quot; based in Lisbon in the late 1960s and early 1970s.&amp;nbsp;&lt;/p&gt;&lt;p&gt;It appears to have been a school that taught people the exciting new world of computing, which, they claim in their advertisements was &quot;Uma profissão actual e rentavel&quot; (A modern and profitable profession) and also &quot;Uma das profissões de melhor futuro&quot; (One of the professions with a great future).&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8m_FT4M0kIoM5N7QKWv35i1FFYfvugT3Fn9MxknuRbKMdsWnwSneClbVdDCxhbIsTPYicsZmaD-pCLKvjZnxkPNcismZaqlIK7jAGKUsuzg_v2lu1DoclTwScNf0UicI-8EkGgFlr1w-EGVqDr0VZiM0MDEvEyryRHAlUR9LYWqBjqHQZz9E5Dg/s1230/punch-4.jpeg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;666&quot; data-original-width=&quot;1230&quot; height=&quot;216&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8m_FT4M0kIoM5N7QKWv35i1FFYfvugT3Fn9MxknuRbKMdsWnwSneClbVdDCxhbIsTPYicsZmaD-pCLKvjZnxkPNcismZaqlIK7jAGKUsuzg_v2lu1DoclTwScNf0UicI-8EkGgFlr1w-EGVqDr0VZiM0MDEvEyryRHAlUR9LYWqBjqHQZz9E5Dg/w400-h216/punch-4.jpeg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-RLe3aytS2tESLnotW85eYivXA-ox4Ol7kwkzv2XLAJ-XILpuyW_TYMUMvjs7pXmDyeow2DGeVlg-sa_baJiUSDuT1CNcpT8LN6e3SCrk2w3V_nJfABqLpAfe0XKOXK-GzX_veURmCXVEMHmvcpHYanXOamhNfddnJiQ_WskW04gdpsdTNjb27g/s630/punch-3.jpeg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;306&quot; data-original-width=&quot;630&quot; height=&quot;194&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-RLe3aytS2tESLnotW85eYivXA-ox4Ol7kwkzv2XLAJ-XILpuyW_TYMUMvjs7pXmDyeow2DGeVlg-sa_baJiUSDuT1CNcpT8LN6e3SCrk2w3V_nJfABqLpAfe0XKOXK-GzX_veURmCXVEMHmvcpHYanXOamhNfddnJiQ_WskW04gdpsdTNjb27g/w400-h194/punch-3.jpeg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjl2CF-LCR2xi5kQWLmm3C_ON-ojZVXu7ZvKPrIqkHYWwR416VTa54HEcwLDopBCQuEumuThhbw3rtv3GOrxcmYf7kfqyRAuOOvtrwnw2RbPqS5l0l5Q8PQZr71QFGvDWhb1F8VjIJTAHbf-BExcjTIUq5IlfSftu_KyrmuXHBHVGZmtgIDSDDbnQ/s852/punch-2.jpeg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;852&quot; data-original-width=&quot;766&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjl2CF-LCR2xi5kQWLmm3C_ON-ojZVXu7ZvKPrIqkHYWwR416VTa54HEcwLDopBCQuEumuThhbw3rtv3GOrxcmYf7kfqyRAuOOvtrwnw2RbPqS5l0l5Q8PQZr71QFGvDWhb1F8VjIJTAHbf-BExcjTIUq5IlfSftu_KyrmuXHBHVGZmtgIDSDDbnQ/w360-h400/punch-2.jpeg&quot; width=&quot;360&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;Great, but apparently no closer to knowing about João&amp;nbsp;A. Fernandes and those numbers. But then I discovered someone selling a book called &quot;Introdução aos Ordenadores&quot; (Introduction to Computers) which was apparently distributed by In Es Me exclusively in Portugal:&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXU8N7ORFPdX4xEXGOsz2nYf358cooye4NcrfF6PbzJr_ggkGZ2h7Mtd5E_VIwPKvXuRvuW7SBwEpmma9gqF8z3eU1nPDKTkIG3omQnvA-DugK_x8GcJxHyX650JYeuE3u2Vn8LJD14U8tR0ZABIo6xvwmQDw5kO38xmUTU6mqnSIaqovj2uVMYg/s4032/punch-6.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;4032&quot; data-original-width=&quot;3024&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXU8N7ORFPdX4xEXGOsz2nYf358cooye4NcrfF6PbzJr_ggkGZ2h7Mtd5E_VIwPKvXuRvuW7SBwEpmma9gqF8z3eU1nPDKTkIG3omQnvA-DugK_x8GcJxHyX650JYeuE3u2Vn8LJD14U8tR0ZABIo6xvwmQDw5kO38xmUTU6mqnSIaqovj2uVMYg/w480-h640/punch-6.jpg&quot; width=&quot;480&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeh-we5W8BMwW8pmeOW94gzR9GEIjQEEMBD-zEKMbzkDCNCZvECrELW8IRNk-jJryVToQWwOLdHcc7CKeQ4QlNPVswhgwfOjXcOTuIWOpqwVcKnW9A3PBUFoGssqGxBinzX6d5K_016e2OgKzs-R3vnI845KgkG24Kz9gtwXvLds9g2flhSrOHKg/s5712/punch-5.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;5712&quot; data-original-width=&quot;4284&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeh-we5W8BMwW8pmeOW94gzR9GEIjQEEMBD-zEKMbzkDCNCZvECrELW8IRNk-jJryVToQWwOLdHcc7CKeQ4QlNPVswhgwfOjXcOTuIWOpqwVcKnW9A3PBUFoGssqGxBinzX6d5K_016e2OgKzs-R3vnI845KgkG24Kz9gtwXvLds9g2flhSrOHKg/w480-h640/punch-5.jpg&quot; width=&quot;480&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;div&gt;So, I bought it. And, inside that book on page 1-31, are the very two cards that had fallen from that other book. So, it looks like the cards were examples (perhaps from the training course) drawn from the book.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZrf73Ed4Avxgr_9RV79RNbKvGjSXf-iexlqOcB0bvRQKWyVow3DINJwVX8p3WIplqk73QFV1TMrLOJpqGRpo-YIOFwQUEXgBVcRIUHDNVhcp6xqmOQyWld1pnyxozzflq8_5Xq_kk29yTieFw7_cVBzcFPYPSMfA1xNs5CDvuGXWwSmfQdZlTXQ/s5234/punch-7.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;5234&quot; data-original-width=&quot;3691&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZrf73Ed4Avxgr_9RV79RNbKvGjSXf-iexlqOcB0bvRQKWyVow3DINJwVX8p3WIplqk73QFV1TMrLOJpqGRpo-YIOFwQUEXgBVcRIUHDNVhcp6xqmOQyWld1pnyxozzflq8_5Xq_kk29yTieFw7_cVBzcFPYPSMfA1xNs5CDvuGXWwSmfQdZlTXQ/w452-h640/punch-7.jpg&quot; width=&quot;452&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;The cards in the book are life size:&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpwQYe9LvFc7uzX6lW4OzRkqXkx3FpYpWzA0jG7U_VDRpArC2BqnUPx9sPgMlS7ZI3KHVr8WWAO5k78LRL3IULTmJMj8Cs3JwI3Xoo8AeWm1iu_q10YoEspqsiVyfTEDzPGYBegcsziTWZV1_pcgY0aXws_HGtBXKIA6xiF8w3IC_vKBy-7rt-Iw/s4610/punch-8.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;4610&quot; data-original-width=&quot;3271&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpwQYe9LvFc7uzX6lW4OzRkqXkx3FpYpWzA0jG7U_VDRpArC2BqnUPx9sPgMlS7ZI3KHVr8WWAO5k78LRL3IULTmJMj8Cs3JwI3Xoo8AeWm1iu_q10YoEspqsiVyfTEDzPGYBegcsziTWZV1_pcgY0aXws_HGtBXKIA6xiF8w3IC_vKBy-7rt-Iw/w454-h640/punch-8.jpg&quot; width=&quot;454&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;(Can you spot the printing error in the book?)&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;The good news is that the previous pages describe the numbers on those cards via the columns.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeAG9H-07UPNWYixd240URv8eQejewiZey_vn0iDqgio26o6M6DNssD_X36aX3-sDMH4k4T-92hk4GK6xeQLnGD-6y4W5CKsfEOOEniK9v5SgkEYE-1aA8PKipvjhkWUCf15gIRvMR8yeN_ov6Oac_WDkg9zFo4nv2wSswDhspGL4GZe9gqEgYmA/s5087/punch-9.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;5087&quot; data-original-width=&quot;3481&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeAG9H-07UPNWYixd240URv8eQejewiZey_vn0iDqgio26o6M6DNssD_X36aX3-sDMH4k4T-92hk4GK6xeQLnGD-6y4W5CKsfEOOEniK9v5SgkEYE-1aA8PKipvjhkWUCf15gIRvMR8yeN_ov6Oac_WDkg9zFo4nv2wSswDhspGL4GZe9gqEgYmA/w438-h640/punch-9.jpg&quot; width=&quot;438&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;Card code: column 1 (1)&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;Employee number: columns 2 to 7&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;Payment period: columns 33 to 38&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;Total hours worked: columns: 39 to 41&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXAtxo9_Q37ToY1oobyRHIX2jjCdb998xwA-ps-vH9efs6haiEfeV3H8wwzOfFUNI4zqZQPiNYzm_TGWNbuW-yhbO_q7AXws1XHTWhdKR164stDbyuIo8EXHHc1lHtU5HlCdup4n7sJRpFYPt9dMcme1Ua4-5YY_HY25EXDDgIIENo19pTwiT0eg/s3518/punch-10.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;2792&quot; data-original-width=&quot;3518&quot; height=&quot;318&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXAtxo9_Q37ToY1oobyRHIX2jjCdb998xwA-ps-vH9efs6haiEfeV3H8wwzOfFUNI4zqZQPiNYzm_TGWNbuW-yhbO_q7AXws1XHTWhdKR164stDbyuIo8EXHHc1lHtU5HlCdup4n7sJRpFYPt9dMcme1Ua4-5YY_HY25EXDDgIIENo19pTwiT0eg/w400-h318/punch-10.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;For the other card...&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;Card code: column 1 (M)&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;Employee number: columns 2 to 7&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;Name: columns: 8 to 32&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;Hourly salary: 42 to 46&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;Fixed discounts for the week: columns 47 to 50&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;So, &lt;span style=&quot;font-family: courier;&quot;&gt;000015&lt;/span&gt; is the employee number. &lt;span style=&quot;font-family: courier;&quot;&gt;150000190&lt;/span&gt; indicates that João&amp;nbsp;A. Fernandes is paid 15$000 (15 &lt;a href=&quot;https://en.wikipedia.org/wiki/Portuguese_escudo&quot;&gt;Portuguese escudos&lt;/a&gt;) per hour and there&#39;s a weekly discount (deductions from the salary) of 0$190. Note that for historical reasons sometimes the escudo is written with a three digit decimal, and because earlier on the book we&#39;re introduced to João and his colleagues I know that&#39;s the format being used.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgd3f_5eQUKrs5eUTIcpV9oLLfcQV5HISZ853B-d9ZPHcfVmcKSDqG2m1VQpOTK2_iCT20XvRZdy96t6rWIuiHI1Ab14g_TdYGnQExe5s4y3cE1sih9ALpZJk58Db9txKhDGETzYclCG-qtjtEymKJwtL5d0UN_xeZ-ESP1XdVqthvDgeCM6WPkVw/s5054/punch15.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;5054&quot; data-original-width=&quot;3122&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgd3f_5eQUKrs5eUTIcpV9oLLfcQV5HISZ853B-d9ZPHcfVmcKSDqG2m1VQpOTK2_iCT20XvRZdy96t6rWIuiHI1Ab14g_TdYGnQExe5s4y3cE1sih9ALpZJk58Db9txKhDGETzYclCG-qtjtEymKJwtL5d0UN_xeZ-ESP1XdVqthvDgeCM6WPkVw/w396-h640/punch15.jpg&quot; width=&quot;396&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;The other card is a record of his hours worked for a specific week: &lt;span style=&quot;font-family: courier;&quot;&gt;100170476&lt;/span&gt;. 10-01-70 is January 10, 1970 and indicates the week for which the record is generated. 476 is 47.6 hours of work.&lt;/div&gt;&lt;br /&gt;Mystery solved.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Well, almost, In Es Me didn&#39;t write this book. If you look at the title page it was apparently created by &quot;ENIASA&quot; and I&#39;ve found very little information about who they were. Oh well.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;PS Here&#39;s a little taste of what the book contains:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkoFgmwAZ0StQ5B8q5o4oVbwDKO62Mo_BfRVmk98XxYqqRiR8CEd3bcdczHO6XDKYavK_dVkPwmpnJ0xqY8l-N7mFglDe8ef4FpHTNN7k1AEbLWS1hAdcS_1PyG870QHZ4Sh4e-hAHyBwj0SfyX8R1sEWSKXY_NenosKG0OhYjK0rxsFV05HQH7A/s5712/punch-14.jpeg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;4060&quot; data-original-width=&quot;5712&quot; height=&quot;454&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkoFgmwAZ0StQ5B8q5o4oVbwDKO62Mo_BfRVmk98XxYqqRiR8CEd3bcdczHO6XDKYavK_dVkPwmpnJ0xqY8l-N7mFglDe8ef4FpHTNN7k1AEbLWS1hAdcS_1PyG870QHZ4Sh4e-hAHyBwj0SfyX8R1sEWSKXY_NenosKG0OhYjK0rxsFV05HQH7A/w640-h454/punch-14.jpeg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXjXXPuZ8x2RetLBJskjkTdl0kn8smvcv5q30loiD3FzodXI9LgyyW8XWpMzg5bEITMvA0BnvJhyphenhyphenpUHQ3_Dm-eqaLyQJRuYBAXlXz-1FR0W78-cCuFePlr_bCIgjjamIKiSOyOoBAnS_9ONEV1sw_uiEgeNChzpe61BLKqvZzW6E8nD4zOE-wudg/s5712/punch-13.jpeg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;4183&quot; data-original-width=&quot;5712&quot; height=&quot;468&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXjXXPuZ8x2RetLBJskjkTdl0kn8smvcv5q30loiD3FzodXI9LgyyW8XWpMzg5bEITMvA0BnvJhyphenhyphenpUHQ3_Dm-eqaLyQJRuYBAXlXz-1FR0W78-cCuFePlr_bCIgjjamIKiSOyOoBAnS_9ONEV1sw_uiEgeNChzpe61BLKqvZzW6E8nD4zOE-wudg/w640-h468/punch-13.jpeg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhac3KjmhSkfSNrG1zG26FdtdPC26UcGnF87JY5UTbSSwtxGUhHcVpQqvNWpKFMnTlDdVDlnjBdEsfeMCiQHN55tM8V0z9X6p8LrXXOmaKTDu05PHfbIL-ICVEIUji3L6YSOQkYRjburNah_ccyj-dSnCKS0_PxGWw_6B_fIOb7G1l0R8m5fCn7IA/s5712/punch-12.jpeg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;4284&quot; data-original-width=&quot;5712&quot; height=&quot;480&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhac3KjmhSkfSNrG1zG26FdtdPC26UcGnF87JY5UTbSSwtxGUhHcVpQqvNWpKFMnTlDdVDlnjBdEsfeMCiQHN55tM8V0z9X6p8LrXXOmaKTDu05PHfbIL-ICVEIUji3L6YSOQkYRjburNah_ccyj-dSnCKS0_PxGWw_6B_fIOb7G1l0R8m5fCn7IA/w640-h480/punch-12.jpeg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEik6-BEDP69FxkQKRGFglUbF9hlkKOkZhWY-y0J89-hzohN7iJ5tOWJgPJ7sCp6KmMg4vtTOwUwXemxPM07Tiea4PizR8vIeDdYf2D_35dFmN-RauE2LP8NcNyn-kFeedi9B1H27gVeHt5zL0TTLQJvF1Q6_knCcUjyWGJtnssAztUGS09GnEeDZQ/s5712/punch-11.jpeg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;4284&quot; data-original-width=&quot;5712&quot; height=&quot;480&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEik6-BEDP69FxkQKRGFglUbF9hlkKOkZhWY-y0J89-hzohN7iJ5tOWJgPJ7sCp6KmMg4vtTOwUwXemxPM07Tiea4PizR8vIeDdYf2D_35dFmN-RauE2LP8NcNyn-kFeedi9B1H27gVeHt5zL0TTLQJvF1Q6_knCcUjyWGJtnssAztUGS09GnEeDZQ/w640-h480/punch-11.jpeg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jgc.org/feeds/1064951669793470512/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/19303585/1064951669793470512' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19303585/posts/default/1064951669793470512'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19303585/posts/default/1064951669793470512'/><link rel='alternate' type='text/html' href='http://blog.jgc.org/2024/10/rabbit-hole-stumbling-across-two.html' title='Rabbit hole: stumbling across two Portuguese punched cards'/><author><name>Unknown</name><email>[email protected]</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzBivbRxiU1_S2lVCnPEW6QHF5ZZwXoDF7ODp9vST3nLSOd5cLjto0enI9RiFWSi2WE3iey6pNOhn03neYX5j7JsNjCuvTpyak6WxwJXbEAfa2OILkjlQh7aNSJQGjV_iVKzQbuMvmCHBmWFEc0Gqawtgm5suMfq5CESmvSiDFxwjGgX2_7NST9A/s72-w640-h590-c/punch-1.jpg" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19303585.post-522901623747231800</id><published>2024-09-27T20:25:00.004+00:00</published><updated>2024-12-28T15:56:23.852+00:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="pseudo-randomness"/><title type='text'>I made a rubbish clock</title><content type='html'>&lt;p&gt;With separate plastic, metal, paper, and glass recycling, composting, and pick up of all the rest, knowing which days to put out which bins can be complicated. Some have turned to high-tech solutions like Darren Tarbard&#39;s wonderful &quot;&lt;a href=&quot;https://x.com/tarbard/status/1002464120447397888&quot;&gt;bindicator&lt;/a&gt;&quot;.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://x.com/tarbard/status/1002464120447397888&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;835&quot; data-original-width=&quot;900&quot; height=&quot;371&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisozadvkoI9CxySkzJNcnOY_o2vZNWnv2gonXZ-K3eYn24dsIy5j7DoEHNxNShAVd-OBqk1PUMGRqJvSdmOs10lTHYGTlCgYz7uqOjXD_vf57eKTbMPeedRuCETBjUWnp-Sh9mIDxK0vMqp_va2txelYdG8f_9Yem8IweeCIQlhclFQi7HwOIlNA/w400-h371/Del3rp-WsAES2IE.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;There&#39;s even a&amp;nbsp;&lt;a href=&quot;https://www.bindicator.net/&quot;&gt;commercial version&lt;/a&gt;&amp;nbsp;of that.&lt;/p&gt;&lt;p&gt;I thought about making something similar, but decided that a high-tech solution isn&#39;t always the right one. Instead I made a clock, or rather a clock face. My rationale was as follows: the bin days don&#39;t change frequently so no need to call an API to get them, and anyway most councils don&#39;t have an API for this sort of thing. Also, I really didn&#39;t want yet another thing with a wall wart, or WiFi to configure, or code to debug (there comes a time in every programmer&#39;s life when they can&#39;t face debugging yet another thing that should be simple and just work).&amp;nbsp;&lt;/p&gt;&lt;p&gt;Not everything needs to be Turing Complete! But you can buy cheap clock mechanisms where the hand go full circle in seven days instead of 12 hours. Something like &lt;a href=&quot;https://www.youngtownco.com/en/product-496882/7-Days-Week-Clock-Movement-12888SDWK.html&quot;&gt;this&lt;/a&gt;.&amp;nbsp;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsdpeNHoK98X_LNj45s4b71ULFC-yEBbTAAC5Dt3Mp6jfwfE6FnMHw80boTFqBF1pbTeDye9C8S6fY-UAQfjlk0uxJj_o7-9RsoB5psG_mMfG5EhI7H5QpwQ4w_cPgtL95VIpBKSzb75r3aXV7BBPcPAbuqUzUwif5uxm-LFQZJofvnmctDB9uVQ/s508/lixo-2.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;500&quot; data-original-width=&quot;508&quot; height=&quot;315&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsdpeNHoK98X_LNj45s4b71ULFC-yEBbTAAC5Dt3Mp6jfwfE6FnMHw80boTFqBF1pbTeDye9C8S6fY-UAQfjlk0uxJj_o7-9RsoB5psG_mMfG5EhI7H5QpwQ4w_cPgtL95VIpBKSzb75r3aXV7BBPcPAbuqUzUwif5uxm-LFQZJofvnmctDB9uVQ/s320/lixo-2.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;So, I wrote a bunch of code to produce an SVG (and PDF and PNG) for the clock face. The code is &lt;a href=&quot;https://github.com/jgrahamc/lixo&quot;&gt;here&lt;/a&gt;. You end up with something like this which can be printed.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi50DJtFU-77BZVN0Zidd-1XHQNnQqwL2EDdX6sPvxlJgWOj2OvrzHjcoNZk7-GoxbPrFlcoTH6ijQ7Jrtp5vk3v7Vedt9JAH-3Rd7yzPGY427oDsqkrinfduN0NJb02z2dDsM91tR-xxAianznNcIVOr50eIedZmBL_XVlhVpwApRi2PEPPU7i4g/s2362/lixo.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;2362&quot; data-original-width=&quot;2362&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi50DJtFU-77BZVN0Zidd-1XHQNnQqwL2EDdX6sPvxlJgWOj2OvrzHjcoNZk7-GoxbPrFlcoTH6ijQ7Jrtp5vk3v7Vedt9JAH-3Rd7yzPGY427oDsqkrinfduN0NJb02z2dDsM91tR-xxAianznNcIVOr50eIedZmBL_XVlhVpwApRi2PEPPU7i4g/w400-h400/lixo.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;The colours and wording are all determined by the &lt;span style=&quot;font-family: courier;&quot;&gt;schd&lt;/span&gt; and &lt;span style=&quot;font-family: courier;&quot;&gt;bins&lt;/span&gt; variables. The code should be easy to customize for your location&#39;s schedule. It supports up to two different bin types per day. If you need more you&#39;ll have to modify the code.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;bins = {&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&quot;none&quot;: [&quot;white&quot;, &quot;&quot;],&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&quot;lixo&quot;: [&quot;#72859E&quot;, &quot;Lixo&quot;],&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&quot;papl&quot;: [&quot;#255FC9&quot;, &quot;Papel&quot;],&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&quot;embl&quot;: [&quot;#DED044&quot;, &quot;Embalagens&quot;],&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;days = [&quot;Sun&quot;, &quot;Mon&quot;, &quot;Tues&quot;, &quot;Wednes&quot;, &quot;Thurs&quot;, &quot;Fri&quot;, &quot;Satur&quot;]&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;schd = [[&quot;none&quot;],&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&amp;nbsp; &amp;nbsp; [&quot;lixo&quot;],&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;[&quot;papl&quot;, &quot;embl&quot;],&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&amp;nbsp; [&quot;lixo&quot;],&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt; [&quot;papl&quot;],&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;[&quot;lixo&quot;, &quot;embl&quot;],&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;[&quot;papl&quot;]]&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;There&#39;s no need for you to use Portuguese; I have because I&#39;m dealing with Portuguese rubbish collection.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;The only interesting piece of code is the generation of the curves for the seven daily segments (and also for the curved wording). This is done by the function &lt;span style=&quot;font-family: courier;&quot;&gt;path&lt;/span&gt;:&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;def getXY(p, r, s):&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;a = 2.0 * math.pi * (p * pps + rot)&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;return s % (r * math.cos(a),&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; r * math.sin(a))&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;def path(p, r):&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;s = &quot; %.2f %.2f &quot;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;pa = &quot;M&quot;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;pa += getXY(p, r, s)&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;pa += &quot;A %.2f %.2f 0 0 1&quot; % (r, r)&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;pa += getXY((p+1), r, s)&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;return pa&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;In SVG you can define a &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Paths&quot;&gt;path&lt;/a&gt; element which can be used to make all sorts of curves, arcs, and lines. My &lt;span style=&quot;font-family: courier;&quot;&gt;path&lt;/span&gt; function takes two parameters: &lt;span style=&quot;font-family: courier;&quot;&gt;p&lt;/span&gt; is a number between zero and six representing the seven daily segments needed on the clock; &lt;span style=&quot;font-family: courier;&quot;&gt;r&lt;/span&gt; is the radius of the arc. The function uses &lt;span style=&quot;font-family: courier;&quot;&gt;getXY&lt;/span&gt; to find the position of a point on the arc. It does this twice to find the start and end point.&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;So, path ends up returning something like &lt;span style=&quot;font-family: courier;&quot;&gt;M x0 y0 A r r 0 0 1 x1 y1&lt;/span&gt; where &lt;span style=&quot;font-family: courier;&quot;&gt;x0&lt;/span&gt;, &lt;span style=&quot;font-family: courier;&quot;&gt;y0&lt;/span&gt;, &lt;span style=&quot;font-family: courier;&quot;&gt;x1&lt;/span&gt;, &lt;span style=&quot;font-family: courier;&quot;&gt;y1&lt;/span&gt; are the calculated end points of the arc and &lt;span style=&quot;font-family: courier;&quot;&gt;r&lt;/span&gt; is the radius of the arc. The &lt;span style=&quot;font-family: courier;&quot;&gt;M x0 y0&lt;/span&gt; means &quot;move to (&lt;span style=&quot;font-family: courier;&quot;&gt;x0&lt;/span&gt;, &lt;span style=&quot;font-family: courier;&quot;&gt;y0&lt;/span&gt;)&quot; The&amp;nbsp;&lt;span style=&quot;font-family: courier;&quot;&gt;A r r 0 0 1 x1 y1&lt;/span&gt;&amp;nbsp;means &quot;draw an &lt;a href=&quot;https://www.w3.org/TR/SVG/paths.html#PathDataEllipticalArcCommands&quot;&gt;arc&lt;/a&gt; of radius r to the point (&lt;span style=&quot;font-family: courier;&quot;&gt;x1&lt;/span&gt;, &lt;span style=&quot;font-family: courier;&quot;&gt;y1&lt;/span&gt;)&quot;. The &lt;span style=&quot;font-family: courier;&quot;&gt;0 0 1&lt;/span&gt; in the middle correspond to three parameters:&amp;nbsp;x-axis-rotation, large-arc-flag, and sweep-flag; it&#39;s best to refer to the documentation for those because they determine the direction in which the arc points and whether it is rotated.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;The final part of the path SVG element, &lt;span style=&quot;font-family: courier;&quot;&gt;L 0 0&lt;/span&gt;, is added elsewhere in the code. It sets the centre of the arc at (&lt;span style=&quot;font-family: courier;&quot;&gt;0&lt;/span&gt;, &lt;span style=&quot;font-family: courier;&quot;&gt;0&lt;/span&gt;). I used the &lt;span style=&quot;font-family: courier;&quot;&gt;viewBox&lt;/span&gt; attribute of the SVG to make the SVG geometry be between (&lt;span style=&quot;font-family: courier;&quot;&gt;-1&lt;/span&gt;, &lt;span style=&quot;font-family: courier;&quot;&gt;-1&lt;/span&gt;) and (&lt;span style=&quot;font-family: courier;&quot;&gt;1&lt;/span&gt;, &lt;span style=&quot;font-family: courier;&quot;&gt;1&lt;/span&gt;) thus making the centre of the image (&lt;span style=&quot;font-family: courier;&quot;&gt;0&lt;/span&gt;, &lt;span style=&quot;font-family: courier;&quot;&gt;0&lt;/span&gt;).&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;print(&#39;&amp;lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; viewBox=&quot;-1 -1 2 2&quot; width=&quot;%s&quot; height=&quot;%s&quot;&amp;gt;&#39; % (wh, wh))&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;Armed with a suitable printed clock face, I got a simple square picture frame, a few bits of wood for spacers, and put it all together into a &quot;rubbish clock&quot;.&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://flyingtiger.com/pt-pt/products/black-picture-frame-20x20-cm-3034806&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1200&quot; data-original-width=&quot;1200&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjLt5yQO3Yskdk8xTXFjHTL_PwvbRm5PmqrTMMXHrTnaEuCPRsnqrvgGzb_qs6pPHiK_pfsHZSgzQoYuPfbu1mUZoLuhyphenhyphenDGyedf_kURe3UIPm1TRJPhewAKwHSRTWWw9pLQwtn0XJspWp_m-ogVQv0oPDMvs9le2MBGPkKglSaXkSzlpuYV7oXcA/w640-h640/lixo-4.webp&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;a href=&quot;https://flyingtiger.com/pt-pt/products/black-picture-frame-20x20-cm-3034806&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1200&quot; data-original-width=&quot;1200&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixHHRXpURAEsmK_bYXaQyR8iLSGK14efmCSbFsmie4tRUsvd9kZzzk9ZiOy79k9TDl5t4PRcRhyqwFXU0qlhdmnMfiWLguPb8mszXhjrcpMxhtBvp0ecFu7GPL7UiPDq8Xzl8usb0LuKuJIQzZd7a08DYdPJvNIdK2fub3Fixs09_G0CqPAMG8JA/w640-h640/lixo-3.webp&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpj8fOLwk9PArF_K9sUwkYhSCZVRmwC7xmI-wvs32RetBhwFdTOzRdFOzDg6gXEn-taEu3SQW5hJz78Zrkryl5x5ReEr9iexphsiMabORQfh4BqLzNWzkgVhbcF5zNMWeTbWikEwyPkhbaZwFtQBy6_TMFOz-ZH48-owPvbaUZaeyGWnrWACnR1g/s1200/lixo-5.jpg&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1200&quot; data-original-width=&quot;1200&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpj8fOLwk9PArF_K9sUwkYhSCZVRmwC7xmI-wvs32RetBhwFdTOzRdFOzDg6gXEn-taEu3SQW5hJz78Zrkryl5x5ReEr9iexphsiMabORQfh4BqLzNWzkgVhbcF5zNMWeTbWikEwyPkhbaZwFtQBy6_TMFOz-ZH48-owPvbaUZaeyGWnrWACnR1g/w640-h640/lixo-5.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvTpcZoantZ16120z-lQK12YKhHkbb_lXVQEdznDiWKicX4J4EoD4yaibwH_iROLsHVCkeh4qti2xmslW-u5Qy96-5OkdfmK_l4-bpLHcezEPtQyNkR-9NuW9ZNDwVHRSO91S1kQZTHPtXZdQdcaFCxWSQFLwLz8y-NFx5oT2AMLi3SqVEzQ0_KQ/s1200/lixo-7.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;953&quot; data-original-width=&quot;1200&quot; height=&quot;509&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvTpcZoantZ16120z-lQK12YKhHkbb_lXVQEdznDiWKicX4J4EoD4yaibwH_iROLsHVCkeh4qti2xmslW-u5Qy96-5OkdfmK_l4-bpLHcezEPtQyNkR-9NuW9ZNDwVHRSO91S1kQZTHPtXZdQdcaFCxWSQFLwLz8y-NFx5oT2AMLi3SqVEzQ0_KQ/w640-h509/lixo-7.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jgc.org/feeds/522901623747231800/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/19303585/522901623747231800' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19303585/posts/default/522901623747231800'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19303585/posts/default/522901623747231800'/><link rel='alternate' type='text/html' href='http://blog.jgc.org/2024/09/i-made-rubbish-clock.html' title='I made a rubbish clock'/><author><name>Unknown</name><email>[email protected]</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisozadvkoI9CxySkzJNcnOY_o2vZNWnv2gonXZ-K3eYn24dsIy5j7DoEHNxNShAVd-OBqk1PUMGRqJvSdmOs10lTHYGTlCgYz7uqOjXD_vf57eKTbMPeedRuCETBjUWnp-Sh9mIDxK0vMqp_va2txelYdG8f_9Yem8IweeCIQlhclFQi7HwOIlNA/s72-w400-h371-c/Del3rp-WsAES2IE.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19303585.post-105942708803926021</id><published>2024-09-07T16:40:00.001+00:00</published><updated>2024-09-12T08:57:35.147+00:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="codes and ciphers"/><category scheme="http://www.blogger.com/atom/ns#" term="hits"/><category scheme="http://www.blogger.com/atom/ns#" term="retro"/><category scheme="http://www.blogger.com/atom/ns#" term="security"/><title type='text'>Cracking an old ZIP file to help open source the ANC&#39;s &quot;Operation Vula&quot; secret crypto code</title><content type='html'>&lt;p&gt;It&#39;s not often that you find yourself staring at code that few people have ever seen, code that was an important part in bringing down the apartheid system in South Africa, and code that was used for secure communication using one-time pads smuggled into South Africa by a flight attendant on floppy disks. But I found myself doing that one morning recently after having helped decrypt a 30 year old PKZIP file whose password had long been forgotten.&lt;/p&gt;&lt;p&gt;Some time ago I became interested in the secure communications used by the &lt;a href=&quot;https://en.wikipedia.org/wiki/African_National_Congress&quot;&gt;ANC&lt;/a&gt; as part of &lt;a href=&quot;https://en.wikipedia.org/wiki/Operation_Vula&quot;&gt;Operation Vula&lt;/a&gt; in the late 1980s. Operation Vula was the infiltration of ANC leaders (and materiel) into South Africa to set up an underground network bringing together the various elements of ANC activism operating inside the country.&amp;nbsp;&lt;/p&gt;&lt;p&gt;The operation needed secure communications to be successful and these were established using 8-bit computers, DTMF tones, acoustic couplers and a variety of other equipment for exchanging one-time pad encrypted messages using programs written in &lt;a href=&quot;https://en.wikipedia.org/wiki/PowerBASIC&quot;&gt;PowerBASIC&lt;/a&gt;.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7c14emcAhruoYELH_YTk0Gl_SMkPPV8rRdmnjs21QQGiGZoAGn0rnBR2SeSXd4bAQqF83Kgu6bRKkeGjhWXPpzlqJfKkrnuMfNlfZ0CCej9dmGMDlQvDP24Ka3iorprn474jZ_ZUCANTiu9EBC0FLUmjpug9avwL4eoCx3qeX9afO2v3SsqaGdg/s460/171421935.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;460&quot; data-original-width=&quot;460&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7c14emcAhruoYELH_YTk0Gl_SMkPPV8rRdmnjs21QQGiGZoAGn0rnBR2SeSXd4bAQqF83Kgu6bRKkeGjhWXPpzlqJfKkrnuMfNlfZ0CCej9dmGMDlQvDP24Ka3iorprn474jZ_ZUCANTiu9EBC0FLUmjpug9avwL4eoCx3qeX9afO2v3SsqaGdg/s16000/171421935.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;I won&#39;t go into the detail of how this worked as &lt;a href=&quot;https://en.wikipedia.org/wiki/Tim_Jenkin&quot;&gt;Tim Jenkin&lt;/a&gt;, the person primarily responsible for the encryption system, has now open sourced the original code, and which &lt;a href=&quot;https://github.com/vulacode&quot;&gt;can be found here&lt;/a&gt;. Tim&#39;s write up on the encryption system &lt;a href=&quot;https://github.com/Vulacode/Articles/blob/main/Talking%20To%20Vula.pdf&quot;&gt;can be found here&lt;/a&gt;. I thoroughly recommend reading it for the details.&lt;/p&gt;&lt;p&gt;The code hadn&#39;t been open sourced before for one simple reason: on leaving the UK for South Africa in 1991 he had zipped up all the source code and set a password on it. In the intervening years he&#39;d simply forgotten the password! So, when I emailed him to ask if it had been open sourced he replied:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;I still have the Vula source code but unfortunately most of it I can&#39;t access because when I left the UK in 1991 to return to South Africa, I zipped up all the files with a password. I was able to decode and extract one of the files but it was a very early version of the software. The rest I couldn&#39;t extract because I forgot the password. When I got back to SA there was no need to access the code. I thought I would never forget the password but when I tried to decode it a few years later, I couldn&#39;t remember it.&lt;/p&gt;&lt;p&gt;If you could find out how to decode zipped files that would release the software, which I would be more than happy to share. I have made a few attempts to crack the code but so far have been unsuccessful.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;I readily agreed and he sent me two files: &lt;span style=&quot;font-family: courier;&quot;&gt;ALLBAS.ZIP&lt;/span&gt; and &lt;span style=&quot;font-family: courier;&quot;&gt;CODMAY93.ZIP&lt;/span&gt;. These were both created with an early version of PKZIP and had passwords set on them. Luckily, there is a &lt;a href=&quot;https://link.springer.com/chapter/10.1007/3-540-60590-8_12&quot;&gt;known plain text attack&lt;/a&gt; against the ZipCrypto scheme used in that era&#39;s ZIP format. And an open source implementation of the attack called &lt;a href=&quot;https://github.com/kimci86/bkcrack&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;bkcrack&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;So, it was a &quot;simple matter&quot; of predicting 12 bytes of plain text at a known location inside the ZIP file. Here&#39;s a sample of what&#39;s inside the ZIP file:&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;$ bkcrack -L ALLBAS.ZIP | head -n 20&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;bkcrack 1.7.0 - 2024-05-26&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;Archive: ALLBAS.ZIP&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;Index Encryption Compression CRC32&amp;nbsp; &amp;nbsp; Uncompressed&amp;nbsp; Packed size Name&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;----- ---------- ----------- -------- ------------ ------------ ----------------&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; 0 ZipCrypto&amp;nbsp; Shrink&amp;nbsp; &amp;nbsp; &amp;nbsp; b0f86b1d&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 163&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 117 A1PSW.BAS&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; 1 ZipCrypto&amp;nbsp; Shrink&amp;nbsp; &amp;nbsp; &amp;nbsp; 8fa662d4&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 163&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 118 A2PSW.BAS&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; 2 ZipCrypto&amp;nbsp; Shrink&amp;nbsp; &amp;nbsp; &amp;nbsp; 0c5a7295&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 163&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 119 A3PSW.BAS&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; 3 ZipCrypto&amp;nbsp; Shrink&amp;nbsp; &amp;nbsp; &amp;nbsp; 49907f86&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 179&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 125 A4PSW.BAS&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; 4 ZipCrypto&amp;nbsp; Shrink&amp;nbsp; &amp;nbsp; &amp;nbsp; 3d20eb7a&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 163&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 120 A5PSW.BAS&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; 5 ZipCrypto&amp;nbsp; Shrink&amp;nbsp; &amp;nbsp; &amp;nbsp; f8b558f0&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 136&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 128 BIOS.INC&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; 6 ZipCrypto&amp;nbsp; Implode&amp;nbsp; &amp;nbsp; &amp;nbsp;799074ed&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 377&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 278 CHKERR.INC&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; 7 ZipCrypto&amp;nbsp; Implode&amp;nbsp; &amp;nbsp; &amp;nbsp;c44ea0a5&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 17906&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;5401 CODSUBS.INC&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; 8 ZipCrypto&amp;nbsp; Implode&amp;nbsp; &amp;nbsp; &amp;nbsp;7bd7e23d&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 27287&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;8297 COMAID.BAS&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; 9 ZipCrypto&amp;nbsp; Implode&amp;nbsp; &amp;nbsp; &amp;nbsp;03dc63da&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;2109&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;1001 COMKEY.BAS&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;10 ZipCrypto&amp;nbsp; Store&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;3500d320&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;2372&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;2384 CONFIG.TIM&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;11 ZipCrypto&amp;nbsp; Shrink&amp;nbsp; &amp;nbsp; &amp;nbsp; 35a85089&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 147&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 111 CONPSW.BAS&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;12 ZipCrypto&amp;nbsp; Implode&amp;nbsp; &amp;nbsp; &amp;nbsp;55be75ce&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;2094&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 825 DOS.INC&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;13 ZipCrypto&amp;nbsp; Shrink&amp;nbsp; &amp;nbsp; &amp;nbsp; 3387d043&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 134&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 127 DOSVER.INC&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;14 ZipCrypto&amp;nbsp; Implode&amp;nbsp; &amp;nbsp; &amp;nbsp;28a32efa&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;1304&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 535 DOSX.INC&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;15 ZipCrypto&amp;nbsp; Implode&amp;nbsp; &amp;nbsp; &amp;nbsp;6578a66c&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;3196&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 966 EDDY.BAS&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Tim had some unencrypted &lt;span style=&quot;font-family: courier;&quot;&gt;.BAS&lt;/span&gt; files lying around but they were different versions than those in the file and trying the &lt;span style=&quot;font-family: courier;&quot;&gt;bkcrack&lt;/span&gt; attack using them (after running them through original PKZIP in &lt;a href=&quot;https://www.dosbox.com/&quot;&gt;DOSBox&lt;/a&gt;) was unsuccessful and I decided to apply some brain power before attempting further attacks.&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;ALLBAS.ZIP&lt;/span&gt; contained a number of files that were uncompressed, because they were already binary and not worth compressing. These files are marked as &lt;span style=&quot;font-family: courier;&quot;&gt;Store&lt;/span&gt;:&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;$ bkcrack -L ALLBAS.ZIP | grep Store&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;10 ZipCrypto&amp;nbsp; Store&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;3500d320&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;2372&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;2384 CONFIG.TIM&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;23 ZipCrypto&amp;nbsp; Store&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;14a285ac&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 2&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;14 KEYCOD.EXE&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;25 ZipCrypto&amp;nbsp; Store&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;d6343ce1&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;4767&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;4779 KEYONE.ZIP&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;26 ZipCrypto&amp;nbsp; Store&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;650778b7&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;6523&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;6535 KEYTHREE.ZIP&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;30 ZipCrypto&amp;nbsp; Store&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;12a711cd&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 58172&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 58184 OLDCOD.ZIP&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;41 ZipCrypto&amp;nbsp; Store&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;00000000&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 0&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;12 TAPCOD.EXE&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;44 ZipCrypto&amp;nbsp; Store&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;55000714&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 12716&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 12728 TECOD5.ZIP&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;45 ZipCrypto&amp;nbsp; Store&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;f4f4366c&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;9230&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;9242 TECOD6.ZIP&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Files that are &lt;span style=&quot;font-family: courier;&quot;&gt;Store&lt;/span&gt;&#39;d are fruitful for plaintext prediction because they have not undergone compression and there&#39;s no need to have the original file to compress in order to obtain plaintext. Focussing on the ZIP files, since the ZIP files start with a PK header, seemed like a good place to find predictable plaintext at a known position. Here are the fields in the standard PK header at the very start of a ZIP file:&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsJqC7hwdZ6KlE6kkcnX0E3OqRNUX0bCZybe-nqTsG0Kut52XY8TrgJri6iyBfrWNNjOjV4Y-eKWxjnGdYm4jkaEZpC04GHIHfY2aH8KZoFUGlfhNXSCuMUrYp9Rig8OaCWVgXTl4VNoDRXJczO_Iv9b-jywsdAywgDRQMZzD24P6p9hbW3DMjxg/s1654/vula-1.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;324&quot; data-original-width=&quot;1654&quot; height=&quot;125&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsJqC7hwdZ6KlE6kkcnX0E3OqRNUX0bCZybe-nqTsG0Kut52XY8TrgJri6iyBfrWNNjOjV4Y-eKWxjnGdYm4jkaEZpC04GHIHfY2aH8KZoFUGlfhNXSCuMUrYp9Rig8OaCWVgXTl4VNoDRXJczO_Iv9b-jywsdAywgDRQMZzD24P6p9hbW3DMjxg/w640-h125/vula-1.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;A viable attack appeared to be to predict the name of the first file in the archive. If the file name was at least 8 characters (which seemed pretty easy since at least four characters were used for &lt;span style=&quot;font-family: courier;&quot;&gt;.BAS&lt;/span&gt;, &lt;span style=&quot;font-family: courier;&quot;&gt;.INC&lt;/span&gt; etc.) then at least 12 characters of plaintext would be available when the file name size (offset 0x1A, 0x1B) and the length of the extra field (which appeared to be 0x00, 0x00 in all the ZIPs Tim sent) was added.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;In the worst case, it would be possible to bruteforce the potential names of files given that they all appear to be uppercase/number combinations with a maximum length of eight characters plus extension. But that turned out not to be necessary.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;Happily, Tim had a different version of &lt;span style=&quot;font-family: courier;&quot;&gt;OLDCOD.ZIP&lt;/span&gt;&amp;nbsp;(one of the ZIP files inside &lt;span style=&quot;font-family: courier;&quot;&gt;ALLBAS.ZIP&lt;/span&gt;) and was able to tell me that the first file in it was &lt;span style=&quot;font-family: courier;&quot;&gt;COMKEY.BAS&lt;/span&gt;. So, I whipped up a quick Perl program to create the necessary plaintext in that hope that the &lt;span style=&quot;font-family: courier;&quot;&gt;OLDCOD.ZIP&lt;/span&gt; inside &lt;span style=&quot;font-family: courier;&quot;&gt;ALLBAS.ZIP&lt;/span&gt; did start with &lt;span style=&quot;font-family: courier;&quot;&gt;COMKEY.BAS&lt;/span&gt;:&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;$ cat maken.pl&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;use strict;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;use warnings;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;my $outfile = &quot;hexname-$$.txt&quot;;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;while (&amp;lt;&amp;gt;) {&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; chomp;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; my $bas = $_;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; print(&quot;$bas / $outfile\n&quot;);&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; my $n = sprintf(&quot;%c\x00\x00\x00$bas&quot;,length($bas));&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; open G, &quot;&amp;gt;$outfile&quot;;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; print G $n;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; close G;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; system(&quot;bkcrack -C ALLBAS.ZIP -c OLDCOD.ZIP -p $outfile -o 26 -j 8&quot;);&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;23 minutes later &lt;span style=&quot;font-family: courier;&quot;&gt;bkcrack&lt;/span&gt; spit out the key to the &lt;span style=&quot;font-family: courier;&quot;&gt;ALLBAS.ZIP&lt;/span&gt; file and was able to decrypt it. The same key worked for &lt;span style=&quot;font-family: courier;&quot;&gt;CODMAY93.ZIP&lt;/span&gt; also.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span id=&quot;docs-internal-guid-eb783345-7fff-83a6-2aef-34bb32a5b59b&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;$ time echo &quot;COMKEY.BAS&quot; | perl maken.pl&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;COMKEY.BAS / hexname-41227.txt&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;bkcrack 1.7.0 - 2024-05-26&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;[07:49:38] Z reduction using 6 bytes of known plaintext&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;100.0 % (6 / 6)&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;[07:49:38] Attack on 925073 Z values at index 33&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;Keys: 98e0f009 48a0b11a c70f8499&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;80.6 % (745571 / 925073)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;Found a solution. Stopping.&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;You may resume the attack with the option: --continue-attack 745571&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;[18:13:49] Keys&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;98e0f009 48a0b11a c70f8499&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;real&lt;/span&gt;&lt;span style=&quot;font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;text-wrap: nowrap;&quot;&gt;	&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;23m4.371s&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;user&lt;/span&gt;&lt;span style=&quot;font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;text-wrap: nowrap;&quot;&gt;	&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;162m3.520s&lt;/span&gt;&lt;/p&gt;&lt;span style=&quot;font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;sys&lt;/span&gt;&lt;span style=&quot;font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;text-wrap: nowrap;&quot;&gt;	&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;0m37.752s&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;bkcrack&lt;/span&gt; does the decryption once the key has been found:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span id=&quot;docs-internal-guid-340b158b-7fff-bf4c-159e-7b8c85b8a90a&quot;&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;$ bkcrack -C ALLBAS.ZIP -k 98e0f009 48a0b11a c70f8499 -D ALLBAS-DECRYPTED.ZIP&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;bkcrack 1.7.0 - 2024-05-26&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;[07:52:22] Writing decrypted archive ALLBAS-DECRYPTED.ZIP&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;100.0 % (81 / 81)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;$ bkcrack -C CODMAY93.ZIP -k 98e0f009 48a0b11a c70f8499 -D CODMAY93-DECRYPTED.ZIP&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;bkcrack 1.7.0 - 2024-05-26&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;[07:58:31] Writing decrypted archive CODMAY93-DECRYPTED.ZIP&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;100.0 % (40 / 40)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span face=&quot;Arial, sans-serif&quot;&gt;&lt;span style=&quot;white-space-collapse: preserve;&quot;&gt;And with that the long encrypted source code used to help set up secure communications for the ANC was available!&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span face=&quot;Arial, sans-serif&quot;&gt;&lt;span style=&quot;white-space-collapse: preserve;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;white-space-collapse: preserve;&quot;&gt;&lt;span face=&quot;Arial, sans-serif&quot;&gt;Had that failed I was going to attack one of the other ZIP files using the same attack (before resorting to bruteforceing file names). I&#39;d guessed that &lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;TECOD5.ZIP&lt;/span&gt;&lt;span face=&quot;Arial, sans-serif&quot;&gt; was probably a ZIP of just the file &lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;TECOD.BAS&lt;/span&gt;&lt;span face=&quot;Arial, sans-serif&quot;&gt; (or maybe &lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;TECOD5.BAS&lt;/span&gt;&lt;span face=&quot;Arial, sans-serif&quot;&gt;) based on the compressed size of &lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;TECOD.BAS&lt;/span&gt;&lt;span face=&quot;Arial, sans-serif&quot;&gt; in &lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;ALLBAS.ZIP&lt;/span&gt;&lt;span face=&quot;Arial, sans-serif&quot;&gt;). Turns out I wouldn&#39;t have had to wait 23 minutes if I&#39;d started there:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span face=&quot;Arial, sans-serif&quot;&gt;&lt;span style=&quot;font-size: 14.6667px; white-space-collapse: preserve;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;$ time echo &quot;TECOD5.BAS&quot; | perl maken.pl&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;TECOD5.BAS / hexname-41544.txt&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;bkcrack 1.7.0 - 2024-05-26&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;[18:14:51] Z reduction using 6 bytes of known plaintext&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;100.0 % (6 / 6)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;[18:14:51] Attack on 880113 Z values at index 33&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;Keys: 98e0f009 48a0b11a c70f8499&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;2.4 % (20737 / 880113)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;Found a solution. Stopping.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;You may resume the attack with the option: --continue-attack 20737&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;[18:15:29] Keys&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;98e0f009 48a0b11a c70f8499&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;b id=&quot;docs-internal-guid-1886b7ac-7fff-b8f7-c099-212e9012986c&quot; style=&quot;font-weight: normal;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;real&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;0m38.152s&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;user&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;4m35.318s&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span style=&quot;font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;sys&lt;/span&gt;&lt;span style=&quot;font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;text-wrap: nowrap;&quot;&gt;	&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;0m0.897s&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span face=&quot;Arial, sans-serif&quot; style=&quot;white-space-collapse: preserve;&quot;&gt;The known plaintext attack against ZipCrypto works quickly with the right plaintext. If you ever have to do something similar it&#39;s worth spending time thinking about the plaintext. In particular, files that are &lt;/span&gt;&lt;span style=&quot;font-family: courier; white-space-collapse: preserve;&quot;&gt;Store&lt;/span&gt;&lt;span face=&quot;Arial, sans-serif&quot; style=&quot;white-space-collapse: preserve;&quot;&gt;&#39;d in the ZIP file are useful to examine since they are uncompressed and it may be easier to predict their contents (rather than having to find an original file and compress it to match what&#39;s stored in the ZIP).&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;white-space-collapse: preserve;&quot;&gt;&lt;span face=&quot;Arial, sans-serif&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;&quot;&gt;&lt;span style=&quot;white-space-collapse: preserve;&quot;&gt;&lt;span face=&quot;Arial, sans-serif&quot;&gt;Running the code&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;white-space-collapse: preserve;&quot;&gt;&lt;span face=&quot;Arial, sans-serif&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;white-space-collapse: preserve;&quot;&gt;&lt;span face=&quot;Arial, sans-serif&quot;&gt;I compiled two of the programs and ran them using DOSBox. The first, &lt;a href=&quot;https://github.com/jgrahamc/jgc-vula-september-2024/blob/main/RANDOM.BAS&quot;&gt;RANDOM.BAS&lt;/a&gt;, was used to create disks of random numbers to be used as a one time pad, the other, &lt;a href=&quot;https://github.com/jgrahamc/jgc-vula-september-2024/blob/main/TECOD.BAS&quot;&gt;TECOD.BAS&lt;/a&gt;, was used to encrypt and decrypt messages sent via email. The code I compiled and the generated executables &lt;a href=&quot;https://github.com/jgrahamc/jgc-vula-september-2024/&quot;&gt;can be found here&lt;/a&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;white-space-collapse: preserve;&quot;&gt;&lt;span face=&quot;Arial, sans-serif&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;white-space-collapse: preserve;&quot;&gt;&lt;span face=&quot;Arial, sans-serif&quot;&gt;Compilation is simply running the PowerBASIC compiler as follows:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;white-space-collapse: preserve;&quot;&gt;&lt;span face=&quot;Arial, sans-serif&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;white-space-collapse: preserve;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;C:\&amp;gt;EXE\PBC TECOD.BAS
PowerBASIC Compiler Version 3.00b  Copyright (c) 1989-1993 by Robert S. Zale
Spectra Publishing, Sunnyvale, CA, USA
C:\TECOD.BAS
2575 statements, 2329 lines
Compile time: 00:12.0 Compilation speed: 12600 stmts/minute
45984 bytes code, 4880 bytes data, 2048 bytes stack
Segments(1): 46k

C:\&amp;gt;EXE\PBC RANDOM.BAS
PowerBASIC Compiler Version 3.00b  Copyright (c) 1989-1993 by Robert S. Zale
Spectra Publishing, Sunnyvale, CA, USA
C:\RANDOM.BAS
2194 statements, 1940 lines
Compile time: 00:10.1 Compilation speed: 12600 stmts/minute
33328 bytes code, 4704 bytes data, 3072 bytes stack
Segments(1): 34k

C:\&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;white-space-collapse: preserve;&quot;&gt;&lt;span face=&quot;Arial, sans-serif&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;white-space-collapse: preserve;&quot;&gt;The first step is to create random data on disk to be used as a one time pad. RANDOM.EXE uses three different randomness generating algorithms (one based on a random key you type in yourself). &lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;white-space-collapse: preserve;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuN0UGsMke0l_vABWoFgNkdBjmLu0FgzTgETRQgfSXVMJUlFo3rd6KGlzyGuGnVCIKN9bz4wS486EgARYw2OXCAqnPGanBalLVniCOUT_RzJywx9wjTnImPCe-GafBpPKIIFiHDxMUhubZVpYKoyRM1A9N_HUOCGgrZH8LSQDf06IKvD1mKWWtoQ/s1664/vula-1.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1080&quot; data-original-width=&quot;1664&quot; height=&quot;415&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuN0UGsMke0l_vABWoFgNkdBjmLu0FgzTgETRQgfSXVMJUlFo3rd6KGlzyGuGnVCIKN9bz4wS486EgARYw2OXCAqnPGanBalLVniCOUT_RzJywx9wjTnImPCe-GafBpPKIIFiHDxMUhubZVpYKoyRM1A9N_HUOCGgrZH8LSQDf06IKvD1mKWWtoQ/w640-h415/vula-1.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;Encryption and decryption is done through TECOD.EXE which is password protected.&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnvCtEckKgHs-Pn02d1A6vrV9QjuOpc0P7ViAsQClIefLJ3UXh4FyxMYjbJSuSzOQo7mHjvMbaoc1_vIqDqB79kAGOYEYi0Hk9O9KUM62zx3-M_Mhmuktt3XdmNq12R3ta9UmhZV4_SEUw5wYBTyETGXrYlVlqvKkHAjwzRfPKV3veDcPsnCxoXg/s1664/vula-2.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1080&quot; data-original-width=&quot;1664&quot; height=&quot;416&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnvCtEckKgHs-Pn02d1A6vrV9QjuOpc0P7ViAsQClIefLJ3UXh4FyxMYjbJSuSzOQo7mHjvMbaoc1_vIqDqB79kAGOYEYi0Hk9O9KUM62zx3-M_Mhmuktt3XdmNq12R3ta9UmhZV4_SEUw5wYBTyETGXrYlVlqvKkHAjwzRfPKV3veDcPsnCxoXg/w640-h416/vula-2.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;Although the password is embedded in the program and quite simple Tim Jenkin did obfuscate it as follows:&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;DIM PW$(PL)&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;PW$(9)=CHR$(66):PW$(4)=CHR$(66):PW$(1)=CHR$(84):PW$(5)=CHR$(79):PW$(2) =&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;CHR$(73)&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;PW$(3)=CHR$(77):PW$(6)=CHR$(66):PW$(8)=CHR$(77):PW$(10)=CHR$(79):PW$(7)=CHR$(&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;73)&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;In this particular version of the program that makes the password TIMBOBIMBO which when entered takes you to the main menu. Note that each version of these programs being sent to different members of the ANC had different passwords.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPEhfbubWzqACAf56urzB4c2MkrCyJVC9EcFocsHkWu8gTC5KCP80Ido9K_iAopeG9nYwV0tsOUtFlB_yXcwHn7OiklEDJop9UwWTk3B3pgT8N1P1APv7wODILo_ryQXS6ojfizJm2rcBrLgPav2uPsg3s3O7-Yl28PPFIJT0hMG7m66mtGwCVSQ/s1664/vula-3.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1080&quot; data-original-width=&quot;1664&quot; height=&quot;416&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPEhfbubWzqACAf56urzB4c2MkrCyJVC9EcFocsHkWu8gTC5KCP80Ido9K_iAopeG9nYwV0tsOUtFlB_yXcwHn7OiklEDJop9UwWTk3B3pgT8N1P1APv7wODILo_ryQXS6ojfizJm2rcBrLgPav2uPsg3s3O7-Yl28PPFIJT0hMG7m66mtGwCVSQ/w640-h416/vula-3.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;If you&#39;re interested in running these programs yourself, &lt;a href=&quot;https://github.com/Vulacode/TECOD/blob/main/TECOD_HLP.pdf&quot;&gt;the manual is here&lt;/a&gt;.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;Here are three short videos showing the creation of random data in &lt;a href=&quot;https://github.com/jgrahamc/jgc-vula-september-2024/blob/main/RANDATA.1&quot;&gt;RANDATA.1&lt;/a&gt; for the key using RANDOM.EXE, followed by encrypting a message stored in &lt;a href=&quot;https://github.com/jgrahamc/jgc-vula-september-2024/blob/main/PLAIN.TXT&quot;&gt;PLAIN.TXT&lt;/a&gt; on a RAM disk (all crypto operations were meant to happen on a RAM disk) and turning it into &lt;a href=&quot;https://github.com/jgrahamc/jgc-vula-september-2024/blob/main/PLAIN.BIN&quot;&gt;PLAIN.BIN&lt;/a&gt; (and the reverse).&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;&lt;span&gt;

Creating random data to be used as an encryption key&lt;/span&gt;&lt;/h3&gt;&lt;div&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;span&gt;&lt;div&gt;
  &lt;iframe allow=&quot;accelerometer; gyroscope; autoplay; encrypted-media; picture-in-picture;&quot; allowfullscreen=&quot;true&quot; loading=&quot;lazy&quot; src=&quot;https://customer-rww76yind8iym5aw.cloudflarestream.com/fba76afea511fe18ace045bd2500d257/iframe?poster=https%3A%2F%2Fcustomer-rww76yind8iym5aw.cloudflarestream.com%2Ffba76afea511fe18ace045bd2500d257%2Fthumbnails%2Fthumbnail.jpg%3Ftime%3D%26height%3D600&quot; style=&quot;border: none; height: 400px; left: 0; position: relative; top: 0; width: 100%;&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;&lt;/span&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/h3&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;&lt;span&gt;

Encrypting a file
  
&lt;/span&gt;&lt;/h3&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here the programs (TECOD.EXE/TECOD.CNF) are on a floppy disk in A:, the data disk (containing the key file created above) are in B: and there&#39;s a RAM disk on R:. To get this to work the RANDATA.1 file created in the step above needs to be renamed to SNUM.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;span&gt;&lt;div&gt;
  &lt;iframe allow=&quot;accelerometer; gyroscope; autoplay; encrypted-media; picture-in-picture;&quot; allowfullscreen=&quot;true&quot; loading=&quot;lazy&quot; src=&quot;https://customer-rww76yind8iym5aw.cloudflarestream.com/7bc06352d23ddfa1a8ef3e3fa3c4575a/iframe?poster=https%3A%2F%2Fcustomer-rww76yind8iym5aw.cloudflarestream.com%2F7bc06352d23ddfa1a8ef3e3fa3c4575a%2Fthumbnails%2Fthumbnail.jpg%3Ftime%3D%26height%3D600&quot; style=&quot;border: none; height: 400px; left: 0; position: relative; top: 0; width: 100%;&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;/span&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/h3&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;&lt;span&gt;

Decrypting a file&lt;/span&gt;&lt;/h3&gt;&lt;div&gt;&lt;span&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here the programs (TECOD.EXE/TECOD.CNF) are on a floppy disk in A:, the data disk (containing the key file created above) are in B: and there&#39;s a RAM disk on R:. The RANDATA.1 needs to be called RNUM on B:.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;&lt;span&gt;&lt;iframe allow=&quot;accelerometer; gyroscope; autoplay; encrypted-media; picture-in-picture;&quot; allowfullscreen=&quot;true&quot; loading=&quot;lazy&quot; src=&quot;https://customer-rww76yind8iym5aw.cloudflarestream.com/0239333a091d0e8c8d0c9e5302c29260/iframe?poster=https%3A%2F%2Fcustomer-rww76yind8iym5aw.cloudflarestream.com%2F0239333a091d0e8c8d0c9e5302c29260%2Fthumbnails%2Fthumbnail.jpg%3Ftime%3D%26height%3D600&quot; style=&quot;border: none; height: 400px; left: 0; position: relative; top: 0; width: 100%;&quot;&gt;&lt;/iframe&gt;&lt;/span&gt;&lt;/h3&gt;&lt;span&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;There are lots of interesting details of how these programs work that deserve another longer blog post when I have time. Or a detailed study by someone else. For example, the key material is destroyed after use, the RANDOM.EXE program has multiple ways of making randomness and code to check the distribution of the random bytes created. There&#39;s an emphasis on using the RAM disk for all cryptographic operations.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jgc.org/feeds/105942708803926021/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/19303585/105942708803926021' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19303585/posts/default/105942708803926021'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19303585/posts/default/105942708803926021'/><link rel='alternate' type='text/html' href='http://blog.jgc.org/2024/09/cracking-old-zip-file-to-help-open.html' title='Cracking an old ZIP file to help open source the ANC&#39;s &quot;Operation Vula&quot; secret crypto code'/><author><name>Unknown</name><email>[email protected]</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7c14emcAhruoYELH_YTk0Gl_SMkPPV8rRdmnjs21QQGiGZoAGn0rnBR2SeSXd4bAQqF83Kgu6bRKkeGjhWXPpzlqJfKkrnuMfNlfZ0CCej9dmGMDlQvDP24Ka3iorprn474jZ_ZUCANTiu9EBC0FLUmjpug9avwL4eoCx3qeX9afO2v3SsqaGdg/s72-c/171421935.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19303585.post-8452693863720025641</id><published>2024-09-03T10:16:00.005+00:00</published><updated>2024-09-12T08:57:41.586+00:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="hits"/><category scheme="http://www.blogger.com/atom/ns#" term="mathematics"/><category scheme="http://www.blogger.com/atom/ns#" term="pseudo-randomness"/><title type='text'>Steve Ballmer&#39;s incorrect binary search interview question</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;In this short video &lt;a href=&quot;https://en.wikipedia.org/wiki/Steve_Ballmer&quot;&gt;Steve Ballmer&lt;/a&gt; talks about a puzzle question he would ask candidates interviewing at Microsoft. Solving it is based on &lt;a href=&quot;https://en.wikipedia.org/wiki/Binary_search&quot;&gt;binary search&lt;/a&gt; and the &lt;a href=&quot;https://en.wikipedia.org/wiki/Expected_value&quot;&gt;expected value&lt;/a&gt;.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;iframe allowfullscreen=&quot;&quot; class=&quot;BLOG_video_class&quot; height=&quot;266&quot; src=&quot;https://www.youtube.com/embed/svCYbkS0Sjk&quot; width=&quot;320&quot; youtube-src-id=&quot;svCYbkS0Sjk&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;Here&#39;s what he says: &quot;&lt;i&gt;I&#39;m thinking of a number between 1 and 100. You can guess, after each guess I&#39;ll tell you whether high or low. You get it the first guess I&#39;ll give you five bucks. Four bucks, three, two, one, zero, you pay me a buck, you pay me two, you pay me three&lt;/i&gt;&quot;.&amp;nbsp;&lt;/p&gt;&lt;p&gt;The question is &quot;&lt;i&gt;Should you accept to play this game?&lt;/i&gt;&quot;. In the interview, Ballmer states that the answer is &quot;No&quot; for two reasons: firstly, because he can pick numbers that&#39;ll be the most difficult for you to determine, secondly because the expected value of the game (assuming Ballmer chooses randomly) is negative: you end up paying Ballmer.&lt;/p&gt;&lt;p&gt;He&#39;s right on the first count. If you follow a binary search strategy (which will be optimal if he&#39;s choosing randomly) and he chooses one of&amp;nbsp;2, 5, 8, 11, 14, 17, 20, 22, 24, 27, 30, 33, 36, 39, 42, 45, 47, 49, 52, 55, 58, 61, 64, 67, 70, 72, 74, 77, 80, 83, 85, 87, 90, 93, 96, 98 or 100 then you owe him $1. For all other numbers you get $0 (if he chose&amp;nbsp;1, 4, 7, 10, 13, 16, 19, 23, 26, 29, 32, 35, 38, 41, 44, 48, 51, 54, 57, 60, 63, 66, 69, 73, 76, 79, 82, 86, 89, 92, 95 or 99) or a positive outcome (some of his money!).&lt;/p&gt;&lt;p&gt;In the video above Ballmer chooses 59 which a binary search strategy would have found in 5 steps resulting in the interviewer, Emily Chang, winning $1. She was actually pretty close to doing that. The binary search steps would be 50, 75,&amp;nbsp;62, 56, 59 and she guessed 50, 75, 60, 55, 57, 58, 59.&amp;nbsp;&lt;/p&gt;&lt;p&gt;On the second count (Baller implies the expected value is negative), if he&#39;s choosing randomly, then he&#39;s wrong. The expected value is $0.20 (calculated discretely using the code below). The code calculates the number of guesses for each value and an overall expected value assuming Ballmer chooses randomly.&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;use strict;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;use warnings;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;my @v = (0, 5, 4, 3, 2, 1, 0, -1, -2);&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;my $ev = 0;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;my $ec = 0;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;my @range = (1..100);&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;foreach my $r (@range) {&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; my $l = $range[0];&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; my $h = $range[$#range];&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; my $s = 0;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; while (1) {&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $s += 1;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; my $g = int(($l + $h)/2);&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if ($r == $g) {&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print &quot;$r found in $s steps (&quot; . dollar($v[$s]) . &quot;)\n&quot;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $ev += $v[$s];&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $ec += 1;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; last;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if ($g &amp;lt; $r) {&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $l = $g + 1;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; next;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if ($g &amp;gt; $r) {&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $h = $g - 1;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; next;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;}&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;$ev /= $ec;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;print &quot;Game expected value is &quot; . dollar($ev) . &quot;\n&quot;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;sub dollar {&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; my ($d) = @_;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; my $f = (int($d) == $d)?&#39;%d&#39;:&#39;%.2f&#39;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; return sprintf(&quot;%s\$$f&quot;, ($d&amp;lt;0)?&#39;-&#39;:&#39;&#39;, abs($d));&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;}&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;This chart shows the expected winnings (or loss) depending on the number Ballmer chooses. The shape of the binary search can be seen in the chart itself.&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiElRkalAf71qPuh9a1t0yhsoAO5ZPQ-mR3NpSBwwuYpdsbkASynXT_JOwyrOkzWUNJ1ZWGnArmU4tKHEQpsMVxe9s5h7qdXgZRaMprV8dV2X_0-dXG195Dsi7S3hnJknshVyiRIgKUXCRcy4RZcDv0tI_bWQd6OwzkdEfNavHTm8HV4NH4ZP4itg/s1800/bs-1.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;702&quot; data-original-width=&quot;1800&quot; height=&quot;250&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiElRkalAf71qPuh9a1t0yhsoAO5ZPQ-mR3NpSBwwuYpdsbkASynXT_JOwyrOkzWUNJ1ZWGnArmU4tKHEQpsMVxe9s5h7qdXgZRaMprV8dV2X_0-dXG195Dsi7S3hnJknshVyiRIgKUXCRcy4RZcDv0tI_bWQd6OwzkdEfNavHTm8HV4NH4ZP4itg/w640-h250/bs-1.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;A different way to think about the expected value and binary search is as follows:&lt;/p&gt;&lt;p&gt;1. On the first guess you choose 50 and win $5 with a probability of 1/100&lt;/p&gt;&lt;p&gt;2. On the second guess you choose 25 or 75 and win $4 with a probability of 2/100&lt;/p&gt;&lt;p&gt;3. On the third guess you choose 12, 37, 62 or 88 and win $3 with a probability of 4/100&lt;/p&gt;&lt;p&gt;4. On the fourth guess you choose 6, 18, 31, 43, 56, 68, 81 or 94 and win $2 with a probability of 8/100&lt;/p&gt;&lt;p&gt;5. And so on.&lt;/p&gt;&lt;p&gt;The gives the expected value as 5 * 1/100 + 4 * 2/100 + 3 * 4/100 + 2 * 8/100 + 1 * 16/100 + 0 * 32/100 + -1 * 37/100 (note the last term is the remaining possible numbers having reached the end of the binary search). That&#39;s 0.2.&lt;/p&gt;&lt;p&gt;&lt;i&gt;Why was Ballmer wrong?&lt;/i&gt;&lt;/p&gt;&lt;p&gt;One possibility is that he didn&#39;t mean to have the $0 for 6 guesses. If he&#39;d said &quot;&lt;i&gt;I&#39;m thinking of a number between 1 and 100. You can guess, after each guess I&#39;ll tell you whether high or low. You get it the first guess I&#39;ll give you five bucks. Four bucks, three, two, one, you pay me a buck, you pay me two, you pay me three&lt;/i&gt;&quot; then the expected value is -$0.49.&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jgc.org/feeds/8452693863720025641/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/19303585/8452693863720025641' title='16 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19303585/posts/default/8452693863720025641'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19303585/posts/default/8452693863720025641'/><link rel='alternate' type='text/html' href='http://blog.jgc.org/2024/09/steve-ballmers-binary-search-interview.html' title='Steve Ballmer&#39;s incorrect binary search interview question'/><author><name>Unknown</name><email>[email protected]</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/svCYbkS0Sjk/default.jpg" height="72" width="72"/><thr:total>16</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19303585.post-8870263574877874516</id><published>2024-06-19T07:43:00.016+00:00</published><updated>2024-06-20T12:38:31.606+00:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="hardware"/><title type='text'>Two ways to use  an LED as a light sensor with Arduino</title><content type='html'>&lt;p&gt;I needed to log when a light switched on and off during the night as part of debugging an oddly behaving movement sensor. To do that I built a really simple light sensor logger using an Arduino Leonardo, a large LED and a resistor or three. Here it is:&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXokF70rNbNS2w0ei9bHqVGaFi6KVXF6Cjlnd3Hp9yhhSD38FrvHTbdFRYr1JE4GUTywylxdFse1dKiBoO98IY3IYqpq8MSaUq6iAyq36rGKzgnli8gUKw_QmgleW2eJlX6Ns6MOukC_K3HvjRXfakGLjoHmCKL3Bj_-ful7Rz779ZPTy8UH-qXQ/s800/light-sense-1.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;768&quot; data-original-width=&quot;800&quot; height=&quot;614&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXokF70rNbNS2w0ei9bHqVGaFi6KVXF6Cjlnd3Hp9yhhSD38FrvHTbdFRYr1JE4GUTywylxdFse1dKiBoO98IY3IYqpq8MSaUq6iAyq36rGKzgnli8gUKw_QmgleW2eJlX6Ns6MOukC_K3HvjRXfakGLjoHmCKL3Bj_-ful7Rz779ZPTy8UH-qXQ/w640-h614/light-sense-1.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;And here&#39;s the entire Arduino code:&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;blockquote style=&quot;border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;void setup() {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; Serial.begin(9600);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; analogReference(EXTERNAL);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;void loop() {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; Serial.println(analogRead(A1));&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; delay(1000);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;The main &lt;span style=&quot;font-family: courier;&quot;&gt;loop()&lt;/span&gt; just reads the voltage across the LED from analog input A1 and writes it to the serial port. Then it waits for a second. The &lt;span style=&quot;font-family: courier;&quot;&gt;setup()&lt;/span&gt; routine tells the ADC converter to use the voltage on AREF as the reference maximum voltage for the ADC.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;The LED has a voltage of between about 0mV and 400mV depending on the amount of light.&amp;nbsp;&lt;/div&gt;
  &lt;br /&gt;
  &lt;iframe allow=&quot;accelerometer; gyroscope; autoplay; encrypted-media; picture-in-picture;&quot; allowfullscreen=&quot;true&quot; loading=&quot;lazy&quot; src=&quot;https://customer-rww76yind8iym5aw.cloudflarestream.com/036d470ad7ea9dfb3e7207f81d19feaa/iframe?poster=https%3A%2F%2Fcustomer-rww76yind8iym5aw.cloudflarestream.com%2F036d470ad7ea9dfb3e7207f81d19feaa%2Fthumbnails%2Fthumbnail.jpg%3Ftime%3D%26height%3D600&quot; style=&quot;border: none; height: 400px; left: 0; position: relative; top: 0; width: 100%;&quot;&gt;&lt;/iframe&gt;
  &lt;br /&gt;
  &lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span&gt;By default the voltage range of the ADC on the Arduino Leonardo is 0V to 5V but it&#39;s possible to scale it with a call to &lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;a href=&quot;https://www.arduino.cc/reference/en/language/functions/analog-io/analogreference/&quot;&gt;analogReference&lt;/a&gt;()&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Calling&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;analogReference(INTERNAL)&lt;/span&gt;&lt;span&gt;&amp;nbsp;would set the range to 0V to 2.56V which is still a bit large given the small voltage across the LED. AREF to the rescue!&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;The AREF pin allows a range to be set for the ADC. It has an internal resistance of 32K and I added a 66K resistor (made from three resistors I had lying around) connected to the Arduino&#39;s 3.3V pin. The 66K and 32K form a voltage divider giving an AREF of 1.1V (which is the low end of valid AREF values). Then it&#39;s just necessary to call&amp;nbsp;&lt;span style=&quot;font-family: courier;&quot;&gt;analogReference(EXTERNAL)&lt;/span&gt;.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;Here&#39;s the output of the program when I had covered the LED with my hand and then uncovered it.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5C4KpjJPdeYzeMG_mGgLzz_rlRxpzg4NQA_kLMTs-YTcuotxyRdN-mSKALKT-RXDF-SsinkMmjWoZ5XdydL3OlNcc8msaA1-q4kU1PDf0Sfc7H7HG2bKcZsIWrmywzl5JKTew7STFQOU2U7J4B_OITOqG3MZdZxmIa54QelvvjHJK2h8dQjhkdA/s1908/light-sense-2.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1314&quot; data-original-width=&quot;1908&quot; height=&quot;440&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5C4KpjJPdeYzeMG_mGgLzz_rlRxpzg4NQA_kLMTs-YTcuotxyRdN-mSKALKT-RXDF-SsinkMmjWoZ5XdydL3OlNcc8msaA1-q4kU1PDf0Sfc7H7HG2bKcZsIWrmywzl5JKTew7STFQOU2U7J4B_OITOqG3MZdZxmIa54QelvvjHJK2h8dQjhkdA/w640-h440/light-sense-2.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;You can also use the built in Arduino Serial Plotter to get an instant chart. Here I covered the LED with my hand, took my hand away and then shone a torch directly into the LED.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2jnALyAtZGaxR_bgWBPHA4XvF-WN-u2uBru3P_1KMtVFQ_b_RdwgriJTjG4t3hn8cIdSURke7W_SRpq_mQjYK7kZLmTWSgrEcykLnIYSDDAbCWD2Q5bWNmpXpIM3H4ERg4jyFXb-IDDwkqV-_8haWN1najFGHfufcU-YM8M36uS6FLt35qagV5Q/s1908/light-sense-3.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1314&quot; data-original-width=&quot;1908&quot; height=&quot;440&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2jnALyAtZGaxR_bgWBPHA4XvF-WN-u2uBru3P_1KMtVFQ_b_RdwgriJTjG4t3hn8cIdSURke7W_SRpq_mQjYK7kZLmTWSgrEcykLnIYSDDAbCWD2Q5bWNmpXpIM3H4ERg4jyFXb-IDDwkqV-_8haWN1najFGHfufcU-YM8M36uS6FLt35qagV5Q/w640-h440/light-sense-3.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;To get timestamped output I am using &lt;a href=&quot;https://freeware.the-meiers.org/&quot;&gt;CoolTerm&lt;/a&gt; which will automatically save to a file and add timestamps.&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7jHD3aMjlC14A1AvxHpk2sD7BDr1cti8yHmEVQ2QYz0p0935ip3Br3hFKKi1VHxff5vYjBsOg4FgK3N7AfAoK9AhD0L-BDt_IZxAzPOWWImTyyOR3z8FMJZhhAvqbCiwfcfvRITmJGdaeAmjokKtMFK14E1J-_ahX_dwctcTCLacHzvkBeMCPHA/s1624/light-sense-5.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1344&quot; data-original-width=&quot;1624&quot; height=&quot;530&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7jHD3aMjlC14A1AvxHpk2sD7BDr1cti8yHmEVQ2QYz0p0935ip3Br3hFKKi1VHxff5vYjBsOg4FgK3N7AfAoK9AhD0L-BDt_IZxAzPOWWImTyyOR3z8FMJZhhAvqbCiwfcfvRITmJGdaeAmjokKtMFK14E1J-_ahX_dwctcTCLacHzvkBeMCPHA/w640-h530/light-sense-5.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;That light sensor via LED relies on the photovoltaic effect: when light strikes the PN junction inside the LED it creates a voltage (albeit a small one). But there&#39;s another way to measure the light hitting an LED.&lt;/div&gt;&lt;h3 style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/h3&gt;&lt;h3 style=&quot;clear: both; text-align: left;&quot;&gt;Reverse bias&lt;/h3&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;If the LED is reverse biased (i.e. connected to a voltage source the wrong way round) then it won&#39;t light up but it will &lt;a href=&quot;https://playground.arduino.cc/Learning/LEDSensor/&quot;&gt;act as a capacitor that charges when light hits it&lt;/a&gt;. So the idea is to reverse bias the LED using two digital pins on the Arduino (one set HIGH and one set LOW) and then remove the bias and measure how long the LED (acting as a capacitor) takes to discharge. The brighter the light the faster the discharge.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;This can be achieved with a single LED connected between two digital pins like this: the +ve lead of the LED goes into the pin identified by LED_P and the -ve into the pin identified by LED_N.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzcPt_arHEonZr14PoYz7qDp3W-2aUlU_2CqeAoqIAnLASKQHAkYcrVsfhN2V1wWd9dX7u0P-HRPSPc5AQBv6exjrCakObSKg4C0_KRzPzWPUA1i37Dlx_5qdMjCGLNMZXJqIBFt2FXf82TFps23Qechway9f20uBX7lNX0LBaAsnzRw-3dSJkjA/s578/light-sense-6.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;478&quot; data-original-width=&quot;578&quot; height=&quot;530&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzcPt_arHEonZr14PoYz7qDp3W-2aUlU_2CqeAoqIAnLASKQHAkYcrVsfhN2V1wWd9dX7u0P-HRPSPc5AQBv6exjrCakObSKg4C0_KRzPzWPUA1i37Dlx_5qdMjCGLNMZXJqIBFt2FXf82TFps23Qechway9f20uBX7lNX0LBaAsnzRw-3dSJkjA/w640-h530/light-sense-6.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;And here&#39;s the code.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;blockquote style=&quot;border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;#define LED_N 4&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;#define LED_P 5&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;void setup()&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; Serial.begin(9600);&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;void loop()&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; unsigned long maxtime = 5000;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; pinMode(LED_N, OUTPUT);&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; pinMode(LED_P, OUTPUT);&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; digitalWrite(LED_N, HIGH);&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; digitalWrite(LED_P, LOW);&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; pinMode(LED_N, INPUT);&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; digitalWrite(LED_N,LOW);&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; unsigned long elapsed = 0;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; unsigned long start = millis();&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; while ((digitalRead(LED_N) != 0) &amp;amp;&amp;amp; (elapsed &amp;lt; maxtime)) {&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; elapsed = millis() - start;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; Serial.println(elapsed);&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; if (elapsed &amp;lt; maxtime) {&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; delay(&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;maxtime - elapsed&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;I found this worked better than the first version with more sensitive output. Note that smaller numbers mean brighter here (whereas in the previous code smaller meant darker). Here&#39;s a plot showing me covering the LED twice with my hand, followed by shining a torch at it. Each time I let the LED be exposed to ambient light between tests.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhU9XtvQK_LGnB-qHkJAj7oeXNiYMjBLMIql4tUTfgkRSH993an_KUcFhchLh8sCiwXIJMHL52zAAXzXCk9UC65DY5KPT48Wo9qiX8svrTdu6CqGxoz1b4TH2dSHjk6SOeMhg8FdWz2PaZ1opmDmKy3Y2JFkgo2bmsI29p0LC5Y5yAVkXltJfYa5g/s1908/light-sense-4.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1314&quot; data-original-width=&quot;1908&quot; height=&quot;440&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhU9XtvQK_LGnB-qHkJAj7oeXNiYMjBLMIql4tUTfgkRSH993an_KUcFhchLh8sCiwXIJMHL52zAAXzXCk9UC65DY5KPT48Wo9qiX8svrTdu6CqGxoz1b4TH2dSHjk6SOeMhg8FdWz2PaZ1opmDmKy3Y2JFkgo2bmsI29p0LC5Y5yAVkXltJfYa5g/w640-h440/light-sense-4.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3 style=&quot;clear: both; text-align: left;&quot;&gt;In action&lt;/h3&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;Certainly looks like that motion sensor is turning the light on in the night uselessly.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEguPSeXwgqstXmsa2s_b8K9nR3bMNPNekwykDxlX3o6_xjm3Tk0QMWvpZsx45ANjV9LSn0f9YnIA79IgKZ04dHZ3ashLcG2oC2YK8RfwkUSFtxWarNYRTqru7DH79E0b1aDqBAhJrjLSQAU0l66JOpbgmZOzGx4guMW8MAhvjGzQsLIAc7oGy7SLw/s1045/light-sense-7.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;646&quot; data-original-width=&quot;1045&quot; height=&quot;396&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEguPSeXwgqstXmsa2s_b8K9nR3bMNPNekwykDxlX3o6_xjm3Tk0QMWvpZsx45ANjV9LSn0f9YnIA79IgKZ04dHZ3ashLcG2oC2YK8RfwkUSFtxWarNYRTqru7DH79E0b1aDqBAhJrjLSQAU0l66JOpbgmZOzGx4guMW8MAhvjGzQsLIAc7oGy7SLw/w640-h396/light-sense-7.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jgc.org/feeds/8870263574877874516/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/19303585/8870263574877874516' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19303585/posts/default/8870263574877874516'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19303585/posts/default/8870263574877874516'/><link rel='alternate' type='text/html' href='http://blog.jgc.org/2024/06/two-ways-to-use-led-as-light-sensor.html' title='Two ways to use  an LED as a light sensor with Arduino'/><author><name>Unknown</name><email>[email protected]</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXokF70rNbNS2w0ei9bHqVGaFi6KVXF6Cjlnd3Hp9yhhSD38FrvHTbdFRYr1JE4GUTywylxdFse1dKiBoO98IY3IYqpq8MSaUq6iAyq36rGKzgnli8gUKw_QmgleW2eJlX6Ns6MOukC_K3HvjRXfakGLjoHmCKL3Bj_-ful7Rz779ZPTy8UH-qXQ/s72-w640-h614-c/light-sense-1.jpg" height="72" width="72"/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19303585.post-6968922646267599704</id><published>2024-06-15T16:36:00.003+00:00</published><updated>2024-06-15T16:36:27.119+00:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="retro"/><title type='text'>Acorn Computer Systems catalogue circa 1983</title><content type='html'>&lt;p&gt;I unearthed a catalogue that I&#39;d picked up in around 1983 of &lt;a href=&quot;https://en.wikipedia.org/wiki/Acorn_System&quot;&gt;Acorn Computer Systems&lt;/a&gt;. This catalogue overlaps the BBC Micro era (which was released in 1981) as it goes up to the final Acorn System 5 (released in 1983).&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYB_ryt3FgR3bm1pwlfDV1jRwCeCUsS1mZT4i5TcAnMLi97PmT1pY10luDQifXwfB6Fj0ZSXRBQ9VoOkvtaGdVnmt7ewBTnwvOR4p4pFh_739x5QF68AsfJui7HOhTmfFyxXWmYI65F5pymISiQ6BvV-C4b-ApbQHJr_1chswGLAfu5wwTyePBmQ/s1820/acs-1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1820&quot; data-original-width=&quot;1284&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYB_ryt3FgR3bm1pwlfDV1jRwCeCUsS1mZT4i5TcAnMLi97PmT1pY10luDQifXwfB6Fj0ZSXRBQ9VoOkvtaGdVnmt7ewBTnwvOR4p4pFh_739x5QF68AsfJui7HOhTmfFyxXWmYI65F5pymISiQ6BvV-C4b-ApbQHJr_1chswGLAfu5wwTyePBmQ/w452-h640/acs-1.png&quot; width=&quot;452&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;The Acorn Computer Systems were based on the &lt;a href=&quot;https://en.wikipedia.org/wiki/Eurocard_(printed_circuit_board)&quot;&gt;Eurocard&lt;/a&gt; format for PCBs that can be mounted in a standard chassis.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhD9H3L4jE0uGxHaedCcbSJ_SgbU6JYz4oc2b4AJ8dPqUQZOQPeRXakUwiGR5PO5yuqN_x42FNkcbFS0J8lzilUEFFRLJDMFXRet23td9eTFXKGI1ykIZiQ1Ncs7Z5qPsqFR9S11CGTh6u8pcZMN6dQaQZYhJZ6I0t38UMjpzMlyZsqgkAHO3C18Q/s2576/acs-2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1832&quot; data-original-width=&quot;2576&quot; height=&quot;456&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhD9H3L4jE0uGxHaedCcbSJ_SgbU6JYz4oc2b4AJ8dPqUQZOQPeRXakUwiGR5PO5yuqN_x42FNkcbFS0J8lzilUEFFRLJDMFXRet23td9eTFXKGI1ykIZiQ1Ncs7Z5qPsqFR9S11CGTh6u8pcZMN6dQaQZYhJZ6I0t38UMjpzMlyZsqgkAHO3C18Q/w640-h456/acs-2.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;The Eurocard format meant that you could design a system for your needs, including handling&amp;nbsp;&lt;a href=&quot;https://en.wikipedia.org/wiki/Prestel&quot;&gt;Prestel&lt;/a&gt;/Teletext.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsON78AbO8VJDb3GukdR6KseGoFfxzzegqHcwKs9puAVI21QtObA67KglXU33UgJYyODviq0jaAMATccfey2Vxgee6FdLqvol0VNFhomGJuWVmUhgzRiPIp_vzHyCmJ0l35ldp6ivogczNXRHJcudL5OtbeB6Bl0N5KDUPN05iZrgw7_9WTE8jwA/s2576/acs-3.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1832&quot; data-original-width=&quot;2576&quot; height=&quot;456&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsON78AbO8VJDb3GukdR6KseGoFfxzzegqHcwKs9puAVI21QtObA67KglXU33UgJYyODviq0jaAMATccfey2Vxgee6FdLqvol0VNFhomGJuWVmUhgzRiPIp_vzHyCmJ0l35ldp6ivogczNXRHJcudL5OtbeB6Bl0N5KDUPN05iZrgw7_9WTE8jwA/w640-h456/acs-3.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;And, of course, you could add RAM.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNqOO-CoDyKGq8YC3uMyVJDC0Uyc0Bm8LRM99hWEWoZxXL5M36AyX1pxdcvX1KskI_93IIE1FvYZVF0ESfsF1MfEJ20_iHsAguH3MMyPLma1mR3fZVm5NSAtrLfzNi4M1kK4m4V-_63roMoIq36wIkGOeZicdjwr7ORBdj6LfBIfxqe6Mja9mSFA/s2576/acs-4.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1832&quot; data-original-width=&quot;2576&quot; height=&quot;456&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNqOO-CoDyKGq8YC3uMyVJDC0Uyc0Bm8LRM99hWEWoZxXL5M36AyX1pxdcvX1KskI_93IIE1FvYZVF0ESfsF1MfEJ20_iHsAguH3MMyPLma1mR3fZVm5NSAtrLfzNi4M1kK4m4V-_63roMoIq36wIkGOeZicdjwr7ORBdj6LfBIfxqe6Mja9mSFA/w640-h456/acs-4.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;A complete scan of the catalogue is available &lt;a href=&quot;https://drive.google.com/file/d/1SuvuhgH5UQz12DHGqSy5rZFS4aavdGf7/view?usp=sharing&quot;&gt;here&lt;/a&gt; as a PDF.&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jgc.org/feeds/6968922646267599704/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/19303585/6968922646267599704' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19303585/posts/default/6968922646267599704'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19303585/posts/default/6968922646267599704'/><link rel='alternate' type='text/html' href='http://blog.jgc.org/2024/06/acorn-computer-systems-catalogue-circa.html' title='Acorn Computer Systems catalogue circa 1983'/><author><name>Unknown</name><email>[email protected]</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYB_ryt3FgR3bm1pwlfDV1jRwCeCUsS1mZT4i5TcAnMLi97PmT1pY10luDQifXwfB6Fj0ZSXRBQ9VoOkvtaGdVnmt7ewBTnwvOR4p4pFh_739x5QF68AsfJui7HOhTmfFyxXWmYI65F5pymISiQ6BvV-C4b-ApbQHJr_1chswGLAfu5wwTyePBmQ/s72-w452-h640-c/acs-1.png" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19303585.post-5445303529809922034</id><published>2024-06-05T17:29:00.007+00:00</published><updated>2024-06-07T16:20:02.448+00:00</updated><title type='text'>Fixing my iPhone 13 Pro cameras at -18C</title><content type='html'>&lt;p&gt;Look, I don&#39;t recommend you do this with your phone because bad things may happen, but the front and back cameras on my iPhone 13 Pro stopped working (in the camera app the image was black) and I &quot;fixed&quot; them myself using only a household appliance.&amp;nbsp;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjO4w9hVxSZm6TGzsmvw1GUKUb4eN109N4zqYyIE_Ptj3ZqOS8whM9P6Dao0TQBFvakuNjRm-9_7HFkAuTOqQDqtRue0wpcP2p2yMyyfyOan4OTsyaWrVmkoqoLzJMuLN8LXDh8aAyiPyzJi-8aQv23U11opY56U-ylSyLFGmAC4pVOKf9kjGl_wg/s1082/255k-1.jpeg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1082&quot; data-original-width=&quot;500&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjO4w9hVxSZm6TGzsmvw1GUKUb4eN109N4zqYyIE_Ptj3ZqOS8whM9P6Dao0TQBFvakuNjRm-9_7HFkAuTOqQDqtRue0wpcP2p2yMyyfyOan4OTsyaWrVmkoqoLzJMuLN8LXDh8aAyiPyzJi-8aQv23U11opY56U-ylSyLFGmAC4pVOKf9kjGl_wg/w185-h400/255k-1.jpeg&quot; width=&quot;185&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;I was planning to get them replaced but to do that I&#39;d need to replace the screen (because it has a crack in it) and it turned out to be €€€ so I figured I&#39;d soldier on with a phone with a broken camera. Oddly, the flashlight still worked and FaceID.&lt;/p&gt;&lt;p&gt;But, hey, in the past I&#39;d retrieved &lt;a href=&quot;https://blog.jgc.org/2023/08/retrieving-1tb-of-data-from-faulty.html&quot;&gt;1TB of data using woodworking tools&lt;/a&gt; and this camera problem looked like yet another small connection fault to me. And connection faults like this shout &quot;cool the thing down&quot; to me, so I figured it was worth a try cooling the phone down (a lot). To be fair, I don&#39;t have a case on my phone have dropped it a few times.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJ-0hfZKAopa8bT_2U6yRCeIu5DMg3xLsOQxdx02inFIY4wuQvohZhTTFrxEDNzE4WmPvotdsXOklojkpKMSYnz-MlkvtBM97hlNRwFNedJ_2PBT9u658mCjlbSNZNjUtMfqBMv_gS3Q8dSaB-WMWRVxxjOVnRgk90IIj3PGVWr5HCl9xcNKsWkQ/s500/255k-3.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;342&quot; data-original-width=&quot;500&quot; height=&quot;274&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJ-0hfZKAopa8bT_2U6yRCeIu5DMg3xLsOQxdx02inFIY4wuQvohZhTTFrxEDNzE4WmPvotdsXOklojkpKMSYnz-MlkvtBM97hlNRwFNedJ_2PBT9u658mCjlbSNZNjUtMfqBMv_gS3Q8dSaB-WMWRVxxjOVnRgk90IIj3PGVWr5HCl9xcNKsWkQ/w400-h274/255k-3.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;Apple says the &lt;a href=&quot;https://support.apple.com/en-gb/guide/iphone/iphbbe12ba1/&quot;&gt;iPhone can be stored at -20C switched off&lt;/a&gt; and a quick check of my freezer showed it was at -18C. So, one switched off iPhone in a ziplock bag and fifteen minutes later I had a phone with working cameras again.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjiZ-5OQdBlGA7FvhMSapl4b5aFORcG4EBFqceijo_ckLLkK1QI_IXMHg-nfZTm1MFbsQHZE-hvQlKJTnsIjaNB9nMhaeQJ0GL0uacI_dz-z-mNx8NO58d7xv2DZjj0wRHGCFZiTV391Rs-iOPLBsfjNHaFcH9_DzbXO1jwAumMGJ-VHaIt3iKlUA/s747/255k-2.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;747&quot; data-original-width=&quot;500&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjiZ-5OQdBlGA7FvhMSapl4b5aFORcG4EBFqceijo_ckLLkK1QI_IXMHg-nfZTm1MFbsQHZE-hvQlKJTnsIjaNB9nMhaeQJ0GL0uacI_dz-z-mNx8NO58d7xv2DZjj0wRHGCFZiTV391Rs-iOPLBsfjNHaFcH9_DzbXO1jwAumMGJ-VHaIt3iKlUA/w268-h400/255k-2.jpg&quot; width=&quot;268&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;And a battery that needed recharging.&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jgc.org/feeds/5445303529809922034/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/19303585/5445303529809922034' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19303585/posts/default/5445303529809922034'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19303585/posts/default/5445303529809922034'/><link rel='alternate' type='text/html' href='http://blog.jgc.org/2024/06/fixing-my-iphone-13-pro-cameras-at-18c.html' title='Fixing my iPhone 13 Pro cameras at -18C'/><author><name>Unknown</name><email>[email protected]</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjO4w9hVxSZm6TGzsmvw1GUKUb4eN109N4zqYyIE_Ptj3ZqOS8whM9P6Dao0TQBFvakuNjRm-9_7HFkAuTOqQDqtRue0wpcP2p2yMyyfyOan4OTsyaWrVmkoqoLzJMuLN8LXDh8aAyiPyzJi-8aQv23U11opY56U-ylSyLFGmAC4pVOKf9kjGl_wg/s72-w185-h400-c/255k-1.jpeg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19303585.post-4308511000929231325</id><published>2024-05-27T16:55:00.004+00:00</published><updated>2024-09-12T08:58:20.564+00:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="hits"/><category scheme="http://www.blogger.com/atom/ns#" term="pseudo-randomness"/><title type='text'>Controlling the Taylor Swift Eras Tour wristbands with Flipper Zero</title><content type='html'>&lt;p&gt;Many large concerts feature wristbands that light up on command. They are used to produce varied visual effects across a stadium. One company that makes these is &lt;a href=&quot;https://pixmob.com/&quot;&gt;PixMob&lt;/a&gt;. Their controllable, illuminated wristbands are currently being used as part of &lt;a href=&quot;https://en.wikipedia.org/wiki/The_Eras_Tour&quot;&gt;Taylor Swift&#39;s Eras Tour&lt;/a&gt;. A short Wired article &lt;a href=&quot;https://wired.me/technology/the-tech-behind-taylor-swift-concert-wristbands/&quot;&gt;here&lt;/a&gt; gives some details and here&#39;s a video from the Wall Street Journal:&lt;/p&gt;&lt;div style=&quot;text-align: center;&quot;&gt;&lt;iframe allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;315&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot; src=&quot;https://www.youtube.com/embed/GCsmZA08oD8?si=e3755KHJFdna_zBV&quot; title=&quot;YouTube video player&quot; width=&quot;560&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;p&gt;For the Eras Tour the company&#39;s X2 product is being used. It looks like this:&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQg9Q19zegc3hBuX2vNtiBNssn2XKYwLKBcAw1y34T1bEwMY3ITvksGMnVa4Ifzt_yaCsWHZf8AJjHRMoiodRsSMp8nKfm13E-oldA1RQ9UEqRxJkF98UzunZfGwo49Nwp7xjCMGl56Prugv67T6tXT9msEmRpl2FDuvLMXef31xgDZij7j-5sdg/s3731/eras-1.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1340&quot; data-original-width=&quot;3731&quot; height=&quot;230&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQg9Q19zegc3hBuX2vNtiBNssn2XKYwLKBcAw1y34T1bEwMY3ITvksGMnVa4Ifzt_yaCsWHZf8AJjHRMoiodRsSMp8nKfm13E-oldA1RQ9UEqRxJkF98UzunZfGwo49Nwp7xjCMGl56Prugv67T6tXT9msEmRpl2FDuvLMXef31xgDZij7j-5sdg/w640-h230/eras-1.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;Since these wristbands are designed for reuse they are easily opened revealing two batteries and a lovely little circuit board:&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQsQ3X_JVN4fln9WOBbyohyphenhyphenrSuV8jFu_Cm-oYlf9pa7o5_2pv4AEzpDbRNTPGZcfA4bDvzVM_4qpvNB-jZRUuawJo28u9fjCIFNDXEh8SkR5TYxMGBi3B9qNBfNOf6ihbqAn23fhXdwywkCpLqO1nNZ6IroifiZtGkviBfCfKDQtivvgyy07zg-g/s2823/eras-2.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;2234&quot; data-original-width=&quot;2823&quot; height=&quot;506&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQsQ3X_JVN4fln9WOBbyohyphenhyphenrSuV8jFu_Cm-oYlf9pa7o5_2pv4AEzpDbRNTPGZcfA4bDvzVM_4qpvNB-jZRUuawJo28u9fjCIFNDXEh8SkR5TYxMGBi3B9qNBfNOf6ihbqAn23fhXdwywkCpLqO1nNZ6IroifiZtGkviBfCfKDQtivvgyy07zg-g/w640-h506/eras-2.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;Here&#39;s that circuit board with the copyright date of 20230629, clear markings of the components and a little palm tree next to PALM V2.6r1. It does look &quot;Designed with 🖤 in Montréal&quot;!&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgu9JtblHe06nqdgEHaGGxg7jAha5zSxrJnkZYcUoCdAz3jHfeZ07_9waLR0RW8SvvyjkHfDqz_ak_M0bIZCrE0v-08Q5raviX844Mgm_bZf9gpQROLKtlUwuatt0_2ErTXD6HEAsR-vCm8HmYFADwmYYJo490ez5xksNqmlm8v63vBefTl6PQqCg/s3483/eras-3.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1996&quot; data-original-width=&quot;3483&quot; height=&quot;366&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgu9JtblHe06nqdgEHaGGxg7jAha5zSxrJnkZYcUoCdAz3jHfeZ07_9waLR0RW8SvvyjkHfDqz_ak_M0bIZCrE0v-08Q5raviX844Mgm_bZf9gpQROLKtlUwuatt0_2ErTXD6HEAsR-vCm8HmYFADwmYYJo490ez5xksNqmlm8v63vBefTl6PQqCg/w640-h366/eras-3.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;On that board are two RGB LEDs, a little microcontroller, a little bit of EEPROM and an infrared diode to receive a signal. So, simply put, PixMob works by installed a really big (and moveable) IR remote control (you can read about this on their website &lt;a href=&quot;https://pixmob.com/our-effects&quot;&gt;here&lt;/a&gt;) and transmitting commands to the bracelets to produce colours, fades, flashes, etc. Cute.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;There are a bunch of hardware details &lt;a href=&quot;https://yeokhengmeng.com/2019/08/teardown-of-ndp2019-led-wristband/&quot;&gt;here&lt;/a&gt;.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;Since they are projecting infrared with moveable projector they can sweep effects around the stadium, and cover the projector with cut outs to make things like hearts. It&#39;s simple technology that works very nicely. And, of course, there&#39;s a reverse engineering community built up around this.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;The best place to start learning about that is &lt;a href=&quot;https://github.com/danielweidman/pixmob-ir-reverse-engineering&quot;&gt;this&lt;/a&gt; GitHub repository. It brings together a bunch of reverse engineering efforts that have looked into the IR protocol. These have been somewhat successful and, since the &lt;a href=&quot;https://flipperzero.one/&quot;&gt;Flipper Zero&lt;/a&gt; has IR capability, there&#39;s a &lt;a href=&quot;https://github.com/danielweidman/flipper-pixmob-ir-codes&quot;&gt;project&lt;/a&gt; that makes it control the wristband.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;Here&#39;s a short video of me making the wristbands fade orange.&lt;/div&gt;&lt;br /&gt;&lt;iframe allow=&quot;accelerometer; gyroscope; autoplay; encrypted-media; picture-in-picture;&quot; allowfullscreen=&quot;true&quot; loading=&quot;lazy&quot; src=&quot;https://customer-rww76yind8iym5aw.cloudflarestream.com/e2e26c96afd3438d0114d293ec4c0cac/iframe?poster=https%3A%2F%2Fcustomer-rww76yind8iym5aw.cloudflarestream.com%2Fe2e26c96afd3438d0114d293ec4c0cac%2Fthumbnails%2Fthumbnail.jpg%3Ftime%3D%26height%3D600&quot; style=&quot;border: none; height: 400px; left: 0; position: relative; top: 0; width: 100%;&quot;&gt;&lt;/iframe&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;Such nice simple technology that produces very cool effects.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jgc.org/feeds/4308511000929231325/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/19303585/4308511000929231325' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19303585/posts/default/4308511000929231325'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19303585/posts/default/4308511000929231325'/><link rel='alternate' type='text/html' href='http://blog.jgc.org/2024/05/controlling-taylor-swift-eras-tour.html' title='Controlling the Taylor Swift Eras Tour wristbands with Flipper Zero'/><author><name>Unknown</name><email>[email protected]</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/GCsmZA08oD8/default.jpg" height="72" width="72"/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19303585.post-974739914720448872</id><published>2024-04-11T12:22:00.000+00:00</published><updated>2024-04-11T12:22:22.922+00:00</updated><title type='text'>The Economist&#39;s ugly new print typeface</title><content type='html'>Turning to the back page of a recent copy of The Economist to read the obituary of &lt;a href=&quot;https://www.economist.com/obituary/2024/04/03/paul-alexander-lived-longer-than-anyone-in-an-iron-lung&quot;&gt;Paul Alexander&lt;/a&gt; the eye is assaulted by The Economist&#39;s &lt;a href=&quot;https://www.economist.com/the-economist-explains/2024/02/07/why-has-the-economist-changed-its-typeface&quot;&gt;new, ugly, hard-to-read typeface&lt;/a&gt;&amp;nbsp;(which came about because: &quot;In early 2023, as our font licence was coming up for renewal, we decided that we wanted to create something unique to The Economist.&quot;)&amp;nbsp;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The very first letter of the obituary, the drop capital, seems set adrift from the rest of the word it belongs to and about to slam into a letter on the following line. This really bugs me,&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghV9qeDSGH6Ovc6e5iAMyqf49Eu0IPh119LHE9auqRtrdu1O2kyDw43UUcsBFErDJVJonAm8w8y6lyL1ep8B101kuPajzafqdt-HPl-3bBI7gd-rAPBSewzvy_7i86UQdPBJzxMvtS4Hm4USPFp-Bf-5khaE7oOqsqlB7VdxZwqcDhkmKZUamXuA/s1243/economist-1.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;317&quot; data-original-width=&quot;1243&quot; height=&quot;163&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghV9qeDSGH6Ovc6e5iAMyqf49Eu0IPh119LHE9auqRtrdu1O2kyDw43UUcsBFErDJVJonAm8w8y6lyL1ep8B101kuPajzafqdt-HPl-3bBI7gd-rAPBSewzvy_7i86UQdPBJzxMvtS4Hm4USPFp-Bf-5khaE7oOqsqlB7VdxZwqcDhkmKZUamXuA/w640-h163/economist-1.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;The problems don&#39;t stop with drop capitals. Here&#39;s a short part of the article&amp;nbsp;&lt;a href=&quot;https://www.economist.com/united-states/2024/04/04/the-biden-campaign-in-michigan-has-a-tremendous-ground-game-advantage&quot;&gt;The Biden campaign in Michigan has a tremendous ground-game advantage&lt;/a&gt;. The W from Wolverine seems to be about snag on the g of campaign.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFvtQ8nmx_4FA6ouIMAY-hPCFMgxzOhqbTzslvyTOwM4_SwRlQ14EtFOz1weN6Iqq_NmYDP6XjNI67EPpzzllYqn-dcKKIBRTEAGvMgHxZdSjvHjFjzEvFyRsEs-DepJY7283m4kxp9XdRiKBmwgpqYm7BlMPnSOgWZub_3nvmjQt7Du-0i-h6XA/s847/economist-2.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;260&quot; data-original-width=&quot;847&quot; height=&quot;196&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFvtQ8nmx_4FA6ouIMAY-hPCFMgxzOhqbTzslvyTOwM4_SwRlQ14EtFOz1weN6Iqq_NmYDP6XjNI67EPpzzllYqn-dcKKIBRTEAGvMgHxZdSjvHjFjzEvFyRsEs-DepJY7283m4kxp9XdRiKBmwgpqYm7BlMPnSOgWZub_3nvmjQt7Du-0i-h6XA/w640-h196/economist-2.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;And here&#39;s a little bit of&amp;nbsp;&lt;a href=&quot;https://www.economist.com/the-americas/2024/04/04/justin-trudeau-is-beset-by-a-divided-party-and-an-angry-electorate&quot;&gt;Justin Trudeau is beset by a divided party and an angry electorate&lt;/a&gt;. The gg in staggering and the T in The draw the eye to their closeness. The overall effect in this excerpt is that some lines seem closer together than others.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhilAeEgDN-pajI_J5k5XzY7OX80s1diWLIYG42qpnpRoxnvzPBP-ckDrjv8_QdhyphenhyphenWQAsEB1zB9UIryzOeUu-tqgXedTlTD_AHLGsL3KqlTvGcXSU6nVk1FRSx9IM3oBZI-nmw-_uMpMYUzI1L-lF-FSdxJaX1ZsXcrZn-csvoJHG1aayureHu2ig/s858/economist-3.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;352&quot; data-original-width=&quot;858&quot; height=&quot;262&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhilAeEgDN-pajI_J5k5XzY7OX80s1diWLIYG42qpnpRoxnvzPBP-ckDrjv8_QdhyphenhyphenWQAsEB1zB9UIryzOeUu-tqgXedTlTD_AHLGsL3KqlTvGcXSU6nVk1FRSx9IM3oBZI-nmw-_uMpMYUzI1L-lF-FSdxJaX1ZsXcrZn-csvoJHG1aayureHu2ig/w640-h262/economist-3.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;The new typeface makes the print edition of The Economist hard to read. As the eye scans across the page it snags on lines that seem on a collision course. And at the end of a line finding the corresponding next line is harder than before.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;These problems do not occur when the new typeface is used online. Something about the line spacing in print makes the new typeface hard to read on paper and easy on screen. Perhaps print doesn&#39;t matter any more to The Economist. In the article about the new typeface they say that &quot;Most of our readers subscribe to us digitally&quot;.&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jgc.org/feeds/974739914720448872/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/19303585/974739914720448872' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19303585/posts/default/974739914720448872'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19303585/posts/default/974739914720448872'/><link rel='alternate' type='text/html' href='http://blog.jgc.org/2024/04/the-economists-ugly-new-print-typeface.html' title='The Economist&#39;s ugly new print typeface'/><author><name>Unknown</name><email>[email protected]</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghV9qeDSGH6Ovc6e5iAMyqf49Eu0IPh119LHE9auqRtrdu1O2kyDw43UUcsBFErDJVJonAm8w8y6lyL1ep8B101kuPajzafqdt-HPl-3bBI7gd-rAPBSewzvy_7i86UQdPBJzxMvtS4Hm4USPFp-Bf-5khaE7oOqsqlB7VdxZwqcDhkmKZUamXuA/s72-w640-h163-c/economist-1.jpg" height="72" width="72"/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19303585.post-1499907955973408015</id><published>2024-03-13T17:54:00.005+00:00</published><updated>2024-03-13T17:55:56.255+00:00</updated><title type='text'>The formal development of secure systems (my 1992 doctoral thesis)</title><content type='html'>&lt;p&gt;Since this doesn&#39;t seem to be findable online anywhere here&#39;s &lt;a href=&quot;https://jgc.org/jgc-thesis.pdf&quot;&gt;a PDF generated from the original .tex files&lt;/a&gt; that I kept on a floppy for 30 years!&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPr9V1X6gahw9x5YhG_1dOF0m5vM937lO4xgvtxdLhLrp_x9Sv9pPatWgfXfKyV-td-TG1AlcCofPoy8zAubokQmL64wxKTpc8T7FYfa9y-at545Yr06_Y62XK5G49H9wEJCcmSIiwmGFprTUodBHyoltlEDhEbG7ad7_7nYlarcI9ljCxD97x4A/s1828/thesis-1.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1828&quot; data-original-width=&quot;1294&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPr9V1X6gahw9x5YhG_1dOF0m5vM937lO4xgvtxdLhLrp_x9Sv9pPatWgfXfKyV-td-TG1AlcCofPoy8zAubokQmL64wxKTpc8T7FYfa9y-at545Yr06_Y62XK5G49H9wEJCcmSIiwmGFprTUodBHyoltlEDhEbG7ad7_7nYlarcI9ljCxD97x4A/w454-h640/thesis-1.png&quot; width=&quot;454&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjA7oV4zi-An_TKRShSa1bZYhhxn0r3ueZ9pVZNnZTi-8tlBQguQst-QRYZm8kBdbchHU1p3TCyMAp8SKgaaag_Ie_VqxQKkex7zasZI2rSCtjsAToN5JUeVLUxY8_rz1coao2aTHkMXXiN-Qo0NasrOI1Tj3CZHFO3HCPLqvH2DLzaOH4HIuxJmw/s1828/thesis-2.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1828&quot; data-original-width=&quot;1294&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjA7oV4zi-An_TKRShSa1bZYhhxn0r3ueZ9pVZNnZTi-8tlBQguQst-QRYZm8kBdbchHU1p3TCyMAp8SKgaaag_Ie_VqxQKkex7zasZI2rSCtjsAToN5JUeVLUxY8_rz1coao2aTHkMXXiN-Qo0NasrOI1Tj3CZHFO3HCPLqvH2DLzaOH4HIuxJmw/w454-h640/thesis-2.png&quot; width=&quot;454&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;If you&#39;re curious about formal methods and computer security in 1992, or just want to read some &lt;a href=&quot;https://en.wikipedia.org/wiki/Communicating_sequential_processes&quot;&gt;CSP&lt;/a&gt; and &lt;a href=&quot;https://en.wikipedia.org/wiki/Occam_(programming_language)&quot;&gt;occam&lt;/a&gt; code, you may enjoy it. It does get a little technical:&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjA6DyYdI95wN_Kt1-y7BXDj3kgF5r5L1IeOeTVnLGLsub9koKlN8WaLLE1Snc-NppZmsxQ0D7b5V25BDgSYtABQKbDgc7vtBbfxqEwg7ZNrW4EvNO4ZsisCJcSuWtuyVLZzxJZg_ttld1eVUNyInF4BrbLHMlKm9B3ENlqTIqsZDbG90ASSHpUg/s1828/thesis-3.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1828&quot; data-original-width=&quot;1294&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjA6DyYdI95wN_Kt1-y7BXDj3kgF5r5L1IeOeTVnLGLsub9koKlN8WaLLE1Snc-NppZmsxQ0D7b5V25BDgSYtABQKbDgc7vtBbfxqEwg7ZNrW4EvNO4ZsisCJcSuWtuyVLZzxJZg_ttld1eVUNyInF4BrbLHMlKm9B3ENlqTIqsZDbG90ASSHpUg/w454-h640/thesis-3.png&quot; width=&quot;454&quot; /&gt;&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jgc.org/feeds/1499907955973408015/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/19303585/1499907955973408015' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19303585/posts/default/1499907955973408015'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19303585/posts/default/1499907955973408015'/><link rel='alternate' type='text/html' href='http://blog.jgc.org/2024/03/the-formal-development-of-secure.html' title='The formal development of secure systems (my 1992 doctoral thesis)'/><author><name>Unknown</name><email>[email protected]</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPr9V1X6gahw9x5YhG_1dOF0m5vM937lO4xgvtxdLhLrp_x9Sv9pPatWgfXfKyV-td-TG1AlcCofPoy8zAubokQmL64wxKTpc8T7FYfa9y-at545Yr06_Y62XK5G49H9wEJCcmSIiwmGFprTUodBHyoltlEDhEbG7ad7_7nYlarcI9ljCxD97x4A/s72-w454-h640-c/thesis-1.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19303585.post-6683007227968107268</id><published>2024-03-13T09:06:00.003+00:00</published><updated>2024-03-13T10:31:19.587+00:00</updated><title type='text'>Taschen, Acorn and Knoll&#39;s Law</title><content type='html'>&lt;p&gt;I have a copy of Taschen&#39;s huge book &lt;a href=&quot;https://www.taschen.com/en/books/popculture/04692/the-computer&quot;&gt;The Computer&lt;/a&gt;. 472 pages of computer history with lots of lovely photographs.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheoT_uB9SbbnOoCjcAqXc1datswx92Hq9vHSJ-DU5hCn05tGCF_3n9KjGcrU7eMcL-c8WQDKcH-8WhVjNe3HR1MIpLTmp9x8r6OkuoWuViCL_oRsWgwKeupH08DG8efLcHTV9stZyB3-wyE8wB9T45fjn8vt4W0ju7MwTvx0x3GiLF-yL9Vzc8ww/s1004/book.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1004&quot; data-original-width=&quot;674&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheoT_uB9SbbnOoCjcAqXc1datswx92Hq9vHSJ-DU5hCn05tGCF_3n9KjGcrU7eMcL-c8WQDKcH-8WhVjNe3HR1MIpLTmp9x8r6OkuoWuViCL_oRsWgwKeupH08DG8efLcHTV9stZyB3-wyE8wB9T45fjn8vt4W0ju7MwTvx0x3GiLF-yL9Vzc8ww/w430-h640/book.png&quot; width=&quot;430&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;Which is great, except that I turned to the page that covers one of the computers I know well, the &lt;a href=&quot;https://en.wikipedia.org/wiki/BBC_Micro&quot;&gt;BBC Micro&lt;/a&gt;, and see this:&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIs3Hspf8ci09EX9FljbKSUhWryOz3RJAxB1AbeTabozF_KU4_Rm4DcIQdu7VUzJAqXsc1AiIjvvi0H4zqhIRlig_lwcEH9LvZmFiPpXZqr-LTAEykE9Gilg3E_FlAGZaUVNw4-Ns7GViGWuZPz_lir_RCGb_fhf2or8Mc9X3u_P77PjNrfhKhhQ/s3220/amneisa.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1752&quot; data-original-width=&quot;3220&quot; height=&quot;348&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIs3Hspf8ci09EX9FljbKSUhWryOz3RJAxB1AbeTabozF_KU4_Rm4DcIQdu7VUzJAqXsc1AiIjvvi0H4zqhIRlig_lwcEH9LvZmFiPpXZqr-LTAEykE9Gilg3E_FlAGZaUVNw4-Ns7GViGWuZPz_lir_RCGb_fhf2or8Mc9X3u_P77PjNrfhKhhQ/w640-h348/amneisa.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;Which, at first glance, look fine, or rather it doesn&#39;t. The machine on the right is not an &quot;Acorn BBC Micro, 1981&quot;, it&#39;s an &quot;Acorn BBC Master 128, 1986&quot;. Sure, it&#39;s part of the BBC Micro line of computers but it&#39;s not what the caption says.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;So now I&#39;m stuck looking at the book thinking about Knoll&#39;s Law of Media Accuracy: &quot;Everything you read in the newspapers is absolutely true except for the rare story of which you happen to have firsthand knowledge.&quot;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;PS Also, I&#39;d argue that Acorn did &quot;stand a chance in the face of competition from Silicon Valley&quot; because it pivoted (as the Silicon Valley types like to say) into &lt;a href=&quot;https://www.arm.com/&quot;&gt;Arm&lt;/a&gt;.&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jgc.org/feeds/6683007227968107268/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/19303585/6683007227968107268' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19303585/posts/default/6683007227968107268'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19303585/posts/default/6683007227968107268'/><link rel='alternate' type='text/html' href='http://blog.jgc.org/2024/03/taschen-acorn-and-knolls-law.html' title='Taschen, Acorn and Knoll&#39;s Law'/><author><name>Unknown</name><email>[email protected]</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheoT_uB9SbbnOoCjcAqXc1datswx92Hq9vHSJ-DU5hCn05tGCF_3n9KjGcrU7eMcL-c8WQDKcH-8WhVjNe3HR1MIpLTmp9x8r6OkuoWuViCL_oRsWgwKeupH08DG8efLcHTV9stZyB3-wyE8wB9T45fjn8vt4W0ju7MwTvx0x3GiLF-yL9Vzc8ww/s72-w430-h640-c/book.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19303585.post-6321735604645731335</id><published>2024-03-09T13:42:00.002+00:00</published><updated>2024-05-08T13:28:46.298+00:00</updated><title type='text'>The Acme Klein Bottle (from Cliff Stoll and family)</title><content type='html'>&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Clifford_Stoll&quot;&gt;Cliff Stoll&lt;/a&gt; (who is probably most famous for writing the wonderful &lt;a href=&quot;https://en.wikipedia.org/wiki/The_Cuckoo%27s_Egg_(book)&quot;&gt;Cuckoo&#39;s Egg&lt;/a&gt; about tracking a hacker when doing so was almost recreational) runs a business making Klein bottles: &lt;a href=&quot;https://www.kleinbottle.com/&quot;&gt;Acme Klein Bottle&lt;/a&gt;. A Klein bottle is a weird shape (that doesn&#39;t actually exist in three dimensions) with only one side. A bottle with no inside and outside. A bit like the &lt;a href=&quot;https://en.wikipedia.org/wiki/M%C3%B6bius_strip&quot;&gt;Möbius strip&lt;/a&gt; has only one side.&lt;/p&gt;&lt;p&gt;In fact a Klein bottle can be made from two Möbius strips glued together along their edges. Unfortunately, that doesn&#39;t actually work in three dimensions so we&#39;re left with doing something called &quot;immersing&quot; the bottle in our three dimensional world.&lt;/p&gt;&lt;p&gt;The result is the bottle has to intersect itself. And that&#39;s what Cliff Stoll sells: immersions of Klein bottles in three dimensions. The real Klein bottle would need an extra dimension to not intersect itself. Here&#39;s my Acme Klein Bottle:&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUn4GP_thu9QY6vATo6fr7wJpGJoiAnFO1o8Ef0qNZ6pFyoCre2LrqTmwKiJm1S23u-ACP2keYHUsmASAVCRARoU7plviSUEIsNxNHbccKBxyM4Ov5XEkJLhyphenhyphen4I2D23sTBLnU7wnaLvfVSzZPXZZr1JoiJTkT6I76dtPxaeY51E_yZwib4j5RFjg/s3309/klein-1.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;3309&quot; data-original-width=&quot;2145&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUn4GP_thu9QY6vATo6fr7wJpGJoiAnFO1o8Ef0qNZ6pFyoCre2LrqTmwKiJm1S23u-ACP2keYHUsmASAVCRARoU7plviSUEIsNxNHbccKBxyM4Ov5XEkJLhyphenhyphen4I2D23sTBLnU7wnaLvfVSzZPXZZr1JoiJTkT6I76dtPxaeY51E_yZwib4j5RFjg/w414-h640/klein-1.jpg&quot; width=&quot;414&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;Cliff has &lt;a href=&quot;https://www.kleinbottle.com/whats_a_klein_bottle.htm&quot;&gt;a whole page&lt;/a&gt; describing the properties of a Klein Bottle. It&#39;s worth a read. Buying from Cliff is an experience in itself. Here&#39;s the packaging mine came in:&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaGdvQ8rNva9n8FhVc69v5I0gq0bjcAKS1VpLVkyoNtk58aqrT7t0Vxz4vRwBmmxTrQgVdcaCRbgo2IRapUglXh10zsmgtNgK3DLF4mm0fDfclOXD1fWSQiC99lylTdwOkg79VkrTH8CHYRnih4itTKzbCzE2nvTD1D5rkj3UObEvlipRD0r_-2g/s2989/1.jpeg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1999&quot; data-original-width=&quot;2989&quot; height=&quot;428&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaGdvQ8rNva9n8FhVc69v5I0gq0bjcAKS1VpLVkyoNtk58aqrT7t0Vxz4vRwBmmxTrQgVdcaCRbgo2IRapUglXh10zsmgtNgK3DLF4mm0fDfclOXD1fWSQiC99lylTdwOkg79VkrTH8CHYRnih4itTKzbCzE2nvTD1D5rkj3UObEvlipRD0r_-2g/w640-h428/1.jpeg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2Qz2olMfKIjous1YyCQyUmczPqywUNcBVoSn5BywW5hCj2-LxtZToZfHlakb_GtNkm3ejmz1bim9bdU8WhOatFrPqwbxGZNWm-wSf4Sjtll-cjqBePrHrk1Ee-_Nc-WOvRqXjtdpOtv3Gziz6upJVMGclQPmTCFq3MjgEDYGiho_WVOxRKg2-pg/s3417/2.jpeg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;2308&quot; data-original-width=&quot;3417&quot; height=&quot;432&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2Qz2olMfKIjous1YyCQyUmczPqywUNcBVoSn5BywW5hCj2-LxtZToZfHlakb_GtNkm3ejmz1bim9bdU8WhOatFrPqwbxGZNWm-wSf4Sjtll-cjqBePrHrk1Ee-_Nc-WOvRqXjtdpOtv3Gziz6upJVMGclQPmTCFq3MjgEDYGiho_WVOxRKg2-pg/w640-h432/2.jpeg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqeJR36T10S9LbdrulIwHtL9Mdx5ixV3u2DNYkr7wG3wvRNlPzT_p2xDLvAYeyI1GQOnLhHpROOaxlSMvs99FWo-3PtSbX3lEZMgi_ShFzwO-kOLrQtCBmBVV67DFA5Uq0dMX3wDrZKHV-SfqPqdKYbK9qyyaJnNnS6BGBY9r68WO9qFQgd2cwbg/s3166/5.jpeg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;2100&quot; data-original-width=&quot;3166&quot; height=&quot;424&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqeJR36T10S9LbdrulIwHtL9Mdx5ixV3u2DNYkr7wG3wvRNlPzT_p2xDLvAYeyI1GQOnLhHpROOaxlSMvs99FWo-3PtSbX3lEZMgi_ShFzwO-kOLrQtCBmBVV67DFA5Uq0dMX3wDrZKHV-SfqPqdKYbK9qyyaJnNnS6BGBY9r68WO9qFQgd2cwbg/w640-h424/5.jpeg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5-1bqhJSKD1EV4p60PllG0H4WW_fe4q0hjgyCvsq1DexCdkNKVPD0B89MD5mLzZ_LfJXiOIqbpxQx9m6JVRmQX-kQ6ttSiAbUoavAe_eTgyCEJ-okruPoWiXdvKyZiOWt9KmTD2mVuXX9nM6IfFg2bDQVm0tH47xovNQLn-KBxFpYapvjTStI0Q/s3111/6.jpeg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;2125&quot; data-original-width=&quot;3111&quot; height=&quot;438&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5-1bqhJSKD1EV4p60PllG0H4WW_fe4q0hjgyCvsq1DexCdkNKVPD0B89MD5mLzZ_LfJXiOIqbpxQx9m6JVRmQX-kQ6ttSiAbUoavAe_eTgyCEJ-okruPoWiXdvKyZiOWt9KmTD2mVuXX9nM6IfFg2bDQVm0tH47xovNQLn-KBxFpYapvjTStI0Q/w640-h438/6.jpeg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;Plus it comes with a free slide rule (every detail of every document included is worth reading):&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizANwZNwKGBeEYNMjP66mwT4toeyBI0SnpGjeqmCSfwwbPRd9cj7yYs1I69ZOIyLg9rv8AqmKrTZGfCYlrN7CL_5zbY39nkGy2OGzm4u2GSb8ds3O95_CY5-UG5ZHWuqdFFFYwQiB6gBTkRdenGuuKvvihedQYaDba72GURipBhuhktj3hgayD5g/s3713/klein-2.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;3713&quot; data-original-width=&quot;2817&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizANwZNwKGBeEYNMjP66mwT4toeyBI0SnpGjeqmCSfwwbPRd9cj7yYs1I69ZOIyLg9rv8AqmKrTZGfCYlrN7CL_5zbY39nkGy2OGzm4u2GSb8ds3O95_CY5-UG5ZHWuqdFFFYwQiB6gBTkRdenGuuKvvihedQYaDba72GURipBhuhktj3hgayD5g/w486-h640/klein-2.jpg&quot; width=&quot;486&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;Inspection report:&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjx24K8Q2Tqs92-IiqqPLc-U5xDRVhCs9vA3T57v1foXp6Zb3lxx-P3H4iVlfxkiXVtFThQhyphenhyphenC2ZWAKG1CPBdzxFEAhyphenhyphenj6RuOsgTTxZkIHKj8hKFpTQtEBh-kk8B8k5ooklp_MnObpg0oI46V4Lxhiv-Qu5nQon7RGXak1Rq-LivfD0rjNOzWp1nA/s3577/klein-3.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;3577&quot; data-original-width=&quot;2838&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjx24K8Q2Tqs92-IiqqPLc-U5xDRVhCs9vA3T57v1foXp6Zb3lxx-P3H4iVlfxkiXVtFThQhyphenhyphenC2ZWAKG1CPBdzxFEAhyphenhyphenj6RuOsgTTxZkIHKj8hKFpTQtEBh-kk8B8k5ooklp_MnObpg0oI46V4Lxhiv-Qu5nQon7RGXak1Rq-LivfD0rjNOzWp1nA/w508-h640/klein-3.jpg&quot; width=&quot;508&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;Safety instructions:&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhubiVSlEn7l9l56F4DYVLPFe-_ryfRHcWhiIs7W48ggdeGcf6Fewh73igMJ9BxgHKayXY8ze4TjZDJqD8O54N60xOWaT_et3LeBLY48uOYXWiPeJmhyATxuYYo2oJMUvuB8UEOqgf2lzfuxtlYiD0t-ysrFooywOiNGW-SR2s_STZHrXn_q955mg/s3653/klein-4.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;3653&quot; data-original-width=&quot;2842&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhubiVSlEn7l9l56F4DYVLPFe-_ryfRHcWhiIs7W48ggdeGcf6Fewh73igMJ9BxgHKayXY8ze4TjZDJqD8O54N60xOWaT_et3LeBLY48uOYXWiPeJmhyATxuYYo2oJMUvuB8UEOqgf2lzfuxtlYiD0t-ysrFooywOiNGW-SR2s_STZHrXn_q955mg/w498-h640/klein-4.jpg&quot; width=&quot;498&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;For best results, avoid doing stupid things.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6fSCT-KO4GUrEA6pFS4FG5_OhphSUEFZjDOiq0cqZFJSplOnr2IX6Z3ybvqThyphenhyphen4Z54RTdsfQP9izT5BxurLK31JT3gQMMvX2X8fOa7Ky4CHf2j441VVpvZtAxWIGwQt65NXpAcNFBJHPjmxbGmhZEJzcLpYiMm6iCxo3cTSc7vdZlHVC_tKNhJA/s3743/klein-5.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;3743&quot; data-original-width=&quot;2883&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6fSCT-KO4GUrEA6pFS4FG5_OhphSUEFZjDOiq0cqZFJSplOnr2IX6Z3ybvqThyphenhyphen4Z54RTdsfQP9izT5BxurLK31JT3gQMMvX2X8fOa7Ky4CHf2j441VVpvZtAxWIGwQt65NXpAcNFBJHPjmxbGmhZEJzcLpYiMm6iCxo3cTSc7vdZlHVC_tKNhJA/w492-h640/klein-5.jpg&quot; width=&quot;492&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;And there are some stickers, and a graduated scale you can add to the bottle (plus Cliff threw in a punched card to use as a bookmark):&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTo66hRgVGpOdNi9ELUbMiOVdZkrh9sR2rX8-7cB0nNWgDmS9iPHiesU7448ElLCWwcEzapsiml0ejXGAmYxX4CDjWOco6HJPbJchLX6yIE7-T_gLKePCsmr3n9bbdQn-qHbjHplPE8rBkupWKkhuxLPxLUJVL7obSNxL6rRkKOiRgLXWg-gw9ng/s3577/klein-6.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;3577&quot; data-original-width=&quot;2904&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTo66hRgVGpOdNi9ELUbMiOVdZkrh9sR2rX8-7cB0nNWgDmS9iPHiesU7448ElLCWwcEzapsiml0ejXGAmYxX4CDjWOco6HJPbJchLX6yIE7-T_gLKePCsmr3n9bbdQn-qHbjHplPE8rBkupWKkhuxLPxLUJVL7obSNxL6rRkKOiRgLXWg-gw9ng/w520-h640/klein-6.jpg&quot; width=&quot;520&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;So, if like me you were tired of the Möbius strip being the only &lt;a href=&quot;https://en.wikipedia.org/wiki/Orientability&quot;&gt;non-orientable surface&lt;/a&gt; you have in your home, rush over to Acme Klein Bottle and peruse the fine selection of bottles, large and klein, at &lt;a href=&quot;https://www.kleinbottle.com/&quot;&gt;Acme Klein Bottle&lt;/a&gt;.&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;I haven&#39;t described all that comes in the package, or what communication with Cliff via email is like. But if you want an experience that ends with a Klein bottle in your home, buy one.&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jgc.org/feeds/6321735604645731335/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/19303585/6321735604645731335' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19303585/posts/default/6321735604645731335'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19303585/posts/default/6321735604645731335'/><link rel='alternate' type='text/html' href='http://blog.jgc.org/2024/03/the-acme-klein-bottle-from-cliff-stoll.html' title='The Acme Klein Bottle (from Cliff Stoll and family)'/><author><name>Unknown</name><email>[email protected]</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUn4GP_thu9QY6vATo6fr7wJpGJoiAnFO1o8Ef0qNZ6pFyoCre2LrqTmwKiJm1S23u-ACP2keYHUsmASAVCRARoU7plviSUEIsNxNHbccKBxyM4Ov5XEkJLhyphenhyphen4I2D23sTBLnU7wnaLvfVSzZPXZZr1JoiJTkT6I76dtPxaeY51E_yZwib4j5RFjg/s72-w414-h640-c/klein-1.jpg" height="72" width="72"/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19303585.post-1960659042426703991</id><published>2024-02-13T14:05:00.014+00:00</published><updated>2024-02-14T08:24:05.461+00:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="pseudo-randomness"/><title type='text'>The original WWW proposal is a Word for Macintosh 4.0 file from 1990, can we open it?</title><content type='html'>&lt;p&gt;The W3C has a page with the &lt;a href=&quot;https://www.w3.org/History/1989/proposal.html&quot;&gt;original WWW proposal&lt;/a&gt; from Tim Berners-Lee. One of the downloads says&amp;nbsp;&lt;/p&gt;&lt;ul style=&quot;color: #302005;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://www.w3.org/History/1989/proposal&quot;&gt;The original document file (I think - I can&#39;t test it)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span style=&quot;color: #302005;&quot;&gt;The &quot;I can&#39;t test it&quot; made me sad. There are two other files (an RTF version and an HTML version generated in 1998 from the original file). But can we open the original document?&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #302005;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #302005;&quot;&gt;The original document is 68,608 bytes and &lt;span style=&quot;font-family: courier;&quot;&gt;file&lt;/span&gt; on my Mac says it&#39;s a&amp;nbsp;&lt;span style=&quot;font-family: courier;&quot;&gt;Microsoft Word for Macintosh 4.0&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt; file&lt;/span&gt;. That matches with TBL&#39;s note on the W3C page saying: &quot;A hand conversion to HTML of the original MacWord (or Word for Mac?) document written in March 1989 and later redistributed unchanged apart from the date added in May 1990.&quot;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #302005;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #302005;&quot;&gt;Microsoft Office for Mac came out in 1989 with System 6.0. That was Microsoft Word 4.0 so we&#39;re looking for compatibility with Microsoft Word for Macintosh 4.0. Let&#39;s see what modern software can open this. What I really want to be able to do is open it and convert it to, say, PDF with high fidelity.&lt;/span&gt;&lt;/div&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;color: #302005;&quot;&gt;Microsoft Word&lt;/span&gt;&lt;/h2&gt;&lt;div&gt;&lt;span style=&quot;color: #302005;&quot;&gt;Let&#39;s begin with Microsoft Word itself. I uploaded the file to Microsoft OneDrive with the extension .doc and clicked on it to open it in Microsoft Word.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #302005;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivCGzwNqeNyN4mZPNF593LeO14xECSZPabgJK43_trMY-NNlDrGrUYeGPAQ11lVk4vmh8o9U05sPW7xIYx1vDLIGDQWHFo9x6gEwqkvA3JzPkmLhyVS8HGHSCRXqH-yQXFo3Q9qxsje_rF5Vuzzm1YfxlIU2mlCXEvjDJ1ebeSl8G6gDD9zJ7iRA/s1358/proposal-1.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;524&quot; data-original-width=&quot;1358&quot; height=&quot;246&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivCGzwNqeNyN4mZPNF593LeO14xECSZPabgJK43_trMY-NNlDrGrUYeGPAQ11lVk4vmh8o9U05sPW7xIYx1vDLIGDQWHFo9x6gEwqkvA3JzPkmLhyVS8HGHSCRXqH-yQXFo3Q9qxsje_rF5Vuzzm1YfxlIU2mlCXEvjDJ1ebeSl8G6gDD9zJ7iRA/w640-h246/proposal-1.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;h2 style=&quot;clear: both; text-align: left;&quot;&gt;Apple Pages&lt;/h2&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;I switched to the Mac and hoped that Apple Pages might understand an old Microsoft Word for Macintosh file. No such luck.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisHsxI8gafx3rr9vSA7jui-HrzV_8CQYERBqT-6gQJwr1QbIiaIzYedxMRkiULhHaDkE8f0Lc7F-9erQ620RSRR_9e0qgX2tqoN1cxfScEwu7zzk2XO4LFiHAUbdOnvnRQNUGp8jt_p0r8cfiTw84qyH1JKCUFGK7-WQD2A2SqIYNA8BVCM_iSZw/s744/proposal-2.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;664&quot; data-original-width=&quot;744&quot; height=&quot;358&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisHsxI8gafx3rr9vSA7jui-HrzV_8CQYERBqT-6gQJwr1QbIiaIzYedxMRkiULhHaDkE8f0Lc7F-9erQ620RSRR_9e0qgX2tqoN1cxfScEwu7zzk2XO4LFiHAUbdOnvnRQNUGp8jt_p0r8cfiTw84qyH1JKCUFGK7-WQD2A2SqIYNA8BVCM_iSZw/w400-h358/proposal-2.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;h2 style=&quot;clear: both; text-align: left;&quot;&gt;Apache OpenOffice&lt;/h2&gt;&lt;div&gt;&lt;div&gt;Next let&#39;s hope open source software will come to the rescue. I downloaded the latest Apache OpenOffice and it did open the file but the formatting is gone and the diagrams are missing.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8eASEUl_mTNLs2hF2Fi-omu_5WvEjHONP_sAi8Wwn5R5GO0gciGwx7E-TySj-NUiz-xFxQ0XjDgRMcvKtJFPP6MLWOcwwBwBrpG50e2f8m3ld6eD23Afq-kCRT4Eb9_K4W_j1OaqeWP9aOYnIY7uaJ0E3iWyH2xXnSDL2UJF5TSI_zhKa_fI6CQ/s2652/proposal-3.png&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1920&quot; data-original-width=&quot;2652&quot; height=&quot;464&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8eASEUl_mTNLs2hF2Fi-omu_5WvEjHONP_sAi8Wwn5R5GO0gciGwx7E-TySj-NUiz-xFxQ0XjDgRMcvKtJFPP6MLWOcwwBwBrpG50e2f8m3ld6eD23Afq-kCRT4Eb9_K4W_j1OaqeWP9aOYnIY7uaJ0E3iWyH2xXnSDL2UJF5TSI_zhKa_fI6CQ/w640-h464/proposal-3.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;LibreOffice&lt;/h2&gt;&lt;div&gt;OK, maybe I need different open source software, so I switched to the latest &lt;a href=&quot;https://www.libreoffice.org/&quot;&gt;LibreOffice&lt;/a&gt; and it opened it. And the diagrams are crisp! Although there&#39;s something weird about the margins and there are other formatting problems.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMG83H6sPE9zk7abtg9woYAM6ryYid5DOmz_yegn0x7U_B5rkalViax7vrgAI2b6Zy9dD39gsMjBwmMhMMlefWQu0DfdT9ELMSlFcNFKh2DNRr7KsKMGwJgGmXUvhXiEd_OrE93V99yBr6c4WMS7Ak_7W0DSH5ezoYX3ob1gut5Nhd0XDyp63szA/s2644/proposal-4.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;2158&quot; data-original-width=&quot;2644&quot; height=&quot;522&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMG83H6sPE9zk7abtg9woYAM6ryYid5DOmz_yegn0x7U_B5rkalViax7vrgAI2b6Zy9dD39gsMjBwmMhMMlefWQu0DfdT9ELMSlFcNFKh2DNRr7KsKMGwJgGmXUvhXiEd_OrE93V99yBr6c4WMS7Ak_7W0DSH5ezoYX3ob1gut5Nhd0XDyp63szA/w640-h522/proposal-4.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;&lt;br /&gt;&lt;/h2&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;CERN PDF&lt;/h2&gt;&lt;div&gt;CERN makes available &lt;a href=&quot;https://cds.cern.ch/record/369245/files/dd-89-001.pdf&quot;&gt;a PDF version&lt;/a&gt; of the proposal which was apparently created in 1998 using&amp;nbsp;Acrobat Distiller Daemon 2.1 for SunOS/Solaris (SPARC). It has 20 pages. The LibreOffice imported version has 24 pages.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To get an overview of what&#39;s different I created a PDF from the LibreOffice version and then looked at it and the CERN PDF in the contact sheet version in Apple Preview.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here&#39;s the CERN PDF:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtmLx2yw7hBNA1hZ0YGxlcvJee0qSv5IoSm6ytWun-nEFw7z-5yWT0Ckc7pzcW6SGZl72nM-jYZUbV5ZUhUlfrGjYWcmz6HVD_p6XI1bEegfQucRbHhjfaPwnlz4mH_V-ANzeCzsMNDX8Fr5vsBpTi8oY1M-zCB26mlpsvCwdUzWXGi9mSNUfBrg/s2444/proposal-5.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;700&quot; data-original-width=&quot;2444&quot; height=&quot;184&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtmLx2yw7hBNA1hZ0YGxlcvJee0qSv5IoSm6ytWun-nEFw7z-5yWT0Ckc7pzcW6SGZl72nM-jYZUbV5ZUhUlfrGjYWcmz6HVD_p6XI1bEegfQucRbHhjfaPwnlz4mH_V-ANzeCzsMNDX8Fr5vsBpTi8oY1M-zCB26mlpsvCwdUzWXGi9mSNUfBrg/w640-h184/proposal-5.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here&#39;s the LibreOffice-generated PDF:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKTElIxIWy-jOHKCzOuLo8pd1rk_9ChaGL93vgNMElSsu9eRgIh_LHJ3yDVXzOvHFfF5iDEwRoPMH_Dyeuk1HNcB5K6wZOKu229VWK7kNpvpgGMXF7oekB5C-O4sRxK9fRPFTxSqEj8u3fUH7t9p8Un9on_hKu8sh0vliaQ98GRtp-TYRrrQ2PYQ/s2444/proposal-6.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1052&quot; data-original-width=&quot;2444&quot; height=&quot;276&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKTElIxIWy-jOHKCzOuLo8pd1rk_9ChaGL93vgNMElSsu9eRgIh_LHJ3yDVXzOvHFfF5iDEwRoPMH_Dyeuk1HNcB5K6wZOKu229VWK7kNpvpgGMXF7oekB5C-O4sRxK9fRPFTxSqEj8u3fUH7t9p8Un9on_hKu8sh0vliaQ98GRtp-TYRrrQ2PYQ/w640-h276/proposal-6.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Things that are different:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1. The right-hand margin is missing in the LibreOffice version.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;2. The LibreOffice version is using 14 pt vs. 12 pt for most of the text.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;3. The LibreOffice version has turned headers with TBL&#39;s initials in them into footers.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;4. The page breaks look in the right places (see how the images are correctly placed towards the end); thus it&#39;s probably the font size that&#39;s the biggest problem.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;5. There CERN PDF has a space under the heading and the LibreOffice version does not.&lt;/div&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Emulation&lt;/h2&gt;&lt;div&gt;To make sure that I knew what the actual original document looked like I decided to use &lt;a href=&quot;https://infinitemac.org/1990/System%206.0.5&quot;&gt;Infinite Mac&lt;/a&gt; to boot a 1990-era Macintosh and run actual Word for Macintosh 4.0 on the original document.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiijOiXeCEF_J1oTZBDun1YT3lye7507nTXRpEAUjYW6CQOVFhI6Qb1jGJhDgAJeOEA1BwmDFLqPYnq25JSXaK5zw2oZOFBTvZiVqmNfhf8Vfp4UYQ_HwJzIKuC_a3kAfvGNhR3U6rSlB77KUFilVUX2lVL7SKnnaQU4ZHkwilImtVFGqKak4kG1w/s1411/proposal-9.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1081&quot; data-original-width=&quot;1411&quot; height=&quot;490&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiijOiXeCEF_J1oTZBDun1YT3lye7507nTXRpEAUjYW6CQOVFhI6Qb1jGJhDgAJeOEA1BwmDFLqPYnq25JSXaK5zw2oZOFBTvZiVqmNfhf8Vfp4UYQ_HwJzIKuC_a3kAfvGNhR3U6rSlB77KUFilVUX2lVL7SKnnaQU4ZHkwilImtVFGqKak4kG1w/w640-h490/proposal-9.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;That way I can see actual fonts, font sizes and layout to confirm how the document should have looked. And that&#39;s where it became obvious that the original document on the original Mac and the CERN PDF are quite different. The CERN PDF has 20 pages. On the Mac running Word for Macintosh 4.0 with A4 paper it has 22 pages. So I decided to aim to get us close to the original document on the Mac.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjM3_thqxV_ZB-VqLJRytn7oA8LbAMlQ2a3kRZrubYhWt4M8ns2R-3nHFXFG-367BDUJQkHtLO6oqFNrZWGXhwlQfarVp_ih1SDBgBWsWGBKqKmZUYD51WLmLIGCQ1no0EcAPeTidkHBb52Y-EY7AXYnBX9nll33G7FuZofLN9XgpD0bWak-T1ONQ/s1389/proposal-10.png&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1062&quot; data-original-width=&quot;1389&quot; height=&quot;490&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjM3_thqxV_ZB-VqLJRytn7oA8LbAMlQ2a3kRZrubYhWt4M8ns2R-3nHFXFG-367BDUJQkHtLO6oqFNrZWGXhwlQfarVp_ih1SDBgBWsWGBKqKmZUYD51WLmLIGCQ1no0EcAPeTidkHBb52Y-EY7AXYnBX9nll33G7FuZofLN9XgpD0bWak-T1ONQ/w640-h490/proposal-10.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;div&gt;&lt;span style=&quot;color: #302005;&quot;&gt;So... set to A4 paper and set right margin to same size as left margin. Change the first page format to be different since it doesn&#39;t have the same gutters, footers or headers.&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #302005;&quot;&gt;Manually change the body text from 14 pt (and other sizes) to 12 pt. Manually deal with text that breaks across pages incorrectly and other alignment problems. Fix the footer that should be a header.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #302005;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #302005;&quot;&gt;In the end I got pretty close to what&#39;s visible on the Mac.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #302005;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOA-gPDF3aSCcLgZumx8lW7yXDF34EKE6VIUUcyp7etjaA66vInZOvD7Dxa3DPBGQmKbKlTQQxThHv48XrTdcTWaaLYEacOYAvk2J0qLfEPLOeUWiii286namyfei9NHd2F3pokvQoOEFrRhxWnHi254ONzTxfgFhKMBr6mFcXOcSu7U2DgkIMWQ/s2408/proposal-11.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1040&quot; data-original-width=&quot;2408&quot; height=&quot;276&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOA-gPDF3aSCcLgZumx8lW7yXDF34EKE6VIUUcyp7etjaA66vInZOvD7Dxa3DPBGQmKbKlTQQxThHv48XrTdcTWaaLYEacOYAvk2J0qLfEPLOeUWiii286namyfei9NHd2F3pokvQoOEFrRhxWnHi254ONzTxfgFhKMBr6mFcXOcSu7U2DgkIMWQ/w640-h276/proposal-11.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;h2&gt;Conclusion&lt;/h2&gt;&lt;/div&gt;&lt;div&gt;Converting this document from its original format was a bit of a victory for open source software. And a lesson in how hard document preservation is. To help preserve it a bit, and in an open format, I&#39;ve uploaded my .odt version to GitHub &lt;a href=&quot;https://github.com/jgrahamc/www-proposal&quot;&gt;here&lt;/a&gt;. It&#39;s interesting, and a little disheartening to see that this 34 year old document is difficult to open, and even when opened the resulting output isn&#39;t exactly the same as the original.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;PS If you&#39;re wondering why I ever started this project. I just wanted a high quality version of the diagrams in the original proposal for a presentation. Took me a lot longer than I thought it would.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;PPS A &lt;a href=&quot;https://news.ycombinator.com/item?id=39358074&quot;&gt;comment&lt;/a&gt; on Hacker News pointed out that I could probably either create a PostScript file or a PDF via an emulated Mac. I was able to boot another Mac (System 7) that had Word from 1992 and Print2PDF (a driver that creates a printer that makes a PDF file) and print directly from Word for Macintosh 5.1a.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgx49b2BxnfgvZQp6amCJ3JWT_B0Fcgyv-hz6O4rG0vxhImvBWk_3WvYJhFcv6rwE45ySKg1GBJchujq4AJE2s8emtZm8B1YuwmXtEeCAE6m4wRhjQxnCrHRZ1XRTJK4CwjZJy9xsYQIH2ZFHEpRUzrMynlP2QddrGZl6ol5YJIRWA-xjRHY97jow/s1969/proposal-12.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1573&quot; data-original-width=&quot;1969&quot; height=&quot;512&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgx49b2BxnfgvZQp6amCJ3JWT_B0Fcgyv-hz6O4rG0vxhImvBWk_3WvYJhFcv6rwE45ySKg1GBJchujq4AJE2s8emtZm8B1YuwmXtEeCAE6m4wRhjQxnCrHRZ1XRTJK4CwjZJy9xsYQIH2ZFHEpRUzrMynlP2QddrGZl6ol5YJIRWA-xjRHY97jow/w640-h512/proposal-12.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;I&#39;ve added the generated PDF file to the GitHub. This version has 20 pages and the fonts are different but it does meet my original requirement of a PDF.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;PPPS A Hacker News &lt;a href=&quot;https://news.ycombinator.com/item?id=39363611&quot;&gt;comment&lt;/a&gt; links to another conversion done using different versions of Word and bit of fiddling around to get a really nice version of the document in modern formats.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jgc.org/feeds/1960659042426703991/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/19303585/1960659042426703991' title='18 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19303585/posts/default/1960659042426703991'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19303585/posts/default/1960659042426703991'/><link rel='alternate' type='text/html' href='http://blog.jgc.org/2024/02/the-original-www-proposal-is-word-for.html' title='The original WWW proposal is a Word for Macintosh 4.0 file from 1990, can we open it?'/><author><name>Unknown</name><email>[email protected]</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivCGzwNqeNyN4mZPNF593LeO14xECSZPabgJK43_trMY-NNlDrGrUYeGPAQ11lVk4vmh8o9U05sPW7xIYx1vDLIGDQWHFo9x6gEwqkvA3JzPkmLhyVS8HGHSCRXqH-yQXFo3Q9qxsje_rF5Vuzzm1YfxlIU2mlCXEvjDJ1ebeSl8G6gDD9zJ7iRA/s72-w640-h246-c/proposal-1.png" height="72" width="72"/><thr:total>18</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19303585.post-2834485746776529070</id><published>2024-02-04T20:52:00.005+00:00</published><updated>2024-02-04T22:41:36.150+00:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="hardware"/><category scheme="http://www.blogger.com/atom/ns#" term="pseudo-randomness"/><title type='text'>Repairing (sort of) a Dyson fan remote control</title><content type='html'>&lt;p&gt;I have a couple of fancy Dyson fans that do cooling (or at least blowing air around) and heating. They use a little IR remote control that attaches to the top with magnets. One of the remotes decided to stop working; its failure mode was: consume an entire CR2032 battery in a few days. Apparently, &lt;a href=&quot;https://www.reddit.com/r/dyson/comments/f5rt1m/dyson_am09_remote_control_battery_needs_replacing/&quot;&gt;I&#39;m not alone&lt;/a&gt; in experiencing this problem.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJwRJuZfFNpzHSiOsaj1oEyeiKLlTMBb3No8S26vg7rgvVlER-6mdNJE_e8_GWZmsQyA-xohZphLvFttRmdjbYbBJoOv0gnXdT2Kj98pza7ayVkyh5kFp_quzbjcx0vJmTk3aQ0o0h_r5bY8C6IsQq5YOeaHwx-z6pKWJZL-uIDDmwwEZJgTaV8g/s496/dyson-8.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;355&quot; data-original-width=&quot;496&quot; height=&quot;286&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJwRJuZfFNpzHSiOsaj1oEyeiKLlTMBb3No8S26vg7rgvVlER-6mdNJE_e8_GWZmsQyA-xohZphLvFttRmdjbYbBJoOv0gnXdT2Kj98pza7ayVkyh5kFp_quzbjcx0vJmTk3aQ0o0h_r5bY8C6IsQq5YOeaHwx-z6pKWJZL-uIDDmwwEZJgTaV8g/w400-h286/dyson-8.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;Before seeing if I could repair it, I made a backup of the IR codes from the remote using my Flipper Zero:&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgOMLvNXN1CihUrjCQGB7q9M5h9TaKQbjZapuTyFHh6ad4OwYW4a48HQ722IoDnhVmGWvv1mMqRHXD77wGiEH1ysgTzR8aQISRMI3-R2ewjj7MNqdS7prkG552uMVOpsM5H6ieLoPnR9m61AnEuhpB-CbOVsSYuGoT7lYlzDsGPg30ZoNQhP_RaQ/s750/dyson-7.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;350&quot; data-original-width=&quot;750&quot; height=&quot;186&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgOMLvNXN1CihUrjCQGB7q9M5h9TaKQbjZapuTyFHh6ad4OwYW4a48HQ722IoDnhVmGWvv1mMqRHXD77wGiEH1ysgTzR8aQISRMI3-R2ewjj7MNqdS7prkG552uMVOpsM5H6ieLoPnR9m61AnEuhpB-CbOVsSYuGoT7lYlzDsGPg30ZoNQhP_RaQ/w400-h186/dyson-7.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;Dyson were good enough to replace the remote but I began to wonder why this was happening and so I opened it. Here&#39;s the little circuit board inside. The pads are the underside of the buttons.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh92uQYxF5oL0ncvi2wKle1f9DpkWeVp9pn507Nzcjhr4g669-VZx25DWj9H8Z6yCW4B7KZmGG37msYSr-lX_z6HHHFzhULOPF0h0ydeJn_RPKbPtID3GPcD9oOhTecJklgQCfH88roqd5yNYiKLpZt-Yfc3fVJPk-F34D8h2488OFjlgD24bPJVw/s3463/dyson-1.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;3463&quot; data-original-width=&quot;1561&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh92uQYxF5oL0ncvi2wKle1f9DpkWeVp9pn507Nzcjhr4g669-VZx25DWj9H8Z6yCW4B7KZmGG37msYSr-lX_z6HHHFzhULOPF0h0ydeJn_RPKbPtID3GPcD9oOhTecJklgQCfH88roqd5yNYiKLpZt-Yfc3fVJPk-F34D8h2488OFjlgD24bPJVw/w288-h640/dyson-1.jpg&quot; width=&quot;288&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEju16NBKQgWeraenUz0Tm4RnoNHLcW67OANzCRdl4C_cOdcZq8WHn0iu0H8fa96GnNjnBMTiJWefRq1VW020LDli1UUuLuIs4JL7ZgLP-3i5MvT9xIrlvlzYQgZ5X66CxjxFSMcO1QL0lD3Z5rw3tJa20KsRR2pXTenvnRcw0Ec1LpU2nW31IbT1Q/s3161/dyson-2.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;3161&quot; data-original-width=&quot;1266&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEju16NBKQgWeraenUz0Tm4RnoNHLcW67OANzCRdl4C_cOdcZq8WHn0iu0H8fa96GnNjnBMTiJWefRq1VW020LDli1UUuLuIs4JL7ZgLP-3i5MvT9xIrlvlzYQgZ5X66CxjxFSMcO1QL0lD3Z5rw3tJa20KsRR2pXTenvnRcw0Ec1LpU2nW31IbT1Q/w256-h640/dyson-2.jpg&quot; width=&quot;256&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;Using a multimeter I discovered that the resistance across the battery terminals was 2.5kΩ when I was expecting it to be very, very high or even infinite.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmXInq3B_Bdg9aoUOymUFK1uQl_jXXztK4-6-Xfe774nkNJNxWifQdw2UnSFS5tGxZ7VxWDg3ocMhw2DuFndPfkMykaf-fP29ibzd5R_gnGb_GJMq8eimYwwUgWl_Ebu-b6GPzmQai4ryOCqGn6FcJryUR97xblrZ_5F0yInG_RfK7gDgWT_a2YA/s1738/dyson-3.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1641&quot; data-original-width=&quot;1738&quot; height=&quot;378&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmXInq3B_Bdg9aoUOymUFK1uQl_jXXztK4-6-Xfe774nkNJNxWifQdw2UnSFS5tGxZ7VxWDg3ocMhw2DuFndPfkMykaf-fP29ibzd5R_gnGb_GJMq8eimYwwUgWl_Ebu-b6GPzmQai4ryOCqGn6FcJryUR97xblrZ_5F0yInG_RfK7gDgWT_a2YA/w400-h378/dyson-3.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;And that the remote control was drawing 1.1mA when doing nothing.&amp;nbsp;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDevJLZYjCVQ2xHp764sFp4A1mWpsTgryeH-mXsTu1PV-i00a9xmdl2Tyr5n89tibrYpVJW6s7EyaWkSUHhyphenhyphenDVOFFvo33vdgk0VIQhuJ3aG2MyJv0pt1kONR23C4FchUT5eKBGJMJ9C4AaiM0hCVBp0eaCD1-Ee_Oi0rZVSFqlkTcBoTyAKW5HIg/s1375/dyson-4.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1065&quot; data-original-width=&quot;1375&quot; height=&quot;310&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDevJLZYjCVQ2xHp764sFp4A1mWpsTgryeH-mXsTu1PV-i00a9xmdl2Tyr5n89tibrYpVJW6s7EyaWkSUHhyphenhyphenDVOFFvo33vdgk0VIQhuJ3aG2MyJv0pt1kONR23C4FchUT5eKBGJMJ9C4AaiM0hCVBp0eaCD1-Ee_Oi0rZVSFqlkTcBoTyAKW5HIg/w400-h310/dyson-4.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;A quick check of Ohm&#39;s law gives I = V/R, I = 3V/2500Ω, I = 1.2mA. Close enough.&amp;nbsp;&lt;/p&gt;&lt;p&gt;The capacity of a CR2032 battery varies a lot from manufacturer to manufacturer but seems to be between 150mAh and 250mAh (roughly). At 1.2mA constant current that&#39;s between 125h and 208h to drain the battery (about 5 to 7 days).&amp;nbsp;&lt;/p&gt;&lt;p&gt;But why was there 2.5kΩ across the battery? The culprit is the capacitor C1 which is in parallel with the CR2032. It&#39;s decided that it would prefer to be a resistor! Sometimes capacitors fail like this.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBF9m6Ss1Ai5TWar2eHt1gIf_XzQwFiVAYHQ8qv4Y9xqwa57A2qX1pQu9sx8XJDSL2JVjVI2qtIgxilfAdMY3E_olJOxhx-suFtMVkCumsPlDdOrseh33P1toyU8cekxfj5CmZwVrFNHcHjuOPvAbcmK7pOQsDh2UWmmI5sJIiw5Nj-mYrJYFOhg/s2156/dyson-5.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1631&quot; data-original-width=&quot;2156&quot; height=&quot;303&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBF9m6Ss1Ai5TWar2eHt1gIf_XzQwFiVAYHQ8qv4Y9xqwa57A2qX1pQu9sx8XJDSL2JVjVI2qtIgxilfAdMY3E_olJOxhx-suFtMVkCumsPlDdOrseh33P1toyU8cekxfj5CmZwVrFNHcHjuOPvAbcmK7pOQsDh2UWmmI5sJIiw5Nj-mYrJYFOhg/w400-h303/dyson-5.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;Aside: why is there a capacitor in parallel with the battery? Almost certainly because it&#39;s the capacitor that powers the remote when a button is pressed. Most of the time no button is pressed and the capacitor will sit charged fully. When a button is pressed a load is applied to the battery/capacitor combination and it&#39;s the capacitor which will provide the needed current. This will likely prolong the life of the battery as it will slowly charge a capacitor and not have to provide a sudden larger current when a button is pressed.&lt;/p&gt;&lt;p&gt;I didn&#39;t have a spare surface mount capacitor around so I simply removed C1. With C1 removed there&#39;s no current drain when idle and the remote works fine. Unfortunately, Dyson didn&#39;t design the remote to be opened and so the case didn&#39;t survive. Also, I&#39;m sure I&#39;ve shortened the life of the CR2032 battery by removing C1, but at least it&#39;ll last longer than a week!&lt;/p&gt;&lt;p&gt;I fixed the remote up so I could use it by printing a picture of what it should look like and taping the paper into place. You may also notice the small felt pad. That&#39;s there to &lt;strike&gt;make it pleasant to hold&lt;/strike&gt;&amp;nbsp;prevent you from being stabbed by the mechanism that connects to the +ve terminal of the battery.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiPD5Pc0lNO5k1leWW9TskgjjvhxQLRm1CofXGZLi6V6LXCwp12uhxHKcmMhk44jZ-jrsqdE0wIs-nkUm5cD1F_kiPYjmhkKACJh-3Slmf154b57HVrNwb9sl4YxZv6T612YjL-jODfgy45SILV7MF4VP65xSGo3frwvnWrmU37QP2QQBFhy4SjxQ/s3078/dyson-9.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;3078&quot; data-original-width=&quot;1255&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiPD5Pc0lNO5k1leWW9TskgjjvhxQLRm1CofXGZLi6V6LXCwp12uhxHKcmMhk44jZ-jrsqdE0wIs-nkUm5cD1F_kiPYjmhkKACJh-3Slmf154b57HVrNwb9sl4YxZv6T612YjL-jODfgy45SILV7MF4VP65xSGo3frwvnWrmU37QP2QQBFhy4SjxQ/w261-h640/dyson-9.jpg&quot; width=&quot;261&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;As good as new! Or at least it works and I can keep using the fan until the replacement Dyson is sending arrives.&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jgc.org/feeds/2834485746776529070/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/19303585/2834485746776529070' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19303585/posts/default/2834485746776529070'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19303585/posts/default/2834485746776529070'/><link rel='alternate' type='text/html' href='http://blog.jgc.org/2024/02/repairing-sort-of-dyson-fan-remote.html' title='Repairing (sort of) a Dyson fan remote control'/><author><name>Unknown</name><email>[email protected]</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJwRJuZfFNpzHSiOsaj1oEyeiKLlTMBb3No8S26vg7rgvVlER-6mdNJE_e8_GWZmsQyA-xohZphLvFttRmdjbYbBJoOv0gnXdT2Kj98pza7ayVkyh5kFp_quzbjcx0vJmTk3aQ0o0h_r5bY8C6IsQq5YOeaHwx-z6pKWJZL-uIDDmwwEZJgTaV8g/s72-w400-h286-c/dyson-8.jpg" height="72" width="72"/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19303585.post-2628625242840790888</id><published>2024-01-17T12:19:00.004+00:00</published><updated>2024-01-18T12:59:23.311+00:00</updated><title type='text'>My daily driver is older than I thought; it&#39;s positively vintage!</title><content type='html'>&lt;p&gt;I was doing some clean up on my main laptop and realized it had been a while since bought a new computer. Turns out it was a lot older than I thought:&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvzO4ipKTzs-wGERqTADkb60TVjR1Lk1TQVSNkeik6A0tfdToCWa5cdDlyM6B4_4YfG76iJQyuFQsY8_zD8P9wH6sZc3fcFsNeiWuQ4mlIVc4dA8vYn71DWI_n-Xl8hRl6Nwg_Y5NQs8_JVfcadvmPx3Rshtkz0x5YnHDn-apiuP_CAAtqQbDriQ/s1338/mac-1.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1338&quot; data-original-width=&quot;784&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvzO4ipKTzs-wGERqTADkb60TVjR1Lk1TQVSNkeik6A0tfdToCWa5cdDlyM6B4_4YfG76iJQyuFQsY8_zD8P9wH6sZc3fcFsNeiWuQ4mlIVc4dA8vYn71DWI_n-Xl8hRl6Nwg_Y5NQs8_JVfcadvmPx3Rshtkz0x5YnHDn-apiuP_CAAtqQbDriQ/w375-h640/mac-1.jpg&quot; width=&quot;375&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;Apple considers this machine to be &lt;a href=&quot;https://support.apple.com/en-us/HT201624&quot;&gt;vintage&lt;/a&gt;&amp;nbsp;but I don&#39;t have any compelling reason to upgrade it. Apple still supports it in macOS (although I can&#39;t upgrade beyond macOS Ventura), all the hardware works, and I haven&#39;t run out of disk space (although I did have to offload all the the work on &lt;a href=&quot;https://behind-the-screens.tv/&quot;&gt;Behind The Screens&lt;/a&gt; to an external drive because of their size).&lt;/div&gt;&lt;p&gt;But there is one thing I hate about it: the bloody Touch Bar and its phony ESC key. I thought I&#39;d get used to the Touch Bar but it turns out I didn&#39;t.&amp;nbsp;&lt;/p&gt;&lt;p&gt;This is the longest I&#39;ve ever owned a laptop without upgrading and I think that comes down to a few things. Firstly, I spend most of my time on this machine either in a web browser, or using a terminal to SSH to somewhere else. Secondly, the most powerful program I tend to use on it is Final Cut Pro but my videos tend to me short and not particularly complicated to output.&lt;/p&gt;&lt;p&gt;So, a combination of Apple&#39;s hardware and software holding up and a lot of my computing needs being offloaded to the cloud means this old machine is banging along nicely.&lt;/p&gt;&lt;p&gt;PS If you&#39;re interested in a really vintage machine, &lt;a href=&quot;https://blog.jgc.org/2023/12/restoration-of-ibm-thinkpad-701c.html&quot;&gt;read about my complete restoration of an IBM ThinkPad 701c&lt;/a&gt; (the one with the butterfly keyboard).&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0w9j6ps4wMjnvsJkGCtrjkn1E98IL3px8ijlwGW2fEq7wzhgVi0DQH-8JinjPBbCOb4ycfi66mp8irN3wU8FOl2KAW1cKmh5m9jQ_aqtPBk_LGitLZr991Pp-K2FsPjrn97dWMZWY1AoIkSTe2J4AhUz64pekzCzX2ECXoVNP3SZ8Jp6HTnCLHQ/s639/701c-40.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;524&quot; data-original-width=&quot;639&quot; height=&quot;524&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0w9j6ps4wMjnvsJkGCtrjkn1E98IL3px8ijlwGW2fEq7wzhgVi0DQH-8JinjPBbCOb4ycfi66mp8irN3wU8FOl2KAW1cKmh5m9jQ_aqtPBk_LGitLZr991Pp-K2FsPjrn97dWMZWY1AoIkSTe2J4AhUz64pekzCzX2ECXoVNP3SZ8Jp6HTnCLHQ/w640-h524/701c-40.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jgc.org/feeds/2628625242840790888/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/19303585/2628625242840790888' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19303585/posts/default/2628625242840790888'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19303585/posts/default/2628625242840790888'/><link rel='alternate' type='text/html' href='http://blog.jgc.org/2024/01/my-daily-driver-is-older-than-i-thought.html' title='My daily driver is older than I thought; it&#39;s positively vintage!'/><author><name>Unknown</name><email>[email protected]</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvzO4ipKTzs-wGERqTADkb60TVjR1Lk1TQVSNkeik6A0tfdToCWa5cdDlyM6B4_4YfG76iJQyuFQsY8_zD8P9wH6sZc3fcFsNeiWuQ4mlIVc4dA8vYn71DWI_n-Xl8hRl6Nwg_Y5NQs8_JVfcadvmPx3Rshtkz0x5YnHDn-apiuP_CAAtqQbDriQ/s72-w375-h640-c/mac-1.jpg" height="72" width="72"/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19303585.post-8778475752762716090</id><published>2023-12-27T15:43:00.007+00:00</published><updated>2024-01-24T15:42:07.935+00:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="pseudo-randomness"/><title type='text'>Compression of the lyrics of the &quot;12 Days Of Christmas&quot;</title><content type='html'>&lt;p&gt;Eleven years ago I blogged about a solution to the &quot;Never Gonna Give You Up&quot; compression code golf challenge: what&#39;s the smallest program that output the lyrics of Rick Astley&#39;s phenomenon? My solution was 589 bytes of Perl that looked like this:&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;$b=&amp;lt;&amp;lt;E;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp;gÐngÑveÒe &amp;gt;ÓthÔouÕo Önd× yÕØÖloÙiÑ Út&#39;s Û(OohÜe&#39;reÝ&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;YÕÞ knowß,ÐivàÚoá I&#39;m â tÖsãtell ä a× åØ æeåçay it&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;è äértØêß ëÐonna ì oÔer íæupîmakeæïÛbeen ðëÔÓñÕ&#39;rÓtoÖòeî)&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;óeÒrìô&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;We&#39;Òßõ&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;NôöóÜ÷ôgiÒø howâfeeliÑ&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;ù&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;Nøú÷)ú, nø&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;(Givû&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;I just wannaéyÕùGotta ïu×ersta×&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;þü eachífor sÙÑÞr hearðachÚbut&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;YòshyãèInsidÓwÓboÔëwhaðgoán&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;WeñgamçwÝìplèýúîöletædownörun arÕ×ådeseêöïcryösayÐoodbyeöäa liçhuê&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;þWÝ nÖstraÑers tÙÒÞñrulesåsÖdÖI&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;A full commitmenÛwhatâÔinkáfÞ wÕldn&#39;tÐet Ôis from anyíguyüõnýA×&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;ifæask meùDon&#39;témÓyòbli×ãee&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;þþ&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;Üà÷àûûóõýüþþ&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;E&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;map{($a,$b)=split($c=chr,$b,2);$b=~s/$c/$a/g}(208..254);print$b&lt;/span&gt;&lt;/p&gt;&lt;p&gt;The &lt;span style=&quot;font-family: courier;&quot;&gt;$b &lt;/span&gt;variable contains a dictionary where the index is made up of ASCII characters above 128 and the single line of Perl code at the end substitutes the dictionary entries until the full lyrics are output.&lt;/p&gt;&lt;p&gt;I wondered about using the same technique on the &quot;12 Days Of Christmas&quot; as there&#39;s a lot of repetition but the song is longer. &quot;Never Gonna Give You Up&quot; is 1,872 bytes and &quot;12 Days Of Christmas&quot; is 2,386. Using the same technique results in this 479 byte Perl program that outputs in the &quot;12 Days Of Christmas&quot;:&lt;/p&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;$b=&amp;lt;&amp;lt;Z;&lt;br /&gt;enÙ tÚ&lt;br /&gt;TÛs,Üe ÝingÞÙ ßvÝgà druás a-âÞ,ãdâäevßåpãæmmãçOnÚhÝè.&lt;br /&gt;èééfêéeëétìésí&lt;br /&gt;NinÝladies dancãþî partridgÝin a pearÚreeïßloräleaæîð day of ChristmaÜ&lt;br /&gt;myÚruÝloàavÝto meñdñòthñónóôóÛõeveôöÛwoÚurtlÝdoveÜ&lt;br /&gt;And aï÷&lt;br /&gt;Elåpipers piæÛðøÛhreÝFrÙch hÙÜ÷ù&lt;br /&gt;Four callÞ birdÜùú&lt;br /&gt;FiàoldßrÞÜúû&lt;br /&gt;Six geesÝa-layãûü&lt;br /&gt;Såswanâswiçüý&lt;br /&gt;Eight maiämilkãýþèfirstñ&lt;br /&gt;Aïíeconò÷ìhiròùêouróúêifóûíixóüíöýëighóþéniôîìÙõðëlöøìwelfõwelveámmersáçø!&lt;br /&gt;Z&lt;br /&gt;map{($a,$b)=split($c=chr,$b,2);$b=~s/$c/$a/g}(217..254);print$b&lt;/span&gt;&lt;/div&gt;&lt;pre class=&quot;prettyprint&quot; style=&quot;line-height: 10pt;&quot;&gt;&lt;pre class=&quot;prettyprint&quot; style=&quot;line-height: 10pt;&quot;&gt;&lt;pre class=&quot;prettyprint&quot; style=&quot;line-height: 10pt;&quot;&gt;&lt;pre class=&quot;prettyprint&quot; style=&quot;line-height: 10pt;&quot;&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;/pre&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jgc.org/feeds/8778475752762716090/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/19303585/8778475752762716090' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19303585/posts/default/8778475752762716090'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19303585/posts/default/8778475752762716090'/><link rel='alternate' type='text/html' href='http://blog.jgc.org/2023/12/compression-of-lyrics-of-12-days-of.html' title='Compression of the lyrics of the &quot;12 Days Of Christmas&quot;'/><author><name>Unknown</name><email>[email protected]</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry></feed>
Raw headers
{
  "age": "0",
  "cache-control": "public, must-revalidate, proxy-revalidate, max-age=1",
  "cf-cache-status": "DYNAMIC",
  "cf-ray": "929b4a9966f7f32d-ORD",
  "connection": "keep-alive",
  "content-type": "application/atom+xml; charset=UTF-8",
  "cross-origin-resource-policy": "cross-origin",
  "date": "Tue, 01 Apr 2025 21:48:34 GMT",
  "etag": "W/\"5b1c21bc9632d6bc4e72f26c4c3fb73fc3adf3db633e816bfa72ea306d4b3c4b\"",
  "expires": "Tue, 01 Apr 2025 21:48:35 GMT",
  "last-modified": "Tue, 01 Apr 2025 07:48:22 GMT",
  "server": "cloudflare",
  "speculation-rules": "\"/cdn-cgi/speculation\"",
  "transfer-encoding": "chunked",
  "vary": "Accept-Encoding",
  "x-content-type-options": "nosniff",
  "x-frame-options": "SAMEORIGIN",
  "x-xss-protection": "0"
}
Parsed with @rowanmanning/feed-parser
{
  "meta": {
    "type": "atom",
    "version": "1.0"
  },
  "language": null,
  "title": "John Graham-Cumming's blog",
  "description": null,
  "copyright": null,
  "url": "http://blog.jgc.org/",
  "self": "http://www.blogger.com/feeds/19303585/posts/default",
  "published": null,
  "updated": "2025-04-01T07:48:22.029Z",
  "generator": {
    "label": "Blogger",
    "version": "7.00",
    "url": "http://www.blogger.com"
  },
  "image": null,
  "authors": [
    {
      "name": "Unknown",
      "email": "[email protected]",
      "url": null
    }
  ],
  "categories": [
    {
      "label": "pseudo-randomness",
      "term": "pseudo-randomness",
      "url": null
    },
    {
      "label": "hardware",
      "term": "hardware",
      "url": null
    },
    {
      "label": "babbage",
      "term": "babbage",
      "url": null
    },
    {
      "label": "gaga",
      "term": "gaga",
      "url": null
    },
    {
      "label": "anti-spam",
      "term": "anti-spam",
      "url": null
    },
    {
      "label": "gnu make",
      "term": "gnu make",
      "url": null
    },
    {
      "label": "retro",
      "term": "retro",
      "url": null
    },
    {
      "label": "security",
      "term": "security",
      "url": null
    },
    {
      "label": "codes and ciphers",
      "term": "codes and ciphers",
      "url": null
    },
    {
      "label": "the geek atlas",
      "term": "the geek atlas",
      "url": null
    },
    {
      "label": "rants and raves",
      "term": "rants and raves",
      "url": null
    },
    {
      "label": "alan turing",
      "term": "alan turing",
      "url": null
    },
    {
      "label": "hits",
      "term": "hits",
      "url": null
    },
    {
      "label": "mathematics",
      "term": "mathematics",
      "url": null
    },
    {
      "label": "climate change",
      "term": "climate change",
      "url": null
    },
    {
      "label": "perl",
      "term": "perl",
      "url": null
    },
    {
      "label": "calculators",
      "term": "calculators",
      "url": null
    },
    {
      "label": "google go",
      "term": "google go",
      "url": null
    },
    {
      "label": "minitel",
      "term": "minitel",
      "url": null
    },
    {
      "label": "toys",
      "term": "toys",
      "url": null
    },
    {
      "label": "behind the screens",
      "term": "behind the screens",
      "url": null
    },
    {
      "label": "clocks",
      "term": "clocks",
      "url": null
    },
    {
      "label": "machine learning",
      "term": "machine learning",
      "url": null
    },
    {
      "label": "babygaga",
      "term": "babygaga",
      "url": null
    },
    {
      "label": "games",
      "term": "games",
      "url": null
    },
    {
      "label": "arc",
      "term": "arc",
      "url": null
    },
    {
      "label": "my services",
      "term": "my services",
      "url": null
    },
    {
      "label": "popfile",
      "term": "popfile",
      "url": null
    },
    {
      "label": "cansole",
      "term": "cansole",
      "url": null
    },
    {
      "label": "facebook",
      "term": "facebook",
      "url": null
    },
    {
      "label": "privacy",
      "term": "privacy",
      "url": null
    },
    {
      "label": "radio",
      "term": "radio",
      "url": null
    },
    {
      "label": "well... actually",
      "term": "well... actually",
      "url": null
    }
  ],
  "items": [
    {
      "id": "tag:blogger.com,1999:blog-19303585.post-6045805352103665596",
      "title": "Debugging Lotus 1-2-3 by fax",
      "description": null,
      "url": "http://blog.jgc.org/2025/03/debugging-lotus-1-2-3-by-fax.html",
      "published": "2025-03-31T15:22:00.008Z",
      "updated": "2025-03-31T15:30:58.521Z",
      "content": "<p>There isn't a lot to this story beyond the fact that in around 1990 I helped debug someone's <a href=\"https://en.wikipedia.org/wiki/Lotus_1-2-3\">Lotus 1-2-3</a> set up via fax. But it's a good reminder of how important the Zeroth Law of Debugging is (see below).</p><p>Without some sort of online connection with these folks, and with transatlantic phone calls being very, very expensive (I was in the UK, they were in the US) fax was the obvious answer.</p><p>I was reminded of this when I came across the actual fax itself:</p><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvBJFVo9lHXKYXrDQLzGXbikkdfnrYIrLIVEfKAtf8xXit4aysAwKI4eGJE7DDtpGox5v5nGtimyBlgEsV2TfFhoJZjOzrMvKn_Y9zWvlnd90WmDJNvY_PhjY-e88ULkTz3anDxMYBTVvcZy6_-WWvwGiNGkfcpE0zZM6ycrTXGZO9d-Qun1QZXg/s1933/123fax-1.jpeg\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"1933\" data-original-width=\"1394\" height=\"640\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvBJFVo9lHXKYXrDQLzGXbikkdfnrYIrLIVEfKAtf8xXit4aysAwKI4eGJE7DDtpGox5v5nGtimyBlgEsV2TfFhoJZjOzrMvKn_Y9zWvlnd90WmDJNvY_PhjY-e88ULkTz3anDxMYBTVvcZy6_-WWvwGiNGkfcpE0zZM6ycrTXGZO9d-Qun1QZXg/w462-h640/123fax-1.jpeg\" width=\"462\" /></a></div><div class=\"separator\" style=\"clear: both; text-align: center;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: left;\">What I asked them to do was give me the output of <span style=\"font-family: courier;\">/ppomr</span>. Hitting <span style=\"font-family: courier;\">/</span> in 1-2-3 started the menu system and each letter took you down a submenu until you hit an actual menu item. <span style=\"font-family: courier;\">/ppomr</span> is <span style=\"font-family: courier;\">/Print Printer Options Margins Right</span> (read all about it in the <a href=\"https://ia801706.us.archive.org/25/items/lotus-1-2-3-release-3.1-reference/Lotus%201-2-3%20Release%203.1%20-%20Quick%20Reference.pdf\">Quick Reference</a>) and so I was asking for the size of the right margin when printing. </div><div class=\"separator\" style=\"clear: both; text-align: left;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvnfG-rD2_B8Ex1WeGI8rIDmfdkcmWsQXkFB5lW_NdEmgBOImDbwS68iXE2jpDvmEVEq_zfBI3r5HrsWez-n5V_5JL6PFHaKh2kV8S2GW-D92kkp7a1lVlI3vjsThAs_RnkR0XvosVtmqLpDrF-HZGN8hb2qbp5HdE6oNYjlJAbW1zOGOiqMYJ0Q/s1304/123fax-4.png\" imageanchor=\"1\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"1304\" data-original-width=\"1118\" height=\"640\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvnfG-rD2_B8Ex1WeGI8rIDmfdkcmWsQXkFB5lW_NdEmgBOImDbwS68iXE2jpDvmEVEq_zfBI3r5HrsWez-n5V_5JL6PFHaKh2kV8S2GW-D92kkp7a1lVlI3vjsThAs_RnkR0XvosVtmqLpDrF-HZGN8hb2qbp5HdE6oNYjlJAbW1zOGOiqMYJ0Q/w549-h640/123fax-4.png\" width=\"549\" /></a></div><br /><div class=\"separator\" style=\"clear: both; text-align: left;\">Here's what that looks like in action:</div><div class=\"separator\" style=\"clear: both; text-align: left;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyFlohy9zaZQG4F1lVbE5zwbI-atvbCsblhWuExUIGrz-5M8mXowl5pVX-1Z3PvLtk4RRSy4SSIezsdMAxapZNC-haHtW1IATs6KQbUR1xDS6FkD8qGgqonN4u9jWsta6RUFQtrzTB5h1I7AZE0zNNp3As3bKBG3jXqZWwWdU8vzrovjoWAaodww/s4096/123fx-2.gif\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"2304\" data-original-width=\"4096\" height=\"360\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyFlohy9zaZQG4F1lVbE5zwbI-atvbCsblhWuExUIGrz-5M8mXowl5pVX-1Z3PvLtk4RRSy4SSIezsdMAxapZNC-haHtW1IATs6KQbUR1xDS6FkD8qGgqonN4u9jWsta6RUFQtrzTB5h1I7AZE0zNNp3As3bKBG3jXqZWwWdU8vzrovjoWAaodww/w640-h360/123fx-2.gif\" width=\"640\" /></a></div><div><br /></div>And then I instructed the person on the other end to alter the left margin with <span style=\"font-family: courier;\">/ppoml</span> (<span style=\"font-family: courier;\">/Print Printer Options Margins Left</span>). I also told them if they wanted a change to the page headers I'd need to \"send them a disc\" (i.e. mail a floppy disc to the US!)<div><br /></div><div><div class=\"separator\" style=\"clear: both; text-align: left;\">If you are going to debug anything you need to tighten the loop between trying something and observing the output of your change. This should be the Zeroth Law of Debugging: get the smallest/fastest test case so you can iterate.</div><div class=\"separator\" style=\"clear: both; text-align: left;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: left;\">Worst case send faxes across the Atlantic. </div><div class=\"separator\" style=\"clear: both; text-align: left;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgHKaAHsFiYNnAH36kFKQdWGdtiPd6-AulKES6UwkiyVVWEZ-fqAZu_53HVlie0Ftz-pFokP24OLBf1792PRTvZAZmJeIYd7_TSTfP9DvSeikXQJzXBj5rXgoRoSv8P3dUXzg4HE9WdbWLwTwB_FdWZB67ddTLVZFaoD0So7K1k7z-JDAJoVfJpA/s529/123fax-3.jpeg\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"472\" data-original-width=\"529\" height=\"358\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgHKaAHsFiYNnAH36kFKQdWGdtiPd6-AulKES6UwkiyVVWEZ-fqAZu_53HVlie0Ftz-pFokP24OLBf1792PRTvZAZmJeIYd7_TSTfP9DvSeikXQJzXBj5rXgoRoSv8P3dUXzg4HE9WdbWLwTwB_FdWZB67ddTLVZFaoD0So7K1k7z-JDAJoVfJpA/w400-h358/123fax-3.jpeg\" width=\"400\" /></a></div></div>",
      "image": {
        "url": "https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvBJFVo9lHXKYXrDQLzGXbikkdfnrYIrLIVEfKAtf8xXit4aysAwKI4eGJE7DDtpGox5v5nGtimyBlgEsV2TfFhoJZjOzrMvKn_Y9zWvlnd90WmDJNvY_PhjY-e88ULkTz3anDxMYBTVvcZy6_-WWvwGiNGkfcpE0zZM6ycrTXGZO9d-Qun1QZXg/s72-w462-h640-c/123fax-1.jpeg",
        "title": null
      },
      "media": [],
      "authors": [
        {
          "name": "Unknown",
          "email": "[email protected]",
          "url": null
        }
      ],
      "categories": [
        {
          "label": "retro",
          "term": "retro",
          "url": "http://www.blogger.com/atom/ns#"
        }
      ]
    },
    {
      "id": "tag:blogger.com,1999:blog-19303585.post-5795781756177787948",
      "title": "I have come to loathe acronyms",
      "description": null,
      "url": "http://blog.jgc.org/2025/02/i-have-come-to-loath-acronyms.html",
      "published": "2025-02-13T17:55:00.004Z",
      "updated": "2025-02-13T17:59:46.833Z",
      "content": "<p>Unless they are widely, widely known they make communication worse. And they have a tendency to make the writer seem pompous, or a member of some special clique, while making a reader who doesn't know the acronym feel foolish. </p><p>They are the opposite of clear communication, and are often accompanied by unclear, complex language.</p><p>The writer's goal (whether of a book, an email, or whatever the hell we call a tweet now) should be to be understood. Acronyms are an impediment to that and are often more difficult to read or say than actual words. </p><p>And don't fall into the awful trap of defining an acronym in a document and then using it later. That's a substitute for using plain language. Always use plain language.</p><p>Unless your goal is to be misunderstood. </p>",
      "image": null,
      "media": [],
      "authors": [
        {
          "name": "Unknown",
          "email": "[email protected]",
          "url": null
        }
      ],
      "categories": [
        {
          "label": "pseudo-randomness",
          "term": "pseudo-randomness",
          "url": null
        },
        {
          "label": "hardware",
          "term": "hardware",
          "url": null
        },
        {
          "label": "babbage",
          "term": "babbage",
          "url": null
        },
        {
          "label": "gaga",
          "term": "gaga",
          "url": null
        },
        {
          "label": "anti-spam",
          "term": "anti-spam",
          "url": null
        },
        {
          "label": "gnu make",
          "term": "gnu make",
          "url": null
        },
        {
          "label": "retro",
          "term": "retro",
          "url": null
        },
        {
          "label": "security",
          "term": "security",
          "url": null
        },
        {
          "label": "codes and ciphers",
          "term": "codes and ciphers",
          "url": null
        },
        {
          "label": "the geek atlas",
          "term": "the geek atlas",
          "url": null
        },
        {
          "label": "rants and raves",
          "term": "rants and raves",
          "url": null
        },
        {
          "label": "alan turing",
          "term": "alan turing",
          "url": null
        },
        {
          "label": "hits",
          "term": "hits",
          "url": null
        },
        {
          "label": "mathematics",
          "term": "mathematics",
          "url": null
        },
        {
          "label": "climate change",
          "term": "climate change",
          "url": null
        },
        {
          "label": "perl",
          "term": "perl",
          "url": null
        },
        {
          "label": "calculators",
          "term": "calculators",
          "url": null
        },
        {
          "label": "google go",
          "term": "google go",
          "url": null
        },
        {
          "label": "minitel",
          "term": "minitel",
          "url": null
        },
        {
          "label": "toys",
          "term": "toys",
          "url": null
        },
        {
          "label": "behind the screens",
          "term": "behind the screens",
          "url": null
        },
        {
          "label": "clocks",
          "term": "clocks",
          "url": null
        },
        {
          "label": "machine learning",
          "term": "machine learning",
          "url": null
        },
        {
          "label": "babygaga",
          "term": "babygaga",
          "url": null
        },
        {
          "label": "games",
          "term": "games",
          "url": null
        },
        {
          "label": "arc",
          "term": "arc",
          "url": null
        },
        {
          "label": "my services",
          "term": "my services",
          "url": null
        },
        {
          "label": "popfile",
          "term": "popfile",
          "url": null
        },
        {
          "label": "cansole",
          "term": "cansole",
          "url": null
        },
        {
          "label": "facebook",
          "term": "facebook",
          "url": null
        },
        {
          "label": "privacy",
          "term": "privacy",
          "url": null
        },
        {
          "label": "radio",
          "term": "radio",
          "url": null
        },
        {
          "label": "well... actually",
          "term": "well... actually",
          "url": null
        }
      ]
    },
    {
      "id": "tag:blogger.com,1999:blog-19303585.post-2972398345099268358",
      "title": "Archiving hardware projects",
      "description": null,
      "url": "http://blog.jgc.org/2025/02/archiving-hardware-projects.html",
      "published": "2025-02-10T17:09:00.000Z",
      "updated": "2025-02-10T17:09:09.529Z",
      "content": "<p>From time to time I do some project involving old hardware that requires connecting it to a modern computer. For example,</p><p><span>    </span><a href=\"https://blog.jgc.org/2025/02/getting-kim-1-to-talk-to-my-mac.html\">Getting the KIM-1 to talk to my Mac</a></p><p><span>    </span><a href=\"https://blog.jgc.org/2022/03/resurrecting-dataman-s4-prom-programmer.html\">Resurrecting a Dataman S4 PROM programmer</a></p><p><span>    </span><a href=\"https://blog.jgc.org/2022/04/ripping-old-mini-dv-video-tapes-on-mac.html\">Ripping old mini DV video tapes on a Mac</a></p><p>And I've come to the conclusion that archiving the related hardware is important. For example, I got this Dataman S4 talking to my Mac using a few different cables. I bought a set of cables and archived them in a bag for the next time I need to do this.</p><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_A37qHS8SIBr146GTQt5yyNg3AENYhRcyj6vAbQCCJeCaSpXI5Mh8IiMRhQMYLGqtqoIeGhgFK5VarUgScWfPV_jlhcyZEXdbtcjUCIgpdz6WG903sxPYD6g9c3rG3hyphenhyphenNcf06m0cyeKQn1OkAVMy_4fFLoiDbNAs1Z2KhlFET2S_rDJY9yZpc1w/s2664/dataman5.jpg\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"2664\" data-original-width=\"2381\" height=\"640\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_A37qHS8SIBr146GTQt5yyNg3AENYhRcyj6vAbQCCJeCaSpXI5Mh8IiMRhQMYLGqtqoIeGhgFK5VarUgScWfPV_jlhcyZEXdbtcjUCIgpdz6WG903sxPYD6g9c3rG3hyphenhyphenNcf06m0cyeKQn1OkAVMy_4fFLoiDbNAs1Z2KhlFET2S_rDJY9yZpc1w/w573-h640/dataman5.jpg\" width=\"573\" /></a></div><div class=\"separator\" style=\"clear: both; text-align: center;\"><br /></div>The Dataman S4 project required three things: a USB-C to USB-A adapter, a USB-A to RS-232 adapter and a 9 pin to 25 pin serial cable. <div><br /></div><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBw-gv1T6yK7NS-YQn7wHnDNK61-ow4R6AYjWETsNLG-IQ7pXIcni3NQg0MpcFWKaNyTE6edLK3whoeDL_cvm5M4DzwHm7ytq3zngw5GAwEM3I4wfHlLZdXIruTlCLbpooZi9FZPOQ5Axdq-O8IqUVOFbVpRmNR8NZlE9-Y39vvjUta7XR3UgUug/s4234/archive-1.jpeg\" imageanchor=\"1\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"4234\" data-original-width=\"3902\" height=\"640\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBw-gv1T6yK7NS-YQn7wHnDNK61-ow4R6AYjWETsNLG-IQ7pXIcni3NQg0MpcFWKaNyTE6edLK3whoeDL_cvm5M4DzwHm7ytq3zngw5GAwEM3I4wfHlLZdXIruTlCLbpooZi9FZPOQ5Axdq-O8IqUVOFbVpRmNR8NZlE9-Y39vvjUta7XR3UgUug/w590-h640/archive-1.jpeg\" width=\"590\" /></a></div><div><br /></div><div>These things are fairly inexpensive making it viable to archive them. Now I only have to worry about the drivers being available!</div><div><br /><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8oe93fugNv6GtBjc9-RkAdaU3jo5Cruy6-BxJH-5uX_k7eFtKFqTBODWC9VXHVSBWRRAHNt5djl1DSNlJ3-mzuSuWZYFR_kK0R7gGSH1zxuL87xhen5ysQTBmh7shP0t4yR4iVQJXXqPsGSI3cSFlQdrROEWokFWiCNCcYNxO0NiQrp4a1T5xfw/s4083/archive-2.jpeg\" imageanchor=\"1\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"4083\" data-original-width=\"3763\" height=\"640\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8oe93fugNv6GtBjc9-RkAdaU3jo5Cruy6-BxJH-5uX_k7eFtKFqTBODWC9VXHVSBWRRAHNt5djl1DSNlJ3-mzuSuWZYFR_kK0R7gGSH1zxuL87xhen5ysQTBmh7shP0t4yR4iVQJXXqPsGSI3cSFlQdrROEWokFWiCNCcYNxO0NiQrp4a1T5xfw/w590-h640/archive-2.jpeg\" width=\"590\" /></a></div></div>",
      "image": {
        "url": "https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_A37qHS8SIBr146GTQt5yyNg3AENYhRcyj6vAbQCCJeCaSpXI5Mh8IiMRhQMYLGqtqoIeGhgFK5VarUgScWfPV_jlhcyZEXdbtcjUCIgpdz6WG903sxPYD6g9c3rG3hyphenhyphenNcf06m0cyeKQn1OkAVMy_4fFLoiDbNAs1Z2KhlFET2S_rDJY9yZpc1w/s72-w573-h640-c/dataman5.jpg",
        "title": null
      },
      "media": [],
      "authors": [
        {
          "name": "Unknown",
          "email": "[email protected]",
          "url": null
        }
      ],
      "categories": [
        {
          "label": "hardware",
          "term": "hardware",
          "url": "http://www.blogger.com/atom/ns#"
        }
      ]
    },
    {
      "id": "tag:blogger.com,1999:blog-19303585.post-3528602294442713744",
      "title": "Getting the KIM-1 to talk to my Mac",
      "description": null,
      "url": "http://blog.jgc.org/2025/02/getting-kim-1-to-talk-to-my-mac.html",
      "published": "2025-02-09T20:28:00.005Z",
      "updated": "2025-02-09T20:36:02.125Z",
      "content": "<p>I've written before about <a href=\"https://blog.jgc.org/2023/11/my-1976-kim-1.html\">my 1976 KIM-1</a> and <a href=\"https://blog.jgc.org/2013/04/how-i-coded-in-1985.html\">code I wrote</a> for a similar one long ago. But I hadn't done much with the KIM-1 and strongly believe that old hardware need to be living machines not still lives. But using the KIM-1 directly (via its keypad and little hexadecimal display) is painful. I wanted to be able to use it with a terminal.</p><p>Luckily, the KIM-1 was designed to interface to a terminal: a <a href=\"https://en.wikipedia.org/wiki/Teletype_Model_33\">Model 33 ASR Teletype</a>. Teletypes use a type of interface which is unusual to most people (unless you work with industrial machinery where it's pretty common). That interface is a <a href=\"https://en.wikipedia.org/wiki/Digital_current_loop_interface\">current loop</a>.</p><p>A current loop uses current (often 20mA) rather than voltage (such as the voltage levels seen in common serial interfaces). Prior to the creation of <a href=\"https://en.wikipedia.org/wiki/RS-232\">RS-232</a>, current loops were very common. Current loops are still used in industrial settings partly because they have good noise immunity, can go for long distances, and are simple and reliable. </p><p>In the KIM-1 manual there's a picture of the way its current loop works when connected to a Teletype: </p><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNI4PoUrRp6VTMXV5sTj-cbd5KxPR0J4kMurosS_YawM1EPLVcKsq-4MIVitMa48NSS9nPgfYU2eui9t6UcwwHXSjzVwrYUIVmGWC1Ex7jFBgjyKnJ0sY7WpVmCbloaGjL5zeRAwX6XtS4l_lHwH88ihpgZ-awjCfDIcFdgCvBJ4MZ-b3pQydWNg/s1368/kim-1-1.png\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"1176\" data-original-width=\"1368\" height=\"550\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNI4PoUrRp6VTMXV5sTj-cbd5KxPR0J4kMurosS_YawM1EPLVcKsq-4MIVitMa48NSS9nPgfYU2eui9t6UcwwHXSjzVwrYUIVmGWC1Ex7jFBgjyKnJ0sY7WpVmCbloaGjL5zeRAwX6XtS4l_lHwH88ihpgZ-awjCfDIcFdgCvBJ4MZ-b3pQydWNg/w640-h550/kim-1-1.png\" width=\"640\" /></a></div><div class=\"separator\" style=\"clear: both; text-align: center;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: left;\">When the KIM-1 wants to send data to the Teletype it uses pins S and U of one of its edge connectors. S is permanently connected to +5V via a 150 ohm resistor. When the KIM-1 receives data from the Teletype's keyboard it uses pins R and T. Just like S, R is permanently connected to +5V. The important thing to note is that the KIM-1 is responsible for the current: the Teletype is entirely \"dumb\". This will matter later in this blog post.</div><div class=\"separator\" style=\"clear: both; text-align: left;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: left;\">I happened to have lying around <a href=\"https://www.horter-shop.de/de/rs232-tty-adapter-passiv/151-bausatz-rs232-tty-adapter-passiv-4260404260127.html\">a kit to make an adapter between RS-232 and the Siemens SIMATIC S5 current loop</a>. </div><div class=\"separator\" style=\"clear: both; text-align: left;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAeSbQlVy8BJolG0uDvmgGgtdDsoDFLV6Qo0sHrg-iVI8P0stXBdUg_HsRJqAAIToLVMsjMQu0EQeDfhja17tH9se1YtZXs3yccjPKcwmIUILqzB0I9xizoo8U7jLx_JXb8q2uenEPW7Tc_hv3sGrj7G9CRuep8WmkpyU13Beigo4jbMFZxiAjZw/s982/kim-1-2.png\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"946\" data-original-width=\"982\" height=\"616\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAeSbQlVy8BJolG0uDvmgGgtdDsoDFLV6Qo0sHrg-iVI8P0stXBdUg_HsRJqAAIToLVMsjMQu0EQeDfhja17tH9se1YtZXs3yccjPKcwmIUILqzB0I9xizoo8U7jLx_JXb8q2uenEPW7Tc_hv3sGrj7G9CRuep8WmkpyU13Beigo4jbMFZxiAjZw/w640-h616/kim-1-2.png\" width=\"640\" /></a></div><div class=\"separator\" style=\"clear: both; text-align: left;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: left;\">A simple kit to build and since USB to RS-232 adapters are easy to find with this I'd be able to communicate with the KIM-1. But first check the circuit diagram of this adapter. There's a small problem on the receive side.</div><div class=\"separator\" style=\"clear: both; text-align: left;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCYmSOPwceRgzMBw50FJPAOYpZdhpJp0Yh3WhN120WAo6qEHLwzn2a5CwFTXAYINa_36dofqGtjI7RXdbVWbcVenGRU4f7f6l-Mhb7lc0DEYEc6aicS7EFNqWhg6ynje8sxQcqZQVyWujO1ARaJUotW1M8gijQh0X27xcgnN3y32U5FNllgFWX7A/s1758/kim-1-3.png\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"874\" data-original-width=\"1758\" height=\"318\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCYmSOPwceRgzMBw50FJPAOYpZdhpJp0Yh3WhN120WAo6qEHLwzn2a5CwFTXAYINa_36dofqGtjI7RXdbVWbcVenGRU4f7f6l-Mhb7lc0DEYEc6aicS7EFNqWhg6ynje8sxQcqZQVyWujO1ARaJUotW1M8gijQh0X27xcgnN3y32U5FNllgFWX7A/w640-h318/kim-1-3.png\" width=\"640\" /></a></div><br /><div class=\"separator\" style=\"clear: both; text-align: left;\">As it pretty common with current loop applications, optoisolators are used. OK1 handles when the device connected to the RS-232 transmits something. And you can see from the diagram that it expects to be getting 5V, 20mA in on its pin 5 and then out again on pin 4. So, that'll work perfectly for the \"keyboard\" connection to the KIM-1 (pins R and T). </div><div class=\"separator\" style=\"clear: both; text-align: left;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: left;\">But the receive side is a different story. It's handled by OK2 and it's expecting 5V, 20mA on pin 1,p but pin 2 goes to GND. So, there's no \"loop\" present. This won't work with the KIM-1 without a small modification.</div><div class=\"separator\" style=\"clear: both; text-align: left;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: left;\">I built the kit and and tested it against the KIM-1 like this:</div><div class=\"separator\" style=\"clear: both; text-align: left;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghrUvvLUgSr3RZhod4XiIyxt8viOVH-NQwoLikQMDsZM6jf17czwBXfMYjJKhiB0DeTZMp8ryHVitx-8g1TolmqxAhxfE633YHYpoGBidPl1hcs3eBGgcPeGpE1VULmDIXNxOPGk9D5eiRK7TfxMcWc7uvnXLm3Ht7pP5gBBIq9Ms93bhuvCgyDg/s1280/kim-1-4.jpg\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"744\" data-original-width=\"1280\" height=\"372\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghrUvvLUgSr3RZhod4XiIyxt8viOVH-NQwoLikQMDsZM6jf17czwBXfMYjJKhiB0DeTZMp8ryHVitx-8g1TolmqxAhxfE633YHYpoGBidPl1hcs3eBGgcPeGpE1VULmDIXNxOPGk9D5eiRK7TfxMcWc7uvnXLm3Ht7pP5gBBIq9Ms93bhuvCgyDg/w640-h372/kim-1-4.jpg\" width=\"640\" /></a></div><div><br /></div>Looks messy but it validated the little modification I needed to make and that I could talk to the KIM-1. Here it is talking at 300 baud using the RS-232 to USB adapter seen above. <div><br /></div><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQxkZf-cbzjvBVaBvQGWO3XeLjzf6k7kzf0uM0sczMbzcLYzSoZ6sUXsg47ey0zq4VautycgRmuAz1MVwBIbrS01NywuIKJZSoBvvnj7T8kEP8kzpBBPmwndpaBqp7JpibNfBRYRGlHQHh0MShzorcPoQYeN541YcXG3gK__dTB5kvdR6lw3bnUg/s1146/kim-1.gif\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"1020\" data-original-width=\"1146\" height=\"570\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQxkZf-cbzjvBVaBvQGWO3XeLjzf6k7kzf0uM0sczMbzcLYzSoZ6sUXsg47ey0zq4VautycgRmuAz1MVwBIbrS01NywuIKJZSoBvvnj7T8kEP8kzpBBPmwndpaBqp7JpibNfBRYRGlHQHh0MShzorcPoQYeN541YcXG3gK__dTB5kvdR6lw3bnUg/w640-h570/kim-1.gif\" width=\"640\" /></a></div><div class=\"separator\" style=\"clear: both; text-align: center;\"><br /></div><div class=\"separator\" style=\"clear: both;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: left;\">So, what's the modification? Well, pin 2 of OK2 goes to ground and we don't want it to, we want it to go the KIM-1's pin U. There are two ways to do this. I could have cut the track on the back of the board that goes from pin 2 to ground, and soldered a wire on the back.</div><div class=\"separator\" style=\"clear: both; text-align: left;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: left;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixwnVKqFHl5uFIx6voI_JNpHEdW1WRpV8-zv4w6QydXJ0CTPSLced0JGZgZe8rucLGJG_AqZJzDk2V-7iC1kYzi7o0i-OmKObeNXGq_CjBaSxcbPX0VlK_eGEznspzc6nZ-btpSZdkyL9NZ-6lChzPpcZCz-rEFODbiN5WSQT-jCdVHbTbizarkQ/s540/kim-1-5.png\" style=\"margin-left: 1em; margin-right: 1em; text-align: center;\"><img border=\"0\" data-original-height=\"488\" data-original-width=\"540\" height=\"289\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixwnVKqFHl5uFIx6voI_JNpHEdW1WRpV8-zv4w6QydXJ0CTPSLced0JGZgZe8rucLGJG_AqZJzDk2V-7iC1kYzi7o0i-OmKObeNXGq_CjBaSxcbPX0VlK_eGEznspzc6nZ-btpSZdkyL9NZ-6lChzPpcZCz-rEFODbiN5WSQT-jCdVHbTbizarkQ/s320/kim-1-5.png\" width=\"320\" /></a></div><div class=\"separator\" style=\"clear: both; text-align: left;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: left;\">But this kit came with all the chips socketed so I took an even simpler route. Bend pin 2 away from the socket and solder directly to it.</div><div class=\"separator\" style=\"clear: both; text-align: left;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdUEHXkzdm5jFklLlLDNbtbLnPCKx7RELxbJMLj2-0lGW7nFmcOD_qzOp8UReQ7tyMTTbaHtjA6_NlwUd0O4Cr48_2T60ZVRf8CGEpAfcjv8qECa7aFXoOFy5kLvMUBa3ZOE_y8ng7kDFry6PALL4aB2aTxRl9kDjWP9ubNAC_l4cs3rrUBAtEvQ/s3193/kim-1-6.jpg\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"2698\" data-original-width=\"3193\" height=\"540\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdUEHXkzdm5jFklLlLDNbtbLnPCKx7RELxbJMLj2-0lGW7nFmcOD_qzOp8UReQ7tyMTTbaHtjA6_NlwUd0O4Cr48_2T60ZVRf8CGEpAfcjv8qECa7aFXoOFy5kLvMUBa3ZOE_y8ng7kDFry6PALL4aB2aTxRl9kDjWP9ubNAC_l4cs3rrUBAtEvQ/w640-h540/kim-1-6.jpg\" width=\"640\" /></a></div><br /><div class=\"separator\" style=\"clear: both; text-align: left;\">And that worked fine. The kit also came with a nice little box and so the final adapter looks neat.</div><div class=\"separator\" style=\"clear: both; text-align: left;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfUeBT17s3TjORhTssUtiUGLaW1M_CpBMrWIwnNG737fVgehQnvGZ9-9VoHNNFOeDzNCtUrjQwO82_4VMayPlsyQhOwI23jMH-1rPcHCzkVWi9ZkJe8T1zICJAcAjRnyJaqNyr8ZZj7IRLZn3ivPDXWUQFV5VkuNaKU1H-cSDk07jFKqq6it_PxQ/s1280/kim-1-7.jpeg\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"960\" data-original-width=\"1280\" height=\"480\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfUeBT17s3TjORhTssUtiUGLaW1M_CpBMrWIwnNG737fVgehQnvGZ9-9VoHNNFOeDzNCtUrjQwO82_4VMayPlsyQhOwI23jMH-1rPcHCzkVWi9ZkJe8T1zICJAcAjRnyJaqNyr8ZZj7IRLZn3ivPDXWUQFV5VkuNaKU1H-cSDk07jFKqq6it_PxQ/w640-h480/kim-1-7.jpeg\" width=\"640\" /></a></div><br /><div class=\"separator\" style=\"clear: both; text-align: left;\">The grey wire goes to the KIM-1, the white wire is a USB-A cable that I'm using to power the adapter and the KIM-1 itself. </div><div class=\"separator\" style=\"clear: both; text-align: left;\"><br /><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRNc94lv50bDs6CSJnYk8rEeC9wAiQlf_tIUCAgHw203ey4NJwxBF8MyhroSH1TyB6FPqsk4i4VTQGUbQwYcXBGvlCv5fI6P0qOYMcE5sB2t3VDm-ebZY-iMjZgWndXe2Gs5_bY4cHcwNNUpXKMBr8GXj-C_dkNU7oDPRYYKoqrgdfJQOBb1nDTw/s1280/kim-1-8.jpeg\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"960\" data-original-width=\"1280\" height=\"480\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRNc94lv50bDs6CSJnYk8rEeC9wAiQlf_tIUCAgHw203ey4NJwxBF8MyhroSH1TyB6FPqsk4i4VTQGUbQwYcXBGvlCv5fI6P0qOYMcE5sB2t3VDm-ebZY-iMjZgWndXe2Gs5_bY4cHcwNNUpXKMBr8GXj-C_dkNU7oDPRYYKoqrgdfJQOBb1nDTw/w640-h480/kim-1-8.jpeg\" width=\"640\" /></a></div><br /></div><div>The KIM-1 will happily communicate as 1200 baud with 7 bit ASCII and 2 stop bits. I'm using minicom to communicate with it. The main thing is to set the delete key to send DEL instead of BS since the KIM-1 needs to receive a DEL on start up so that it can measure the Mac's transmission speed.</div><div><br /></div><div>One of the Teletype functions available is to load a program from punched tape. I don't have an actual Teletype but I can emulate the punched tape format and that'll allow me to upload programs easily.</div><div><br /></div><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9IJ_wZJFKEaDD5UhZ_cb3FiMO9IHgOfrMnrKOQjYdMuSvZNwO7cxND1M774qpg639z71zcWxWUPrvc-YFYLWIS5SdfzlZ0nMFZpaUKHE5JANoIwmHLXEa6NDE-oAkgwPyukU3RtHTmdhisdCeYCaD_SgRDAldBPtge1gbSAbM8XLe-hQEccRrqg/s1208/kim-1-9.png\" imageanchor=\"1\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"1208\" data-original-width=\"1016\" height=\"640\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9IJ_wZJFKEaDD5UhZ_cb3FiMO9IHgOfrMnrKOQjYdMuSvZNwO7cxND1M774qpg639z71zcWxWUPrvc-YFYLWIS5SdfzlZ0nMFZpaUKHE5JANoIwmHLXEa6NDE-oAkgwPyukU3RtHTmdhisdCeYCaD_SgRDAldBPtge1gbSAbM8XLe-hQEccRrqg/w538-h640/kim-1-9.png\" width=\"538\" /></a></div><br /><div>The format itself is not complicated.</div><div><br /></div><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWxEHqPySDq6ch5c9XLYO8NOf7B8x-ExUa0UDgFltgwhqYWDBAyNrgpLmn3EWcnBeWPOcQ6TNOcZOz0ia3TM2MFcvx5ol54r9ENRTb76a_S-jd78mbyl1J85011K7a4wTRgYyTDaPfsOEjdAP-Py9ny5sk-oRxHawHil31r6Wba_QiU8QKcw8etg/s1058/kim-1-10.png\" imageanchor=\"1\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"1058\" data-original-width=\"1016\" height=\"640\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWxEHqPySDq6ch5c9XLYO8NOf7B8x-ExUa0UDgFltgwhqYWDBAyNrgpLmn3EWcnBeWPOcQ6TNOcZOz0ia3TM2MFcvx5ol54r9ENRTb76a_S-jd78mbyl1J85011K7a4wTRgYyTDaPfsOEjdAP-Py9ny5sk-oRxHawHil31r6Wba_QiU8QKcw8etg/w614-h640/kim-1-10.png\" width=\"614\" /></a></div>",
      "image": {
        "url": "https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNI4PoUrRp6VTMXV5sTj-cbd5KxPR0J4kMurosS_YawM1EPLVcKsq-4MIVitMa48NSS9nPgfYU2eui9t6UcwwHXSjzVwrYUIVmGWC1Ex7jFBgjyKnJ0sY7WpVmCbloaGjL5zeRAwX6XtS4l_lHwH88ihpgZ-awjCfDIcFdgCvBJ4MZ-b3pQydWNg/s72-w640-h550-c/kim-1-1.png",
        "title": null
      },
      "media": [],
      "authors": [
        {
          "name": "Unknown",
          "email": "[email protected]",
          "url": null
        }
      ],
      "categories": [
        {
          "label": "retro",
          "term": "retro",
          "url": "http://www.blogger.com/atom/ns#"
        }
      ]
    },
    {
      "id": "tag:blogger.com,1999:blog-19303585.post-8168793316207256718",
      "title": "Twenty years of the \"GNU Make Standard Library\"",
      "description": null,
      "url": "http://blog.jgc.org/2025/02/twenty-years-of-gnu-make-standard.html",
      "published": "2025-02-03T19:27:00.055Z",
      "updated": "2025-02-05T09:50:10.781Z",
      "content": "<p>Twenty years ago, on February 3, 2005, I released v1.0.0 of a project I called \"GNU Make Standard Library\" (GMSL). That <a href=\"https://sourceforge.net/projects/gmsl/files/GNU%20Make%20Standard%20Library/v1.0.0/\">first release</a> can still be found in its original location on SourceForge. I moved the project from SourceForge to <a href=\"https://github.com/jgrahamc/gmsl\">GitHub</a> and newer releases are there. The latest release is <a href=\"https://github.com/jgrahamc/gmsl/releases/tag/v1.2.2\">v1.2.2</a> on March 30, 2024.</p><p>The project has its own homepage at <a href=\"https://gmsl.jgc.org/\">https://gmsl.jgc.org/</a>. The page describes the GMSL as \"a collection of functions implemented using native GNU Make functionality that provide list and string manipulation, integer arithmetic, associative arrays, stacks, and debugging facilities.\"</p><p>GMSL grew out of work that eventually became my book \"<a href=\"https://nostarch.com/gnumake\">The GNU Make Book</a>\". What can it do?</p><p>Well, things like this:</p><p><span style=\"font-family: courier;\">include gmsl<br /></span><span style=\"font-family: courier;\"><br />VAR    := Here is a string with some words in it.<br /></span><span style=\"font-family: courier;\">$(info $(VAR))<br /></span><span style=\"font-family: courier;\"><br /># Convert VAR to lowercase<br /></span><span style=\"font-family: courier;\">LC_VAR := $(call lc,$(VAR))<br /></span><span style=\"font-family: courier;\">$(info $(LC_VAR))<br /></span><span style=\"font-family: courier;\"><br /># Get the length of LC_VAR as a string<br /></span><span style=\"font-family: courier;\">$(info $(call strlen,$(LC_VAR)))</span></p><p><span style=\"font-family: courier;\"># See if VAR and LC_VAR are the same string<br /></span><span style=\"font-family: courier;\">$(info $(if $(call seq,$(VAR),$(LC_VAR)),Same,Different))</span></p><p><span style=\"font-family: courier;\"># Treat LC_VAR as a list and get the last element<br /></span><span style=\"font-family: courier;\">$(info $(call last,$(LC_VAR)))</span></p><p><span style=\"font-family: courier;\"># Get the number of list elements in LC_VAR<br /></span><span style=\"font-family: courier;\">$(info $(call length,$(LC_VAR)))</span></p><p><span style=\"font-family: courier;\"># Apply the strlen function to each element of LC_VAR<br /></span><span style=\"font-family: courier;\">$(info $(call map,strlen,$(LC_VAR)))</span></p><p><span style=\"font-family: courier;\"># Deduplicate the list of lenghts of elements of LC_VAR<br /></span><span style=\"font-family: courier;\">$(info $(call uniq,$(call map,strlen,$(LC_VAR))))</span></p><p><span style=\"font-family: courier;\"># Split LC_VAR on the letter e and replace with 3<br /></span><span style=\"font-family: courier;\">$(info $(call merge,3,$(call split,e,$(LC_VAR))))</span></p><p><span style=\"font-family: courier;\"># Create an associative array mapping the lengths of words<br /></span><span style=\"font-family: courier;\"># in LC_VAR to a count for each length<br /></span><span style=\"font-family: courier;\">increment_aa = $(call set,LC_VAR_AA,$1,$(call </span><span style=\"font-family: courier;\">inc,$(call </span><span style=\"font-family: courier;\">get,LC_VAR_AA,$1)))<br /></span><span style=\"font-family: courier;\">$(call map,increment_aa,$(call map,strlen,$(LC_VAR)))<br /></span><span style=\"font-family: courier;\">dump_key = $(info $1: $(call get,LC_VAR_AA,$1))<br /></span><span style=\"font-family: courier;\">$(call map,dump_key,$(call keys,LC_VAR_AA))</span></p><p>And a whole lot more. The entire GMSL is written using native GNU Make functionality and pull requests are welcome!</p><p>Update 2025-02-05: I decided GMSL was missing a <a href=\"https://github.com/jgrahamc/gmsl/blob/145bda7295dee873b2c2842f404365857ea24764/__gmsl#L239\">fold</a> function so I added it. So, latest release is today, <a href=\"https://github.com/jgrahamc/gmsl/releases/tag/v1.2.3\">v1.2.3</a>. </p>",
      "image": null,
      "media": [],
      "authors": [
        {
          "name": "Unknown",
          "email": "[email protected]",
          "url": null
        }
      ],
      "categories": [
        {
          "label": "pseudo-randomness",
          "term": "pseudo-randomness",
          "url": null
        },
        {
          "label": "hardware",
          "term": "hardware",
          "url": null
        },
        {
          "label": "babbage",
          "term": "babbage",
          "url": null
        },
        {
          "label": "gaga",
          "term": "gaga",
          "url": null
        },
        {
          "label": "anti-spam",
          "term": "anti-spam",
          "url": null
        },
        {
          "label": "gnu make",
          "term": "gnu make",
          "url": null
        },
        {
          "label": "retro",
          "term": "retro",
          "url": null
        },
        {
          "label": "security",
          "term": "security",
          "url": null
        },
        {
          "label": "codes and ciphers",
          "term": "codes and ciphers",
          "url": null
        },
        {
          "label": "the geek atlas",
          "term": "the geek atlas",
          "url": null
        },
        {
          "label": "rants and raves",
          "term": "rants and raves",
          "url": null
        },
        {
          "label": "alan turing",
          "term": "alan turing",
          "url": null
        },
        {
          "label": "hits",
          "term": "hits",
          "url": null
        },
        {
          "label": "mathematics",
          "term": "mathematics",
          "url": null
        },
        {
          "label": "climate change",
          "term": "climate change",
          "url": null
        },
        {
          "label": "perl",
          "term": "perl",
          "url": null
        },
        {
          "label": "calculators",
          "term": "calculators",
          "url": null
        },
        {
          "label": "google go",
          "term": "google go",
          "url": null
        },
        {
          "label": "minitel",
          "term": "minitel",
          "url": null
        },
        {
          "label": "toys",
          "term": "toys",
          "url": null
        },
        {
          "label": "behind the screens",
          "term": "behind the screens",
          "url": null
        },
        {
          "label": "clocks",
          "term": "clocks",
          "url": null
        },
        {
          "label": "machine learning",
          "term": "machine learning",
          "url": null
        },
        {
          "label": "babygaga",
          "term": "babygaga",
          "url": null
        },
        {
          "label": "games",
          "term": "games",
          "url": null
        },
        {
          "label": "arc",
          "term": "arc",
          "url": null
        },
        {
          "label": "my services",
          "term": "my services",
          "url": null
        },
        {
          "label": "popfile",
          "term": "popfile",
          "url": null
        },
        {
          "label": "cansole",
          "term": "cansole",
          "url": null
        },
        {
          "label": "facebook",
          "term": "facebook",
          "url": null
        },
        {
          "label": "privacy",
          "term": "privacy",
          "url": null
        },
        {
          "label": "radio",
          "term": "radio",
          "url": null
        },
        {
          "label": "well... actually",
          "term": "well... actually",
          "url": null
        }
      ]
    },
    {
      "id": "tag:blogger.com,1999:blog-19303585.post-8649792458628677830",
      "title": "The complete text of \"All Watched Over by Machines of Loving Grace\"",
      "description": null,
      "url": "http://blog.jgc.org/2024/12/the-complete-text-of-all-watched-over.html",
      "published": "2024-12-26T15:26:00.003Z",
      "updated": "2024-12-26T15:34:02.508Z",
      "content": "<p>Richard Brautigan's poem \"<a href=\"https://en.wikipedia.org/wiki/All_Watched_Over_by_Machines_of_Loving_Grace\">All Watched Over by Machines of Loving Grace</a>\" is somewhat well known in tech. circles but I couldn't find a complete PDF of the <a href=\"https://en.wikipedia.org/wiki/All_Watched_Over_by_Machines_of_Loving_Grace_(poetry_collection)\">original 1967 publication of it (and other poems)</a> online. </p><p>The copyright notice in Brautigan's collection reads:</p><p><span style=\"font-family: courier;\">  © Copyright 1967 by Richard Brautigan </span></p><p><span style=\"font-family: courier;\"><span>  </span>Permission is granted to reprint<br /><span>  </span>any of these poems in magazines,<br /><span>  </span>books and newspapers if they are<br /><span>  </span>given away free. </span></p><p>I am interpreting \"print\" as including the availability of a free PDF and making a scan of the complete book available here. </p><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://jgc.org/awobmolg-1967.pdf\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"1676\" data-original-width=\"1392\" height=\"640\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGhScUr9y4lWyAZs6B-j7QtJjfqFmt-VrOpfII9BIJYzoGDGCtdUYR0pffEwSIWwDUrIBaj57cz5Uluj8CG1hzA8Oi6Vyvm9Bc3wcDkAxucLJQJGrQHOOYLfwIE0zc-JsnuKfAkwrxQPe1N1RdLV7uOhfQD84r6oCgMuq39ZxVXOTT3sNgxGv9CA/w532-h640/Screenshot%202024-12-26%20at%2015.24.00.png\" width=\"532\" /></a></div><div class=\"separator\" style=\"clear: both; text-align: left;\"><br /></div>",
      "image": {
        "url": "https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGhScUr9y4lWyAZs6B-j7QtJjfqFmt-VrOpfII9BIJYzoGDGCtdUYR0pffEwSIWwDUrIBaj57cz5Uluj8CG1hzA8Oi6Vyvm9Bc3wcDkAxucLJQJGrQHOOYLfwIE0zc-JsnuKfAkwrxQPe1N1RdLV7uOhfQD84r6oCgMuq39ZxVXOTT3sNgxGv9CA/s72-w532-h640-c/Screenshot%202024-12-26%20at%2015.24.00.png",
        "title": null
      },
      "media": [],
      "authors": [
        {
          "name": "Unknown",
          "email": "[email protected]",
          "url": null
        }
      ],
      "categories": [
        {
          "label": "pseudo-randomness",
          "term": "pseudo-randomness",
          "url": null
        },
        {
          "label": "hardware",
          "term": "hardware",
          "url": null
        },
        {
          "label": "babbage",
          "term": "babbage",
          "url": null
        },
        {
          "label": "gaga",
          "term": "gaga",
          "url": null
        },
        {
          "label": "anti-spam",
          "term": "anti-spam",
          "url": null
        },
        {
          "label": "gnu make",
          "term": "gnu make",
          "url": null
        },
        {
          "label": "retro",
          "term": "retro",
          "url": null
        },
        {
          "label": "security",
          "term": "security",
          "url": null
        },
        {
          "label": "codes and ciphers",
          "term": "codes and ciphers",
          "url": null
        },
        {
          "label": "the geek atlas",
          "term": "the geek atlas",
          "url": null
        },
        {
          "label": "rants and raves",
          "term": "rants and raves",
          "url": null
        },
        {
          "label": "alan turing",
          "term": "alan turing",
          "url": null
        },
        {
          "label": "hits",
          "term": "hits",
          "url": null
        },
        {
          "label": "mathematics",
          "term": "mathematics",
          "url": null
        },
        {
          "label": "climate change",
          "term": "climate change",
          "url": null
        },
        {
          "label": "perl",
          "term": "perl",
          "url": null
        },
        {
          "label": "calculators",
          "term": "calculators",
          "url": null
        },
        {
          "label": "google go",
          "term": "google go",
          "url": null
        },
        {
          "label": "minitel",
          "term": "minitel",
          "url": null
        },
        {
          "label": "toys",
          "term": "toys",
          "url": null
        },
        {
          "label": "behind the screens",
          "term": "behind the screens",
          "url": null
        },
        {
          "label": "clocks",
          "term": "clocks",
          "url": null
        },
        {
          "label": "machine learning",
          "term": "machine learning",
          "url": null
        },
        {
          "label": "babygaga",
          "term": "babygaga",
          "url": null
        },
        {
          "label": "games",
          "term": "games",
          "url": null
        },
        {
          "label": "arc",
          "term": "arc",
          "url": null
        },
        {
          "label": "my services",
          "term": "my services",
          "url": null
        },
        {
          "label": "popfile",
          "term": "popfile",
          "url": null
        },
        {
          "label": "cansole",
          "term": "cansole",
          "url": null
        },
        {
          "label": "facebook",
          "term": "facebook",
          "url": null
        },
        {
          "label": "privacy",
          "term": "privacy",
          "url": null
        },
        {
          "label": "radio",
          "term": "radio",
          "url": null
        },
        {
          "label": "well... actually",
          "term": "well... actually",
          "url": null
        }
      ]
    },
    {
      "id": "tag:blogger.com,1999:blog-19303585.post-8901769136152952921",
      "title": "badkeming: a site for kerning so bad it's keming",
      "description": null,
      "url": "http://blog.jgc.org/2024/12/badkeming-site-for-kerning-so-bad-its.html",
      "published": "2024-12-15T16:15:00.003Z",
      "updated": "2024-12-15T16:16:23.395Z",
      "content": "<p>I made another silly Tumblr (to go along with <a href=\"https://moviecode.tumblr.com/\">Movie Code</a> and <a href=\"https://lowbackgroundsteel.ai/\">Low Background Steel</a>). This times it's a Tumblr for all those font disasters and other typographical amusements. Welcome to the wonderful world of <a href=\"https://badkeming.com\">badkeming.com</a>:</p><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://badkeming.com\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"1428\" data-original-width=\"2174\" height=\"420\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOnAi31wLwP1beQLc-ylj8D2VpWVsJQkuyVcUMViFFpppM7BmbNgrB36PQWpxETwYpIP2PjkoJ-DnsDabdn5UOJoNvy-vh6oPlh2cISzOiqj-vmc-zfHKzSasC8ZamjWl7vwXU5ee2V7Jfj5wuQEBgfyOniA_1_3Z_RuTDFPv3zmTQVugR1HjOZA/w640-h420/badkeming-1.png\" width=\"640\" /></a></div><div class=\"separator\" style=\"clear: both; text-align: center;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: left;\">Submissions gladly accepted.</div>",
      "image": {
        "url": "https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOnAi31wLwP1beQLc-ylj8D2VpWVsJQkuyVcUMViFFpppM7BmbNgrB36PQWpxETwYpIP2PjkoJ-DnsDabdn5UOJoNvy-vh6oPlh2cISzOiqj-vmc-zfHKzSasC8ZamjWl7vwXU5ee2V7Jfj5wuQEBgfyOniA_1_3Z_RuTDFPv3zmTQVugR1HjOZA/s72-w640-h420-c/badkeming-1.png",
        "title": null
      },
      "media": [],
      "authors": [
        {
          "name": "Unknown",
          "email": "[email protected]",
          "url": null
        }
      ],
      "categories": [
        {
          "label": "pseudo-randomness",
          "term": "pseudo-randomness",
          "url": "http://www.blogger.com/atom/ns#"
        }
      ]
    },
    {
      "id": "tag:blogger.com,1999:blog-19303585.post-4119179139891431895",
      "title": "\"All your base are belong to us\" introduction to my 2004 MIT Spam Conference talk",
      "description": null,
      "url": "http://blog.jgc.org/2024/12/all-you-base-are-belong-to-us.html",
      "published": "2024-12-08T17:24:00.004Z",
      "updated": "2024-12-08T17:28:43.687Z",
      "content": "<p>As I've mentioned before <a href=\"https://blog.jgc.org/2023/07/how-to-beat-adaptivebayesian-spam.html\">my talk at the 2004 MIT Spam Conference</a> was about using one machine learning system to beat another. In that case a spammer using machine learning to beat a machine learning spam filter.</p><p>The talk started with a short video playing off the <a href=\"https://en.wikipedia.org/wiki/All_your_base_are_belong_to_us\">All your base are belong to us</a> meme. I very carefully edited the images to change the text to be about spam and incorporate Paul Graham (who was the instigator of the MIT Spam Conference and an <a href=\"https://paulgraham.com/spam.html\">early machine learning spam filter pioneer</a>). </p><p>I thought I'd <a href=\"https://blog.jgc.org/2023/05/bringing-popfile-web-site-back-from-dead.html\">lost the audio of that introduction</a> and randomly came across it today. So here is the restored introduction to the talk made on a Mac in 2004 (I still haven't found the audio of the actual talk).</p>\n\n<div style=\"padding-top: 56.25%; position: relative;\">\n  <iframe allow=\"accelerometer; gyroscope; autoplay; encrypted-media; picture-in-picture;\" allowfullscreen=\"true\" loading=\"lazy\" src=\"https://customer-rww76yind8iym5aw.cloudflarestream.com/41a0f39e1f9d7fcde6dd32bacf628437/iframe?poster=https%3A%2F%2Fcustomer-rww76yind8iym5aw.cloudflarestream.com%2F41a0f39e1f9d7fcde6dd32bacf628437%2Fthumbnails%2Fthumbnail.jpg%3Ftime%3D%26height%3D600\" style=\"border: none; height: 100%; left: 0; position: absolute; top: 0; width: 100%;\"></iframe></div>",
      "image": null,
      "media": [],
      "authors": [
        {
          "name": "Unknown",
          "email": "[email protected]",
          "url": null
        }
      ],
      "categories": [
        {
          "label": "anti-spam",
          "term": "anti-spam",
          "url": "http://www.blogger.com/atom/ns#"
        }
      ]
    },
    {
      "id": "tag:blogger.com,1999:blog-19303585.post-3123313590817156000",
      "title": "Personalized voice recordings by Elwood \"You've got mail!\" Edwards",
      "description": null,
      "url": "http://blog.jgc.org/2024/11/personalized-voice-recordings-by-elwood.html",
      "published": "2024-11-15T19:12:00.001Z",
      "updated": "2024-11-15T19:13:37.606Z",
      "content": "If you're old enough to have ever used, seen or overheard the once ubiquitous AOL software you'll have heard the voice of Elwood Edwards. His voice was known to millions for saying \"You've got mail!\", \"Welcome\", \"File's done\" and \"Goodbye\" when using the AOL software. He <a href=\"https://www.nytimes.com/2024/11/07/technology/elwood-edwards-aol-dead.html\">died last week</a> which reminded me of the time I paid him to record a customized greeting for me.<div><br /></div><div>Here's Elwood Edwards explaining how that came about:<br /><div><br /></div><div class=\"separator\" style=\"clear: both; text-align: center;\"><iframe allowfullscreen=\"\" class=\"BLOG_video_class\" height=\"266\" src=\"https://www.youtube.com/embed/yKgiqsdyiAA\" width=\"320\" youtube-src-id=\"yKgiqsdyiAA\"></iframe></div><div class=\"separator\" style=\"clear: both; text-align: center;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: left;\">Back in the early 2000s I was working on a machine learning email filtering program called <a href=\"https://en.wikipedia.org/wiki/POPFile\">POPFile</a> and I discovered that Elwood Edwards had a web site <a href=\"https://web.archive.org/web/20080613203307/http://www.makinwavs.com/\">makinwavs.com</a> where you could order custom messages recorded by him in that \"AOL voice\".</div><div class=\"separator\" style=\"clear: both; text-align: left;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKrbUDC8NAGhFzCk3ztPZbvakGP4LrkXogIWWXL2-Iakrme-DKKvz5FAgA2EWRDA13mOBceClcVlvKvJn5uWH1N2AGjRUh0_ih-wEfORNoApKB-ZOkOQQYa52qPUYHVzsierokO3eterq0eTxlVsMhfalgbtUTYrzAcKIvyOkPEl_vHrWEbh0BYg/s1536/aol-1.png\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"1022\" data-original-width=\"1536\" height=\"426\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKrbUDC8NAGhFzCk3ztPZbvakGP4LrkXogIWWXL2-Iakrme-DKKvz5FAgA2EWRDA13mOBceClcVlvKvJn5uWH1N2AGjRUh0_ih-wEfORNoApKB-ZOkOQQYa52qPUYHVzsierokO3eterq0eTxlVsMhfalgbtUTYrzAcKIvyOkPEl_vHrWEbh0BYg/w640-h426/aol-1.png\" width=\"640\" /></a></div><div class=\"separator\" style=\"clear: both; text-align: center;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: left;\">So, I ordered \"Mail classified by POPFile\" and \"Use the source, Luke!\" from him for a total cost of $30. Here's the original PayPal receipt:</div><div class=\"separator\" style=\"clear: both; text-align: left;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: left;\"><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">    Date: Wed, 13 Nov 2002 11:54:25 -0800</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">    From: [email protected]</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">    Subject: Receipt for your Payment</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\"><br /></span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">    This email confirms that you have paid EVO, Inc. $30.00 </span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">    using PayPal.</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">    This credit card transaction will appear on your bill as  </span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">    \"PAYPAL*EVO INC\".</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\"><br /></span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">    SHOPPING CART CONTENTS:</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\"><br /></span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">    1.</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\"><br /></span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">      Item Name:   Custom set of 5 non-AOL  .WAV Files</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">      Option 1:    Enter your 5 scripts:: \"Use the source, Luke!\", </span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">      \"Mail classified by POPFile\"</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">      Option 2:    (If needed, enter more info):: (Yep, I know it's </span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">      only two, but that's all I need...)</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">      Item Number: EVO-4</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">      Item Amount: $30.00</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">      Quantity:    1</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">         Total:    $30.00</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\"><br /></span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">         Cart Subtotal:  $30.00</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">              Handling:  $0.00</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">              Shipping:  </span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">    Sales Tax (0.000%):  $0.00</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">            Cart Total:  $30.00</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\"><br /></span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">    ------------------------------</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">    Payment Details:</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">    ------------------------------</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\"><br /></span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">    Amount: $30.00</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">    Buyer: John Graham-Cumming</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\"><br /></span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">    ------------------------------</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">    Business Information:</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">    ------------------------------</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\"><br /></span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">    Business: EVO, Inc.</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">    Contact E-Mail: [email protected]</span></div></div><br /><div class=\"separator\" style=\"clear: both; text-align: left;\">Three days later I had three voice files (the two I'd ordered plus he threw in \"You've got mail, John!\" for free).</div><div class=\"separator\" style=\"clear: both; text-align: left;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: left;\"><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">    From: [email protected]</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">    Date: Sat, 16 Nov 2002 22:16:04 -0500</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">    Subject: Your files :)</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\"><br /></span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">    Hi, John.</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\"><br /></span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">    Thanks for your order.  Here are your files... and I included a </span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">    \"You've got mail, John\" file, too.  Enjoy!!</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\"><br /></span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">    El Edwards</span></div><div class=\"separator\" style=\"clear: both;\"><br /></div><div class=\"separator\" style=\"clear: both;\">You can hear all three original files below.</div><div class=\"separator\" style=\"clear: both;\"><br /></div>\n  \n  <iframe allow=\"autoplay\" frameborder=\"no\" height=\"166\" scrolling=\"no\" src=\"https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/1953136867&color=%23ff5500&auto_play=false&hide_related=false&show_comments=true&show_user=true&show_reposts=false&show_teaser=true\" width=\"100%\"></iframe><div style=\"color: #cccccc; font-family: Interstate, \"Lucida Grande\", \"Lucida Sans Unicode\", \"Lucida Sans\", Garuda, Verdana, Tahoma, sans-serif; font-size: 10px; font-weight: 100; line-break: anywhere; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; word-break: normal;\"><a href=\"https://soundcloud.com/john-graham-cumming\" style=\"color: #cccccc; text-decoration: none;\" target=\"_blank\" title=\"John Graham-Cumming\">John Graham-Cumming</a> · <a href=\"https://soundcloud.com/john-graham-cumming/mail-classified-by-popfile\" style=\"color: #cccccc; text-decoration: none;\" target=\"_blank\" title=\"Mail classified by POPFile\">Mail classified by POPFile</a></div>\n  \n  <iframe allow=\"autoplay\" frameborder=\"no\" height=\"166\" scrolling=\"no\" src=\"https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/1953162831&color=%23ff5500&auto_play=false&hide_related=false&show_comments=true&show_user=true&show_reposts=false&show_teaser=true\" width=\"100%\"></iframe><div style=\"color: #cccccc; font-family: Interstate, \"Lucida Grande\", \"Lucida Sans Unicode\", \"Lucida Sans\", Garuda, Verdana, Tahoma, sans-serif; font-size: 10px; font-weight: 100; line-break: anywhere; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; word-break: normal;\"><a href=\"https://soundcloud.com/john-graham-cumming\" style=\"color: #cccccc; text-decoration: none;\" target=\"_blank\" title=\"John Graham-Cumming\">John Graham-Cumming</a> · <a href=\"https://soundcloud.com/john-graham-cumming/use-the-source-luke\" style=\"color: #cccccc; text-decoration: none;\" target=\"_blank\" title=\"Use the source, Luke!\">Use the source, Luke!</a></div>\n  \n  <iframe allow=\"autoplay\" frameborder=\"no\" height=\"166\" scrolling=\"no\" src=\"https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/1953163075&color=%23ff5500&auto_play=false&hide_related=false&show_comments=true&show_user=true&show_reposts=false&show_teaser=true\" width=\"100%\"></iframe><div style=\"color: #cccccc; font-family: Interstate, \"Lucida Grande\", \"Lucida Sans Unicode\", \"Lucida Sans\", Garuda, Verdana, Tahoma, sans-serif; font-size: 10px; font-weight: 100; line-break: anywhere; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; word-break: normal;\"><a href=\"https://soundcloud.com/john-graham-cumming\" style=\"color: #cccccc; text-decoration: none;\" target=\"_blank\" title=\"John Graham-Cumming\">John Graham-Cumming</a> · <a href=\"https://soundcloud.com/john-graham-cumming/youve-got-mail-john\" style=\"color: #cccccc; text-decoration: none;\" target=\"_blank\" title=\"You've got mail, John!\">You've got mail, John!</a></div></div></div>",
      "image": {
        "url": "https://img.youtube.com/vi/yKgiqsdyiAA/default.jpg",
        "title": null
      },
      "media": [],
      "authors": [
        {
          "name": "Unknown",
          "email": "[email protected]",
          "url": null
        }
      ],
      "categories": [
        {
          "label": "popfile",
          "term": "popfile",
          "url": "http://www.blogger.com/atom/ns#"
        },
        {
          "label": "pseudo-randomness",
          "term": "pseudo-randomness",
          "url": "http://www.blogger.com/atom/ns#"
        }
      ]
    },
    {
      "id": "tag:blogger.com,1999:blog-19303585.post-1064951669793470512",
      "title": "Rabbit hole: stumbling across two Portuguese punched cards",
      "description": null,
      "url": "http://blog.jgc.org/2024/10/rabbit-hole-stumbling-across-two.html",
      "published": "2024-10-08T17:13:00.001Z",
      "updated": "2024-10-08T17:13:00.110Z",
      "content": "<p>Look, here's the thing, I don't like mysteries that involve technology. I think I hate them because I know that some other human created the thing I'm staring at and, dammit, I should be able to understand it. </p><p>And, then one day I was browsing in one of those places where people leave books for others to take. I flipped through an old Portuguese book about computers published in the 1970s and two punched cards fell out.</p><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzBivbRxiU1_S2lVCnPEW6QHF5ZZwXoDF7ODp9vST3nLSOd5cLjto0enI9RiFWSi2WE3iey6pNOhn03neYX5j7JsNjCuvTpyak6WxwJXbEAfa2OILkjlQh7aNSJQGjV_iVKzQbuMvmCHBmWFEc0Gqawtgm5suMfq5CESmvSiDFxwjGgX2_7NST9A/s3078/punch-1.jpg\" imageanchor=\"1\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"2840\" data-original-width=\"3078\" height=\"590\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzBivbRxiU1_S2lVCnPEW6QHF5ZZwXoDF7ODp9vST3nLSOd5cLjto0enI9RiFWSi2WE3iey6pNOhn03neYX5j7JsNjCuvTpyak6WxwJXbEAfa2OILkjlQh7aNSJQGjV_iVKzQbuMvmCHBmWFEc0Gqawtgm5suMfq5CESmvSiDFxwjGgX2_7NST9A/w640-h590/punch-1.jpg\" width=\"640\" /></a></div><p>Nerd. Sniped. By. Gravity.</p><p>One punched card contains the data <span style=\"font-family: courier;\">M000015 JOAO A. FERNANDES 150000190</span> and the other <span style=\"font-family: courier;\">1000015 100170476</span>. OK, so <span style=\"font-family: courier;\">000015</span> is probably some sort of identifier (employee ID?) but the other numbers are a mystery. Could they be Portuguese <a href=\"https://pt.wikipedia.org/wiki/N%C3%BAmero_de_identifica%C3%A7%C3%A3o_fiscal\">tax identification numbers</a> (NIFs)? Those start with 1, 2 or 3 (for individuals) and are nine digits.</p><p>Nope. I wrote some <a href=\"https://gist.github.com/jgrahamc/ae5b030be5cdffb424d1ae126023190f\">code to verify the NIF's</a> check digit and both aren't NIFs. </p><p><span style=\"font-family: courier;\">use strict;<br />use warnings;<br />sub nif_check {<br />    my ($nif) = @_;<br />    my $check = 0;<br />    foreach my $i (reverse 0..7) {<br />        $check += substr($nif, $i, 1) * (9-$i);<br />    }<br />    $check %= 11;<br />    if ($check < 2) {<br />        $check = 0;<br />    } else {<br />        $check = 11 - $check;<br />    }<br /><br />    print \"$nif $check\\n\";<br />}<br /><br />nif_check($ARGV[0]);</span></p><p><span style=\"font-family: courier;\">$ perl nif.pl 100170476<br />100170476 1<br />$ perl nif.pl 150000190<br />150000190 7</span></p><p>So what's encoded on these cards? And does <span style=\"font-family: courier;\">000015</span> mean they are related?</p><p>I found the answer starting with the fact that these punched cards are custom printed with the letters <b>In Es Me</b> on them. What's In Es Me? It took a while to answer that, but it turns out that In Es Me was a business called \"Instituto de Estudos Mecanográficos\" based in Lisbon in the late 1960s and early 1970s. </p><p>It appears to have been a school that taught people the exciting new world of computing, which, they claim in their advertisements was \"Uma profissão actual e rentavel\" (A modern and profitable profession) and also \"Uma das profissões de melhor futuro\" (One of the professions with a great future).</p><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8m_FT4M0kIoM5N7QKWv35i1FFYfvugT3Fn9MxknuRbKMdsWnwSneClbVdDCxhbIsTPYicsZmaD-pCLKvjZnxkPNcismZaqlIK7jAGKUsuzg_v2lu1DoclTwScNf0UicI-8EkGgFlr1w-EGVqDr0VZiM0MDEvEyryRHAlUR9LYWqBjqHQZz9E5Dg/s1230/punch-4.jpeg\" imageanchor=\"1\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"666\" data-original-width=\"1230\" height=\"216\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8m_FT4M0kIoM5N7QKWv35i1FFYfvugT3Fn9MxknuRbKMdsWnwSneClbVdDCxhbIsTPYicsZmaD-pCLKvjZnxkPNcismZaqlIK7jAGKUsuzg_v2lu1DoclTwScNf0UicI-8EkGgFlr1w-EGVqDr0VZiM0MDEvEyryRHAlUR9LYWqBjqHQZz9E5Dg/w400-h216/punch-4.jpeg\" width=\"400\" /></a></div><br /><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-RLe3aytS2tESLnotW85eYivXA-ox4Ol7kwkzv2XLAJ-XILpuyW_TYMUMvjs7pXmDyeow2DGeVlg-sa_baJiUSDuT1CNcpT8LN6e3SCrk2w3V_nJfABqLpAfe0XKOXK-GzX_veURmCXVEMHmvcpHYanXOamhNfddnJiQ_WskW04gdpsdTNjb27g/s630/punch-3.jpeg\" imageanchor=\"1\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"306\" data-original-width=\"630\" height=\"194\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-RLe3aytS2tESLnotW85eYivXA-ox4Ol7kwkzv2XLAJ-XILpuyW_TYMUMvjs7pXmDyeow2DGeVlg-sa_baJiUSDuT1CNcpT8LN6e3SCrk2w3V_nJfABqLpAfe0XKOXK-GzX_veURmCXVEMHmvcpHYanXOamhNfddnJiQ_WskW04gdpsdTNjb27g/w400-h194/punch-3.jpeg\" width=\"400\" /></a></div><br /><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjl2CF-LCR2xi5kQWLmm3C_ON-ojZVXu7ZvKPrIqkHYWwR416VTa54HEcwLDopBCQuEumuThhbw3rtv3GOrxcmYf7kfqyRAuOOvtrwnw2RbPqS5l0l5Q8PQZr71QFGvDWhb1F8VjIJTAHbf-BExcjTIUq5IlfSftu_KyrmuXHBHVGZmtgIDSDDbnQ/s852/punch-2.jpeg\" imageanchor=\"1\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"852\" data-original-width=\"766\" height=\"400\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjl2CF-LCR2xi5kQWLmm3C_ON-ojZVXu7ZvKPrIqkHYWwR416VTa54HEcwLDopBCQuEumuThhbw3rtv3GOrxcmYf7kfqyRAuOOvtrwnw2RbPqS5l0l5Q8PQZr71QFGvDWhb1F8VjIJTAHbf-BExcjTIUq5IlfSftu_KyrmuXHBHVGZmtgIDSDDbnQ/w360-h400/punch-2.jpeg\" width=\"360\" /></a></div><div><br /></div>Great, but apparently no closer to knowing about João A. Fernandes and those numbers. But then I discovered someone selling a book called \"Introdução aos Ordenadores\" (Introduction to Computers) which was apparently distributed by In Es Me exclusively in Portugal:<div><br /></div><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXU8N7ORFPdX4xEXGOsz2nYf358cooye4NcrfF6PbzJr_ggkGZ2h7Mtd5E_VIwPKvXuRvuW7SBwEpmma9gqF8z3eU1nPDKTkIG3omQnvA-DugK_x8GcJxHyX650JYeuE3u2Vn8LJD14U8tR0ZABIo6xvwmQDw5kO38xmUTU6mqnSIaqovj2uVMYg/s4032/punch-6.jpg\" imageanchor=\"1\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"4032\" data-original-width=\"3024\" height=\"640\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXU8N7ORFPdX4xEXGOsz2nYf358cooye4NcrfF6PbzJr_ggkGZ2h7Mtd5E_VIwPKvXuRvuW7SBwEpmma9gqF8z3eU1nPDKTkIG3omQnvA-DugK_x8GcJxHyX650JYeuE3u2Vn8LJD14U8tR0ZABIo6xvwmQDw5kO38xmUTU6mqnSIaqovj2uVMYg/w480-h640/punch-6.jpg\" width=\"480\" /></a></div><br /><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeh-we5W8BMwW8pmeOW94gzR9GEIjQEEMBD-zEKMbzkDCNCZvECrELW8IRNk-jJryVToQWwOLdHcc7CKeQ4QlNPVswhgwfOjXcOTuIWOpqwVcKnW9A3PBUFoGssqGxBinzX6d5K_016e2OgKzs-R3vnI845KgkG24Kz9gtwXvLds9g2flhSrOHKg/s5712/punch-5.jpg\" imageanchor=\"1\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"5712\" data-original-width=\"4284\" height=\"640\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeh-we5W8BMwW8pmeOW94gzR9GEIjQEEMBD-zEKMbzkDCNCZvECrELW8IRNk-jJryVToQWwOLdHcc7CKeQ4QlNPVswhgwfOjXcOTuIWOpqwVcKnW9A3PBUFoGssqGxBinzX6d5K_016e2OgKzs-R3vnI845KgkG24Kz9gtwXvLds9g2flhSrOHKg/w480-h640/punch-5.jpg\" width=\"480\" /></a></div><br /><div><div>So, I bought it. And, inside that book on page 1-31, are the very two cards that had fallen from that other book. So, it looks like the cards were examples (perhaps from the training course) drawn from the book.</div><div><br /></div><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZrf73Ed4Avxgr_9RV79RNbKvGjSXf-iexlqOcB0bvRQKWyVow3DINJwVX8p3WIplqk73QFV1TMrLOJpqGRpo-YIOFwQUEXgBVcRIUHDNVhcp6xqmOQyWld1pnyxozzflq8_5Xq_kk29yTieFw7_cVBzcFPYPSMfA1xNs5CDvuGXWwSmfQdZlTXQ/s5234/punch-7.jpg\" imageanchor=\"1\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"5234\" data-original-width=\"3691\" height=\"640\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZrf73Ed4Avxgr_9RV79RNbKvGjSXf-iexlqOcB0bvRQKWyVow3DINJwVX8p3WIplqk73QFV1TMrLOJpqGRpo-YIOFwQUEXgBVcRIUHDNVhcp6xqmOQyWld1pnyxozzflq8_5Xq_kk29yTieFw7_cVBzcFPYPSMfA1xNs5CDvuGXWwSmfQdZlTXQ/w452-h640/punch-7.jpg\" width=\"452\" /></a></div><div class=\"separator\" style=\"clear: both; text-align: center;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: left;\">The cards in the book are life size:</div><div class=\"separator\" style=\"clear: both; text-align: left;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpwQYe9LvFc7uzX6lW4OzRkqXkx3FpYpWzA0jG7U_VDRpArC2BqnUPx9sPgMlS7ZI3KHVr8WWAO5k78LRL3IULTmJMj8Cs3JwI3Xoo8AeWm1iu_q10YoEspqsiVyfTEDzPGYBegcsziTWZV1_pcgY0aXws_HGtBXKIA6xiF8w3IC_vKBy-7rt-Iw/s4610/punch-8.jpg\" imageanchor=\"1\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"4610\" data-original-width=\"3271\" height=\"640\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpwQYe9LvFc7uzX6lW4OzRkqXkx3FpYpWzA0jG7U_VDRpArC2BqnUPx9sPgMlS7ZI3KHVr8WWAO5k78LRL3IULTmJMj8Cs3JwI3Xoo8AeWm1iu_q10YoEspqsiVyfTEDzPGYBegcsziTWZV1_pcgY0aXws_HGtBXKIA6xiF8w3IC_vKBy-7rt-Iw/w454-h640/punch-8.jpg\" width=\"454\" /></a></div><div class=\"separator\" style=\"clear: both; text-align: center;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: left;\">(Can you spot the printing error in the book?)</div><div class=\"separator\" style=\"clear: both; text-align: left;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: left;\">The good news is that the previous pages describe the numbers on those cards via the columns.</div><div class=\"separator\" style=\"clear: both; text-align: left;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: left;\"><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeAG9H-07UPNWYixd240URv8eQejewiZey_vn0iDqgio26o6M6DNssD_X36aX3-sDMH4k4T-92hk4GK6xeQLnGD-6y4W5CKsfEOOEniK9v5SgkEYE-1aA8PKipvjhkWUCf15gIRvMR8yeN_ov6Oac_WDkg9zFo4nv2wSswDhspGL4GZe9gqEgYmA/s5087/punch-9.jpg\" imageanchor=\"1\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"5087\" data-original-width=\"3481\" height=\"640\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeAG9H-07UPNWYixd240URv8eQejewiZey_vn0iDqgio26o6M6DNssD_X36aX3-sDMH4k4T-92hk4GK6xeQLnGD-6y4W5CKsfEOOEniK9v5SgkEYE-1aA8PKipvjhkWUCf15gIRvMR8yeN_ov6Oac_WDkg9zFo4nv2wSswDhspGL4GZe9gqEgYmA/w438-h640/punch-9.jpg\" width=\"438\" /></a></div><div class=\"separator\" style=\"clear: both; text-align: center;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: left;\">Card code: column 1 (1)</div><div class=\"separator\" style=\"clear: both; text-align: left;\">Employee number: columns 2 to 7</div><div class=\"separator\" style=\"clear: both; text-align: left;\">Payment period: columns 33 to 38</div><div class=\"separator\" style=\"clear: both; text-align: left;\">Total hours worked: columns: 39 to 41</div><br /></div><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXAtxo9_Q37ToY1oobyRHIX2jjCdb998xwA-ps-vH9efs6haiEfeV3H8wwzOfFUNI4zqZQPiNYzm_TGWNbuW-yhbO_q7AXws1XHTWhdKR164stDbyuIo8EXHHc1lHtU5HlCdup4n7sJRpFYPt9dMcme1Ua4-5YY_HY25EXDDgIIENo19pTwiT0eg/s3518/punch-10.jpg\" imageanchor=\"1\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"2792\" data-original-width=\"3518\" height=\"318\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXAtxo9_Q37ToY1oobyRHIX2jjCdb998xwA-ps-vH9efs6haiEfeV3H8wwzOfFUNI4zqZQPiNYzm_TGWNbuW-yhbO_q7AXws1XHTWhdKR164stDbyuIo8EXHHc1lHtU5HlCdup4n7sJRpFYPt9dMcme1Ua4-5YY_HY25EXDDgIIENo19pTwiT0eg/w400-h318/punch-10.jpg\" width=\"400\" /></a></div><div class=\"separator\" style=\"clear: both; text-align: center;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: left;\">For the other card...</div><div class=\"separator\" style=\"clear: both; text-align: left;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: left;\">Card code: column 1 (M)</div><div class=\"separator\" style=\"clear: both; text-align: left;\">Employee number: columns 2 to 7</div><div class=\"separator\" style=\"clear: both; text-align: left;\">Name: columns: 8 to 32</div><div class=\"separator\" style=\"clear: both; text-align: left;\">Hourly salary: 42 to 46</div><div class=\"separator\" style=\"clear: both; text-align: left;\">Fixed discounts for the week: columns 47 to 50</div><div class=\"separator\" style=\"clear: both; text-align: center;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: left;\">So, <span style=\"font-family: courier;\">000015</span> is the employee number. <span style=\"font-family: courier;\">150000190</span> indicates that João A. Fernandes is paid 15$000 (15 <a href=\"https://en.wikipedia.org/wiki/Portuguese_escudo\">Portuguese escudos</a>) per hour and there's a weekly discount (deductions from the salary) of 0$190. Note that for historical reasons sometimes the escudo is written with a three digit decimal, and because earlier on the book we're introduced to João and his colleagues I know that's the format being used.</div><div class=\"separator\" style=\"clear: both; text-align: left;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgd3f_5eQUKrs5eUTIcpV9oLLfcQV5HISZ853B-d9ZPHcfVmcKSDqG2m1VQpOTK2_iCT20XvRZdy96t6rWIuiHI1Ab14g_TdYGnQExe5s4y3cE1sih9ALpZJk58Db9txKhDGETzYclCG-qtjtEymKJwtL5d0UN_xeZ-ESP1XdVqthvDgeCM6WPkVw/s5054/punch15.jpg\" imageanchor=\"1\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"5054\" data-original-width=\"3122\" height=\"640\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgd3f_5eQUKrs5eUTIcpV9oLLfcQV5HISZ853B-d9ZPHcfVmcKSDqG2m1VQpOTK2_iCT20XvRZdy96t6rWIuiHI1Ab14g_TdYGnQExe5s4y3cE1sih9ALpZJk58Db9txKhDGETzYclCG-qtjtEymKJwtL5d0UN_xeZ-ESP1XdVqthvDgeCM6WPkVw/w396-h640/punch15.jpg\" width=\"396\" /></a></div><div class=\"separator\" style=\"clear: both; text-align: left;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: left;\">The other card is a record of his hours worked for a specific week: <span style=\"font-family: courier;\">100170476</span>. 10-01-70 is January 10, 1970 and indicates the week for which the record is generated. 476 is 47.6 hours of work.</div><br />Mystery solved.</div><div><br /></div><div>Well, almost, In Es Me didn't write this book. If you look at the title page it was apparently created by \"ENIASA\" and I've found very little information about who they were. Oh well.</div><div><br /></div><div>PS Here's a little taste of what the book contains:</div><div><br /></div><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkoFgmwAZ0StQ5B8q5o4oVbwDKO62Mo_BfRVmk98XxYqqRiR8CEd3bcdczHO6XDKYavK_dVkPwmpnJ0xqY8l-N7mFglDe8ef4FpHTNN7k1AEbLWS1hAdcS_1PyG870QHZ4Sh4e-hAHyBwj0SfyX8R1sEWSKXY_NenosKG0OhYjK0rxsFV05HQH7A/s5712/punch-14.jpeg\" imageanchor=\"1\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"4060\" data-original-width=\"5712\" height=\"454\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkoFgmwAZ0StQ5B8q5o4oVbwDKO62Mo_BfRVmk98XxYqqRiR8CEd3bcdczHO6XDKYavK_dVkPwmpnJ0xqY8l-N7mFglDe8ef4FpHTNN7k1AEbLWS1hAdcS_1PyG870QHZ4Sh4e-hAHyBwj0SfyX8R1sEWSKXY_NenosKG0OhYjK0rxsFV05HQH7A/w640-h454/punch-14.jpeg\" width=\"640\" /></a></div><br /><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXjXXPuZ8x2RetLBJskjkTdl0kn8smvcv5q30loiD3FzodXI9LgyyW8XWpMzg5bEITMvA0BnvJhyphenhyphenpUHQ3_Dm-eqaLyQJRuYBAXlXz-1FR0W78-cCuFePlr_bCIgjjamIKiSOyOoBAnS_9ONEV1sw_uiEgeNChzpe61BLKqvZzW6E8nD4zOE-wudg/s5712/punch-13.jpeg\" imageanchor=\"1\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"4183\" data-original-width=\"5712\" height=\"468\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXjXXPuZ8x2RetLBJskjkTdl0kn8smvcv5q30loiD3FzodXI9LgyyW8XWpMzg5bEITMvA0BnvJhyphenhyphenpUHQ3_Dm-eqaLyQJRuYBAXlXz-1FR0W78-cCuFePlr_bCIgjjamIKiSOyOoBAnS_9ONEV1sw_uiEgeNChzpe61BLKqvZzW6E8nD4zOE-wudg/w640-h468/punch-13.jpeg\" width=\"640\" /></a></div><br /><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhac3KjmhSkfSNrG1zG26FdtdPC26UcGnF87JY5UTbSSwtxGUhHcVpQqvNWpKFMnTlDdVDlnjBdEsfeMCiQHN55tM8V0z9X6p8LrXXOmaKTDu05PHfbIL-ICVEIUji3L6YSOQkYRjburNah_ccyj-dSnCKS0_PxGWw_6B_fIOb7G1l0R8m5fCn7IA/s5712/punch-12.jpeg\" imageanchor=\"1\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"4284\" data-original-width=\"5712\" height=\"480\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhac3KjmhSkfSNrG1zG26FdtdPC26UcGnF87JY5UTbSSwtxGUhHcVpQqvNWpKFMnTlDdVDlnjBdEsfeMCiQHN55tM8V0z9X6p8LrXXOmaKTDu05PHfbIL-ICVEIUji3L6YSOQkYRjburNah_ccyj-dSnCKS0_PxGWw_6B_fIOb7G1l0R8m5fCn7IA/w640-h480/punch-12.jpeg\" width=\"640\" /></a></div><br /><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEik6-BEDP69FxkQKRGFglUbF9hlkKOkZhWY-y0J89-hzohN7iJ5tOWJgPJ7sCp6KmMg4vtTOwUwXemxPM07Tiea4PizR8vIeDdYf2D_35dFmN-RauE2LP8NcNyn-kFeedi9B1H27gVeHt5zL0TTLQJvF1Q6_knCcUjyWGJtnssAztUGS09GnEeDZQ/s5712/punch-11.jpeg\" imageanchor=\"1\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"4284\" data-original-width=\"5712\" height=\"480\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEik6-BEDP69FxkQKRGFglUbF9hlkKOkZhWY-y0J89-hzohN7iJ5tOWJgPJ7sCp6KmMg4vtTOwUwXemxPM07Tiea4PizR8vIeDdYf2D_35dFmN-RauE2LP8NcNyn-kFeedi9B1H27gVeHt5zL0TTLQJvF1Q6_knCcUjyWGJtnssAztUGS09GnEeDZQ/w640-h480/punch-11.jpeg\" width=\"640\" /></a></div><div><div class=\"separator\" style=\"clear: both; text-align: left;\"><br /></div></div>",
      "image": {
        "url": "https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzBivbRxiU1_S2lVCnPEW6QHF5ZZwXoDF7ODp9vST3nLSOd5cLjto0enI9RiFWSi2WE3iey6pNOhn03neYX5j7JsNjCuvTpyak6WxwJXbEAfa2OILkjlQh7aNSJQGjV_iVKzQbuMvmCHBmWFEc0Gqawtgm5suMfq5CESmvSiDFxwjGgX2_7NST9A/s72-w640-h590-c/punch-1.jpg",
        "title": null
      },
      "media": [],
      "authors": [
        {
          "name": "Unknown",
          "email": "[email protected]",
          "url": null
        }
      ],
      "categories": [
        {
          "label": "pseudo-randomness",
          "term": "pseudo-randomness",
          "url": "http://www.blogger.com/atom/ns#"
        }
      ]
    },
    {
      "id": "tag:blogger.com,1999:blog-19303585.post-522901623747231800",
      "title": "I made a rubbish clock",
      "description": null,
      "url": "http://blog.jgc.org/2024/09/i-made-rubbish-clock.html",
      "published": "2024-09-27T20:25:00.004Z",
      "updated": "2024-12-28T15:56:23.852Z",
      "content": "<p>With separate plastic, metal, paper, and glass recycling, composting, and pick up of all the rest, knowing which days to put out which bins can be complicated. Some have turned to high-tech solutions like Darren Tarbard's wonderful \"<a href=\"https://x.com/tarbard/status/1002464120447397888\">bindicator</a>\".</p><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://x.com/tarbard/status/1002464120447397888\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"835\" data-original-width=\"900\" height=\"371\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisozadvkoI9CxySkzJNcnOY_o2vZNWnv2gonXZ-K3eYn24dsIy5j7DoEHNxNShAVd-OBqk1PUMGRqJvSdmOs10lTHYGTlCgYz7uqOjXD_vf57eKTbMPeedRuCETBjUWnp-Sh9mIDxK0vMqp_va2txelYdG8f_9Yem8IweeCIQlhclFQi7HwOIlNA/w400-h371/Del3rp-WsAES2IE.jpg\" width=\"400\" /></a></div><p>There's even a <a href=\"https://www.bindicator.net/\">commercial version</a> of that.</p><p>I thought about making something similar, but decided that a high-tech solution isn't always the right one. Instead I made a clock, or rather a clock face. My rationale was as follows: the bin days don't change frequently so no need to call an API to get them, and anyway most councils don't have an API for this sort of thing. Also, I really didn't want yet another thing with a wall wart, or WiFi to configure, or code to debug (there comes a time in every programmer's life when they can't face debugging yet another thing that should be simple and just work). </p><p>Not everything needs to be Turing Complete! But you can buy cheap clock mechanisms where the hand go full circle in seven days instead of 12 hours. Something like <a href=\"https://www.youngtownco.com/en/product-496882/7-Days-Week-Clock-Movement-12888SDWK.html\">this</a>. </p><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsdpeNHoK98X_LNj45s4b71ULFC-yEBbTAAC5Dt3Mp6jfwfE6FnMHw80boTFqBF1pbTeDye9C8S6fY-UAQfjlk0uxJj_o7-9RsoB5psG_mMfG5EhI7H5QpwQ4w_cPgtL95VIpBKSzb75r3aXV7BBPcPAbuqUzUwif5uxm-LFQZJofvnmctDB9uVQ/s508/lixo-2.jpg\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"500\" data-original-width=\"508\" height=\"315\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsdpeNHoK98X_LNj45s4b71ULFC-yEBbTAAC5Dt3Mp6jfwfE6FnMHw80boTFqBF1pbTeDye9C8S6fY-UAQfjlk0uxJj_o7-9RsoB5psG_mMfG5EhI7H5QpwQ4w_cPgtL95VIpBKSzb75r3aXV7BBPcPAbuqUzUwif5uxm-LFQZJofvnmctDB9uVQ/s320/lixo-2.jpg\" width=\"320\" /></a></div><p>So, I wrote a bunch of code to produce an SVG (and PDF and PNG) for the clock face. The code is <a href=\"https://github.com/jgrahamc/lixo\">here</a>. You end up with something like this which can be printed.</p><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi50DJtFU-77BZVN0Zidd-1XHQNnQqwL2EDdX6sPvxlJgWOj2OvrzHjcoNZk7-GoxbPrFlcoTH6ijQ7Jrtp5vk3v7Vedt9JAH-3Rd7yzPGY427oDsqkrinfduN0NJb02z2dDsM91tR-xxAianznNcIVOr50eIedZmBL_XVlhVpwApRi2PEPPU7i4g/s2362/lixo.png\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"2362\" data-original-width=\"2362\" height=\"400\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi50DJtFU-77BZVN0Zidd-1XHQNnQqwL2EDdX6sPvxlJgWOj2OvrzHjcoNZk7-GoxbPrFlcoTH6ijQ7Jrtp5vk3v7Vedt9JAH-3Rd7yzPGY427oDsqkrinfduN0NJb02z2dDsM91tR-xxAianznNcIVOr50eIedZmBL_XVlhVpwApRi2PEPPU7i4g/w400-h400/lixo.png\" width=\"400\" /></a></div><div class=\"separator\" style=\"clear: both; text-align: center;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: center;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: left;\">The colours and wording are all determined by the <span style=\"font-family: courier;\">schd</span> and <span style=\"font-family: courier;\">bins</span> variables. The code should be easy to customize for your location's schedule. It supports up to two different bin types per day. If you need more you'll have to modify the code.</div><div class=\"separator\" style=\"clear: both; text-align: left;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: left;\"><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\"><span>    </span>bins = {</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">    <span>    </span>\"none\": [\"white\", \"\"],</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">    <span>    </span>\"lixo\": [\"#72859E\", \"Lixo\"],</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">    <span>    </span>\"papl\": [\"#255FC9\", \"Papel\"],</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">    <span>    </span>\"embl\": [\"#DED044\", \"Embalagens\"],</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\"><span>    </span>}</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\"><br /></span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\"><span>    </span>days = [\"Sun\", \"Mon\", \"Tues\", \"Wednes\", \"Thurs\", \"Fri\", \"Satur\"]</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\"><span>    </span>schd = [[\"none\"],</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">    <span>    </span>    [\"lixo\"],</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">        <span>    </span>[\"papl\", \"embl\"],</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">      <span>    </span>  [\"lixo\"],</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">       <span>    </span> [\"papl\"],</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">        <span>    </span>[\"lixo\", \"embl\"],</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">        <span>    </span>[\"papl\"]]</span></div><div class=\"separator\" style=\"clear: both;\"><br /></div><div class=\"separator\" style=\"clear: both;\">There's no need for you to use Portuguese; I have because I'm dealing with Portuguese rubbish collection.</div><div class=\"separator\" style=\"clear: both;\"><br /></div><div class=\"separator\" style=\"clear: both;\">The only interesting piece of code is the generation of the curves for the seven daily segments (and also for the curved wording). This is done by the function <span style=\"font-family: courier;\">path</span>:</div><div class=\"separator\" style=\"clear: both;\"><br /></div><div class=\"separator\" style=\"clear: both;\"><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\"><span>    </span>def getXY(p, r, s):</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">    <span>    </span>a = 2.0 * math.pi * (p * pps + rot)</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">    <span>    </span>return s % (r * math.cos(a),</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">        <span>    </span>        r * math.sin(a))</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\"><br /></span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\"><span>    </span>def path(p, r):</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">    <span>    </span>s = \" %.2f %.2f \"</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">    <span>    </span>pa = \"M\"</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">    <span>    </span>pa += getXY(p, r, s)</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">    <span>    </span>pa += \"A %.2f %.2f 0 0 1\" % (r, r)</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">    <span>    </span>pa += getXY((p+1), r, s)</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">    <span>    </span>return pa</span></div><div class=\"separator\" style=\"clear: both;\"><br /></div><div class=\"separator\" style=\"clear: both;\">In SVG you can define a <a href=\"https://developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Paths\">path</a> element which can be used to make all sorts of curves, arcs, and lines. My <span style=\"font-family: courier;\">path</span> function takes two parameters: <span style=\"font-family: courier;\">p</span> is a number between zero and six representing the seven daily segments needed on the clock; <span style=\"font-family: courier;\">r</span> is the radius of the arc. The function uses <span style=\"font-family: courier;\">getXY</span> to find the position of a point on the arc. It does this twice to find the start and end point. </div><div class=\"separator\" style=\"clear: both;\"><br /></div><div class=\"separator\" style=\"clear: both;\">So, path ends up returning something like <span style=\"font-family: courier;\">M x0 y0 A r r 0 0 1 x1 y1</span> where <span style=\"font-family: courier;\">x0</span>, <span style=\"font-family: courier;\">y0</span>, <span style=\"font-family: courier;\">x1</span>, <span style=\"font-family: courier;\">y1</span> are the calculated end points of the arc and <span style=\"font-family: courier;\">r</span> is the radius of the arc. The <span style=\"font-family: courier;\">M x0 y0</span> means \"move to (<span style=\"font-family: courier;\">x0</span>, <span style=\"font-family: courier;\">y0</span>)\" The <span style=\"font-family: courier;\">A r r 0 0 1 x1 y1</span> means \"draw an <a href=\"https://www.w3.org/TR/SVG/paths.html#PathDataEllipticalArcCommands\">arc</a> of radius r to the point (<span style=\"font-family: courier;\">x1</span>, <span style=\"font-family: courier;\">y1</span>)\". The <span style=\"font-family: courier;\">0 0 1</span> in the middle correspond to three parameters: x-axis-rotation, large-arc-flag, and sweep-flag; it's best to refer to the documentation for those because they determine the direction in which the arc points and whether it is rotated.</div><div class=\"separator\" style=\"clear: both;\"><br /></div><div class=\"separator\" style=\"clear: both;\">The final part of the path SVG element, <span style=\"font-family: courier;\">L 0 0</span>, is added elsewhere in the code. It sets the centre of the arc at (<span style=\"font-family: courier;\">0</span>, <span style=\"font-family: courier;\">0</span>). I used the <span style=\"font-family: courier;\">viewBox</span> attribute of the SVG to make the SVG geometry be between (<span style=\"font-family: courier;\">-1</span>, <span style=\"font-family: courier;\">-1</span>) and (<span style=\"font-family: courier;\">1</span>, <span style=\"font-family: courier;\">1</span>) thus making the centre of the image (<span style=\"font-family: courier;\">0</span>, <span style=\"font-family: courier;\">0</span>).  <br /><br /><span style=\"font-family: courier;\"><span>    </span>print('<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-1 -1 2 2\" width=\"%s\" height=\"%s\">' % (wh, wh))</span></div><div class=\"separator\" style=\"clear: both;\"><br /></div><div class=\"separator\" style=\"clear: both;\">Armed with a suitable printed clock face, I got a simple square picture frame, a few bits of wood for spacers, and put it all together into a \"rubbish clock\".</div></div><div class=\"separator\" style=\"clear: both;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: center;\"><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://flyingtiger.com/pt-pt/products/black-picture-frame-20x20-cm-3034806\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"1200\" data-original-width=\"1200\" height=\"640\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjLt5yQO3Yskdk8xTXFjHTL_PwvbRm5PmqrTMMXHrTnaEuCPRsnqrvgGzb_qs6pPHiK_pfsHZSgzQoYuPfbu1mUZoLuhyphenhyphenDGyedf_kURe3UIPm1TRJPhewAKwHSRTWWw9pLQwtn0XJspWp_m-ogVQv0oPDMvs9le2MBGPkKglSaXkSzlpuYV7oXcA/w640-h640/lixo-4.webp\" width=\"640\" /></a></div><br /><a href=\"https://flyingtiger.com/pt-pt/products/black-picture-frame-20x20-cm-3034806\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"1200\" data-original-width=\"1200\" height=\"640\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixHHRXpURAEsmK_bYXaQyR8iLSGK14efmCSbFsmie4tRUsvd9kZzzk9ZiOy79k9TDl5t4PRcRhyqwFXU0qlhdmnMfiWLguPb8mszXhjrcpMxhtBvp0ecFu7GPL7UiPDq8Xzl8usb0LuKuJIQzZd7a08DYdPJvNIdK2fub3Fixs09_G0CqPAMG8JA/w640-h640/lixo-3.webp\" width=\"640\" /></a></div><div class=\"separator\" style=\"clear: both; text-align: center;\"><br /></div><table align=\"center\" cellpadding=\"0\" cellspacing=\"0\" class=\"tr-caption-container\" style=\"margin-left: auto; margin-right: auto;\"><tbody><tr><td style=\"text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpj8fOLwk9PArF_K9sUwkYhSCZVRmwC7xmI-wvs32RetBhwFdTOzRdFOzDg6gXEn-taEu3SQW5hJz78Zrkryl5x5ReEr9iexphsiMabORQfh4BqLzNWzkgVhbcF5zNMWeTbWikEwyPkhbaZwFtQBy6_TMFOz-ZH48-owPvbaUZaeyGWnrWACnR1g/s1200/lixo-5.jpg\" style=\"margin-left: auto; margin-right: auto;\"><img border=\"0\" data-original-height=\"1200\" data-original-width=\"1200\" height=\"640\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpj8fOLwk9PArF_K9sUwkYhSCZVRmwC7xmI-wvs32RetBhwFdTOzRdFOzDg6gXEn-taEu3SQW5hJz78Zrkryl5x5ReEr9iexphsiMabORQfh4BqLzNWzkgVhbcF5zNMWeTbWikEwyPkhbaZwFtQBy6_TMFOz-ZH48-owPvbaUZaeyGWnrWACnR1g/w640-h640/lixo-5.jpg\" width=\"640\" /></a></td></tr><tr><td class=\"tr-caption\" style=\"text-align: center;\"><br /></td></tr></tbody></table><br /></div><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvTpcZoantZ16120z-lQK12YKhHkbb_lXVQEdznDiWKicX4J4EoD4yaibwH_iROLsHVCkeh4qti2xmslW-u5Qy96-5OkdfmK_l4-bpLHcezEPtQyNkR-9NuW9ZNDwVHRSO91S1kQZTHPtXZdQdcaFCxWSQFLwLz8y-NFx5oT2AMLi3SqVEzQ0_KQ/s1200/lixo-7.jpg\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"953\" data-original-width=\"1200\" height=\"509\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvTpcZoantZ16120z-lQK12YKhHkbb_lXVQEdznDiWKicX4J4EoD4yaibwH_iROLsHVCkeh4qti2xmslW-u5Qy96-5OkdfmK_l4-bpLHcezEPtQyNkR-9NuW9ZNDwVHRSO91S1kQZTHPtXZdQdcaFCxWSQFLwLz8y-NFx5oT2AMLi3SqVEzQ0_KQ/w640-h509/lixo-7.jpg\" width=\"640\" /></a></div><br />",
      "image": {
        "url": "https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisozadvkoI9CxySkzJNcnOY_o2vZNWnv2gonXZ-K3eYn24dsIy5j7DoEHNxNShAVd-OBqk1PUMGRqJvSdmOs10lTHYGTlCgYz7uqOjXD_vf57eKTbMPeedRuCETBjUWnp-Sh9mIDxK0vMqp_va2txelYdG8f_9Yem8IweeCIQlhclFQi7HwOIlNA/s72-w400-h371-c/Del3rp-WsAES2IE.jpg",
        "title": null
      },
      "media": [],
      "authors": [
        {
          "name": "Unknown",
          "email": "[email protected]",
          "url": null
        }
      ],
      "categories": [
        {
          "label": "pseudo-randomness",
          "term": "pseudo-randomness",
          "url": "http://www.blogger.com/atom/ns#"
        }
      ]
    },
    {
      "id": "tag:blogger.com,1999:blog-19303585.post-105942708803926021",
      "title": "Cracking an old ZIP file to help open source the ANC's \"Operation Vula\" secret crypto code",
      "description": null,
      "url": "http://blog.jgc.org/2024/09/cracking-old-zip-file-to-help-open.html",
      "published": "2024-09-07T16:40:00.001Z",
      "updated": "2024-09-12T08:57:35.147Z",
      "content": "<p>It's not often that you find yourself staring at code that few people have ever seen, code that was an important part in bringing down the apartheid system in South Africa, and code that was used for secure communication using one-time pads smuggled into South Africa by a flight attendant on floppy disks. But I found myself doing that one morning recently after having helped decrypt a 30 year old PKZIP file whose password had long been forgotten.</p><p>Some time ago I became interested in the secure communications used by the <a href=\"https://en.wikipedia.org/wiki/African_National_Congress\">ANC</a> as part of <a href=\"https://en.wikipedia.org/wiki/Operation_Vula\">Operation Vula</a> in the late 1980s. Operation Vula was the infiltration of ANC leaders (and materiel) into South Africa to set up an underground network bringing together the various elements of ANC activism operating inside the country. </p><p>The operation needed secure communications to be successful and these were established using 8-bit computers, DTMF tones, acoustic couplers and a variety of other equipment for exchanging one-time pad encrypted messages using programs written in <a href=\"https://en.wikipedia.org/wiki/PowerBASIC\">PowerBASIC</a>.</p><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7c14emcAhruoYELH_YTk0Gl_SMkPPV8rRdmnjs21QQGiGZoAGn0rnBR2SeSXd4bAQqF83Kgu6bRKkeGjhWXPpzlqJfKkrnuMfNlfZ0CCej9dmGMDlQvDP24Ka3iorprn474jZ_ZUCANTiu9EBC0FLUmjpug9avwL4eoCx3qeX9afO2v3SsqaGdg/s460/171421935.png\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"460\" data-original-width=\"460\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7c14emcAhruoYELH_YTk0Gl_SMkPPV8rRdmnjs21QQGiGZoAGn0rnBR2SeSXd4bAQqF83Kgu6bRKkeGjhWXPpzlqJfKkrnuMfNlfZ0CCej9dmGMDlQvDP24Ka3iorprn474jZ_ZUCANTiu9EBC0FLUmjpug9avwL4eoCx3qeX9afO2v3SsqaGdg/s16000/171421935.png\" /></a></div><p>I won't go into the detail of how this worked as <a href=\"https://en.wikipedia.org/wiki/Tim_Jenkin\">Tim Jenkin</a>, the person primarily responsible for the encryption system, has now open sourced the original code, and which <a href=\"https://github.com/vulacode\">can be found here</a>. Tim's write up on the encryption system <a href=\"https://github.com/Vulacode/Articles/blob/main/Talking%20To%20Vula.pdf\">can be found here</a>. I thoroughly recommend reading it for the details.</p><p>The code hadn't been open sourced before for one simple reason: on leaving the UK for South Africa in 1991 he had zipped up all the source code and set a password on it. In the intervening years he'd simply forgotten the password! So, when I emailed him to ask if it had been open sourced he replied:</p><p></p><blockquote><p>I still have the Vula source code but unfortunately most of it I can't access because when I left the UK in 1991 to return to South Africa, I zipped up all the files with a password. I was able to decode and extract one of the files but it was a very early version of the software. The rest I couldn't extract because I forgot the password. When I got back to SA there was no need to access the code. I thought I would never forget the password but when I tried to decode it a few years later, I couldn't remember it.</p><p>If you could find out how to decode zipped files that would release the software, which I would be more than happy to share. I have made a few attempts to crack the code but so far have been unsuccessful.</p></blockquote><p></p><p>I readily agreed and he sent me two files: <span style=\"font-family: courier;\">ALLBAS.ZIP</span> and <span style=\"font-family: courier;\">CODMAY93.ZIP</span>. These were both created with an early version of PKZIP and had passwords set on them. Luckily, there is a <a href=\"https://link.springer.com/chapter/10.1007/3-540-60590-8_12\">known plain text attack</a> against the ZipCrypto scheme used in that era's ZIP format. And an open source implementation of the attack called <a href=\"https://github.com/kimci86/bkcrack\"><span style=\"font-family: courier;\">bkcrack</span></a>.</p><p>So, it was a \"simple matter\" of predicting 12 bytes of plain text at a known location inside the ZIP file. Here's a sample of what's inside the ZIP file:</p><p><span style=\"font-family: courier;\">$ bkcrack -L ALLBAS.ZIP | head -n 20</span></p><p><span style=\"font-family: courier;\">bkcrack 1.7.0 - 2024-05-26<br /></span><span style=\"font-family: courier;\">Archive: ALLBAS.ZIP<br /></span><span style=\"font-family: courier;\">Index Encryption Compression CRC32    Uncompressed  Packed size Name<br /></span><span style=\"font-family: courier;\">----- ---------- ----------- -------- ------------ ------------ ----------------<br /></span><span style=\"font-family: courier;\">    0 ZipCrypto  Shrink      b0f86b1d          163          117 A1PSW.BAS<br /></span><span style=\"font-family: courier;\">    1 ZipCrypto  Shrink      8fa662d4          163          118 A2PSW.BAS<br /></span><span style=\"font-family: courier;\">    2 ZipCrypto  Shrink      0c5a7295          163          119 A3PSW.BAS<br /></span><span style=\"font-family: courier;\">    3 ZipCrypto  Shrink      49907f86          179          125 A4PSW.BAS<br /></span><span style=\"font-family: courier;\">    4 ZipCrypto  Shrink      3d20eb7a          163          120 A5PSW.BAS<br /></span><span style=\"font-family: courier;\">    5 ZipCrypto  Shrink      f8b558f0          136          128 BIOS.INC<br /></span><span style=\"font-family: courier;\">    6 ZipCrypto  Implode     799074ed          377          278 CHKERR.INC<br /></span><span style=\"font-family: courier;\">    7 ZipCrypto  Implode     c44ea0a5        17906         5401 CODSUBS.INC<br /></span><span style=\"font-family: courier;\">    8 ZipCrypto  Implode     7bd7e23d        27287         8297 COMAID.BAS<br /></span><span style=\"font-family: courier;\">    9 ZipCrypto  Implode     03dc63da         2109         1001 COMKEY.BAS<br /></span><span style=\"font-family: courier;\">   10 ZipCrypto  Store       3500d320         2372         2384 CONFIG.TIM<br /></span><span style=\"font-family: courier;\">   11 ZipCrypto  Shrink      35a85089          147          111 CONPSW.BAS<br /></span><span style=\"font-family: courier;\">   12 ZipCrypto  Implode     55be75ce         2094          825 DOS.INC<br /></span><span style=\"font-family: courier;\">   13 ZipCrypto  Shrink      3387d043          134          127 DOSVER.INC<br /></span><span style=\"font-family: courier;\">   14 ZipCrypto  Implode     28a32efa         1304          535 DOSX.INC<br /></span><span style=\"font-family: courier;\">   15 ZipCrypto  Implode     6578a66c         3196          966 EDDY.BAS</span></p><p>Tim had some unencrypted <span style=\"font-family: courier;\">.BAS</span> files lying around but they were different versions than those in the file and trying the <span style=\"font-family: courier;\">bkcrack</span> attack using them (after running them through original PKZIP in <a href=\"https://www.dosbox.com/\">DOSBox</a>) was unsuccessful and I decided to apply some brain power before attempting further attacks.</p><p><span style=\"font-family: courier;\">ALLBAS.ZIP</span> contained a number of files that were uncompressed, because they were already binary and not worth compressing. These files are marked as <span style=\"font-family: courier;\">Store</span>:</p><p><span style=\"font-family: courier;\">$ bkcrack -L ALLBAS.ZIP | grep Store<br /></span><span style=\"font-family: courier;\">   10 ZipCrypto  Store       3500d320         2372         2384 CONFIG.TIM<br /></span><span style=\"font-family: courier;\">   23 ZipCrypto  Store       14a285ac            2           14 KEYCOD.EXE<br /></span><span style=\"font-family: courier;\">   25 ZipCrypto  Store       d6343ce1         4767         4779 KEYONE.ZIP<br /></span><span style=\"font-family: courier;\">   26 ZipCrypto  Store       650778b7         6523         6535 KEYTHREE.ZIP<br /></span><span style=\"font-family: courier;\">   30 ZipCrypto  Store       12a711cd        58172        58184 OLDCOD.ZIP<br /></span><span style=\"font-family: courier;\">   41 ZipCrypto  Store       00000000            0           12 TAPCOD.EXE<br /></span><span style=\"font-family: courier;\">   44 ZipCrypto  Store       55000714        12716        12728 TECOD5.ZIP<br /></span><span style=\"font-family: courier;\">   45 ZipCrypto  Store       f4f4366c         9230         9242 TECOD6.ZIP</span></p><p>Files that are <span style=\"font-family: courier;\">Store</span>'d are fruitful for plaintext prediction because they have not undergone compression and there's no need to have the original file to compress in order to obtain plaintext. Focussing on the ZIP files, since the ZIP files start with a PK header, seemed like a good place to find predictable plaintext at a known position. Here are the fields in the standard PK header at the very start of a ZIP file:</p><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsJqC7hwdZ6KlE6kkcnX0E3OqRNUX0bCZybe-nqTsG0Kut52XY8TrgJri6iyBfrWNNjOjV4Y-eKWxjnGdYm4jkaEZpC04GHIHfY2aH8KZoFUGlfhNXSCuMUrYp9Rig8OaCWVgXTl4VNoDRXJczO_Iv9b-jywsdAywgDRQMZzD24P6p9hbW3DMjxg/s1654/vula-1.png\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"324\" data-original-width=\"1654\" height=\"125\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsJqC7hwdZ6KlE6kkcnX0E3OqRNUX0bCZybe-nqTsG0Kut52XY8TrgJri6iyBfrWNNjOjV4Y-eKWxjnGdYm4jkaEZpC04GHIHfY2aH8KZoFUGlfhNXSCuMUrYp9Rig8OaCWVgXTl4VNoDRXJczO_Iv9b-jywsdAywgDRQMZzD24P6p9hbW3DMjxg/w640-h125/vula-1.png\" width=\"640\" /></a></div><div class=\"separator\" style=\"clear: both; text-align: center;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: left;\">A viable attack appeared to be to predict the name of the first file in the archive. If the file name was at least 8 characters (which seemed pretty easy since at least four characters were used for <span style=\"font-family: courier;\">.BAS</span>, <span style=\"font-family: courier;\">.INC</span> etc.) then at least 12 characters of plaintext would be available when the file name size (offset 0x1A, 0x1B) and the length of the extra field (which appeared to be 0x00, 0x00 in all the ZIPs Tim sent) was added.</div><div class=\"separator\" style=\"clear: both; text-align: left;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: left;\">In the worst case, it would be possible to bruteforce the potential names of files given that they all appear to be uppercase/number combinations with a maximum length of eight characters plus extension. But that turned out not to be necessary.</div><div class=\"separator\" style=\"clear: both; text-align: left;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: left;\">Happily, Tim had a different version of <span style=\"font-family: courier;\">OLDCOD.ZIP</span> (one of the ZIP files inside <span style=\"font-family: courier;\">ALLBAS.ZIP</span>) and was able to tell me that the first file in it was <span style=\"font-family: courier;\">COMKEY.BAS</span>. So, I whipped up a quick Perl program to create the necessary plaintext in that hope that the <span style=\"font-family: courier;\">OLDCOD.ZIP</span> inside <span style=\"font-family: courier;\">ALLBAS.ZIP</span> did start with <span style=\"font-family: courier;\">COMKEY.BAS</span>:</div><div class=\"separator\" style=\"clear: both; text-align: left;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: left;\"><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">$ cat maken.pl</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">use strict;</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">use warnings;</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\"><br /></span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">my $outfile = \"hexname-$$.txt\";</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\"><br /></span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">while (<>) {</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">    chomp;</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">    my $bas = $_;</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">    print(\"$bas / $outfile\\n\");</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">    my $n = sprintf(\"%c\\x00\\x00\\x00$bas\",length($bas));</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">    open G, \">$outfile\";</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">    print G $n;</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">    close G;</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">    system(\"bkcrack -C ALLBAS.ZIP -c OLDCOD.ZIP -p $outfile -o 26 -j 8\");</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">}</span></div><div><br /></div><div>23 minutes later <span style=\"font-family: courier;\">bkcrack</span> spit out the key to the <span style=\"font-family: courier;\">ALLBAS.ZIP</span> file and was able to decrypt it. The same key worked for <span style=\"font-family: courier;\">CODMAY93.ZIP</span> also.</div><div><br /></div><div><span id=\"docs-internal-guid-eb783345-7fff-83a6-2aef-34bb32a5b59b\"><span style=\"font-family: courier;\"><p dir=\"ltr\" style=\"line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;\"><span style=\"font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;\">$ time echo \"COMKEY.BAS\" | perl maken.pl</span></p><p dir=\"ltr\" style=\"line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;\"><span style=\"font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;\">COMKEY.BAS / hexname-41227.txt</span></p><p dir=\"ltr\" style=\"line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;\"><span style=\"font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;\">bkcrack 1.7.0 - 2024-05-26</span></p><p dir=\"ltr\" style=\"line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;\"><span style=\"font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;\">[07:49:38] Z reduction using 6 bytes of known plaintext</span></p><p dir=\"ltr\" style=\"line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;\"><span style=\"font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;\">100.0 % (6 / 6)</span></p><p dir=\"ltr\" style=\"line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;\"><span style=\"font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;\">[07:49:38] Attack on 925073 Z values at index 33</span></p><p dir=\"ltr\" style=\"line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;\"><span style=\"font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;\">Keys: 98e0f009 48a0b11a c70f8499</span></p><p dir=\"ltr\" style=\"line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;\"><span style=\"font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;\">80.6 % (745571 / 925073) </span></p><p dir=\"ltr\" style=\"line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;\"><span style=\"font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;\">Found a solution. Stopping.</span></p><p dir=\"ltr\" style=\"line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;\"><span style=\"font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;\">You may resume the attack with the option: --continue-attack 745571</span></p><p dir=\"ltr\" style=\"line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;\"><span style=\"font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;\">[18:13:49] Keys</span></p><p dir=\"ltr\" style=\"line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;\"><span style=\"font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;\">98e0f009 48a0b11a c70f8499</span></p><br /><p dir=\"ltr\" style=\"line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;\"><span style=\"font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;\">real</span><span style=\"font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;\"><span class=\"Apple-tab-span\" style=\"text-wrap: nowrap;\">\t</span></span><span style=\"font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;\">23m4.371s</span></p><p dir=\"ltr\" style=\"line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;\"><span style=\"font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;\">user</span><span style=\"font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;\"><span class=\"Apple-tab-span\" style=\"text-wrap: nowrap;\">\t</span></span><span style=\"font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;\">162m3.520s</span></p><span style=\"font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;\">sys</span><span style=\"font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;\"><span class=\"Apple-tab-span\" style=\"text-wrap: nowrap;\">\t</span></span><span style=\"font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;\">0m37.752s</span></span></span></div><div><br /></div><div><span style=\"font-family: courier;\">bkcrack</span> does the decryption once the key has been found:</div><div><br /></div><div><span id=\"docs-internal-guid-340b158b-7fff-bf4c-159e-7b8c85b8a90a\"><p dir=\"ltr\" style=\"line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;\"><span style=\"font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;\"><span style=\"font-family: courier;\">$ bkcrack -C ALLBAS.ZIP -k 98e0f009 48a0b11a c70f8499 -D ALLBAS-DECRYPTED.ZIP</span></span></p><p dir=\"ltr\" style=\"line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;\"><span style=\"font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;\"><span style=\"font-family: courier;\">bkcrack 1.7.0 - 2024-05-26</span></span></p><p dir=\"ltr\" style=\"line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;\"><span style=\"font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;\"><span style=\"font-family: courier;\">[07:52:22] Writing decrypted archive ALLBAS-DECRYPTED.ZIP</span></span></p><p dir=\"ltr\" style=\"line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;\"><span style=\"font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;\"><span style=\"font-family: courier;\">100.0 % (81 / 81)</span></span></p><p dir=\"ltr\" style=\"line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;\"><span style=\"font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;\"><span style=\"font-family: courier;\">$ bkcrack -C CODMAY93.ZIP -k 98e0f009 48a0b11a c70f8499 -D CODMAY93-DECRYPTED.ZIP</span></span></p><p dir=\"ltr\" style=\"line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;\"><span style=\"font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;\"><span style=\"font-family: courier;\">bkcrack 1.7.0 - 2024-05-26</span></span></p><p dir=\"ltr\" style=\"line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;\"><span style=\"font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;\"><span style=\"font-family: courier;\">[07:58:31] Writing decrypted archive CODMAY93-DECRYPTED.ZIP</span></span></p><p dir=\"ltr\" style=\"line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;\"><span style=\"font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;\"><span style=\"font-family: courier;\">100.0 % (40 / 40)</span></span></p><p dir=\"ltr\" style=\"line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;\"><br /></p><p dir=\"ltr\" style=\"line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;\"><span face=\"Arial, sans-serif\"><span style=\"white-space-collapse: preserve;\">And with that the long encrypted source code used to help set up secure communications for the ANC was available!</span></span></p><p dir=\"ltr\" style=\"line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;\"><span face=\"Arial, sans-serif\"><span style=\"white-space-collapse: preserve;\"><br /></span></span></p><p dir=\"ltr\" style=\"line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;\"><span style=\"white-space-collapse: preserve;\"><span face=\"Arial, sans-serif\">Had that failed I was going to attack one of the other ZIP files using the same attack (before resorting to bruteforceing file names). I'd guessed that </span><span style=\"font-family: courier;\">TECOD5.ZIP</span><span face=\"Arial, sans-serif\"> was probably a ZIP of just the file </span><span style=\"font-family: courier;\">TECOD.BAS</span><span face=\"Arial, sans-serif\"> (or maybe </span><span style=\"font-family: courier;\">TECOD5.BAS</span><span face=\"Arial, sans-serif\">) based on the compressed size of </span><span style=\"font-family: courier;\">TECOD.BAS</span><span face=\"Arial, sans-serif\"> in </span><span style=\"font-family: courier;\">ALLBAS.ZIP</span><span face=\"Arial, sans-serif\">). Turns out I wouldn't have had to wait 23 minutes if I'd started there:</span></span></p><p dir=\"ltr\" style=\"line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;\"><span face=\"Arial, sans-serif\"><span style=\"font-size: 14.6667px; white-space-collapse: preserve;\"><br /></span></span></p><p dir=\"ltr\" style=\"line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;\"><span style=\"background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;\"><span style=\"font-family: courier;\">$ time echo \"TECOD5.BAS\" | perl maken.pl</span></span></p><p dir=\"ltr\" style=\"line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;\"><span style=\"background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;\"><span style=\"font-family: courier;\">TECOD5.BAS / hexname-41544.txt</span></span></p><p dir=\"ltr\" style=\"line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;\"><span style=\"background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;\"><span style=\"font-family: courier;\">bkcrack 1.7.0 - 2024-05-26</span></span></p><p dir=\"ltr\" style=\"line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;\"><span style=\"background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;\"><span style=\"font-family: courier;\">[18:14:51] Z reduction using 6 bytes of known plaintext</span></span></p><p dir=\"ltr\" style=\"line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;\"><span style=\"background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;\"><span style=\"font-family: courier;\">100.0 % (6 / 6)</span></span></p><p dir=\"ltr\" style=\"line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;\"><span style=\"background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;\"><span style=\"font-family: courier;\">[18:14:51] Attack on 880113 Z values at index 33</span></span></p><p dir=\"ltr\" style=\"line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;\"><span style=\"background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;\"><span style=\"font-family: courier;\">Keys: 98e0f009 48a0b11a c70f8499</span></span></p><p dir=\"ltr\" style=\"line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;\"><span style=\"background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;\"><span style=\"font-family: courier;\">2.4 % (20737 / 880113)</span></span></p><p dir=\"ltr\" style=\"line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;\"><span style=\"background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;\"><span style=\"font-family: courier;\">Found a solution. Stopping.</span></span></p><p dir=\"ltr\" style=\"line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;\"><span style=\"background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;\"><span style=\"font-family: courier;\">You may resume the attack with the option: --continue-attack 20737</span></span></p><p dir=\"ltr\" style=\"line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;\"><span style=\"background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;\"><span style=\"font-family: courier;\">[18:15:29] Keys</span></span></p><p dir=\"ltr\" style=\"line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;\"><span style=\"background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;\"><span style=\"font-family: courier;\">98e0f009 48a0b11a c70f8499</span></span></p><p dir=\"ltr\" style=\"line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;\"><b id=\"docs-internal-guid-1886b7ac-7fff-b8f7-c099-212e9012986c\" style=\"font-weight: normal;\"><span style=\"font-family: courier;\"><br /></span></b></p><p dir=\"ltr\" style=\"line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;\"><span style=\"font-family: courier;\"><span style=\"background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;\">real</span><span style=\"background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;\"><span class=\"Apple-tab-span\" style=\"white-space: pre;\">\t</span></span><span style=\"background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;\">0m38.152s</span></span></p><p dir=\"ltr\" style=\"line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;\"><span style=\"font-family: courier;\"><span style=\"background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;\">user</span><span style=\"background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;\"><span class=\"Apple-tab-span\" style=\"white-space: pre;\">\t</span></span><span style=\"background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;\">4m35.318s</span></span></p><p dir=\"ltr\" style=\"line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;\"><span style=\"font-family: courier;\"><span style=\"font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;\">sys</span><span style=\"font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;\"><span class=\"Apple-tab-span\" style=\"text-wrap: nowrap;\">\t</span></span><span style=\"font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;\">0m0.897s</span></span></p><p dir=\"ltr\" style=\"line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;\"><br /></p><p dir=\"ltr\" style=\"line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;\"><span face=\"Arial, sans-serif\" style=\"white-space-collapse: preserve;\">The known plaintext attack against ZipCrypto works quickly with the right plaintext. If you ever have to do something similar it's worth spending time thinking about the plaintext. In particular, files that are </span><span style=\"font-family: courier; white-space-collapse: preserve;\">Store</span><span face=\"Arial, sans-serif\" style=\"white-space-collapse: preserve;\">'d in the ZIP file are useful to examine since they are uncompressed and it may be easier to predict their contents (rather than having to find an original file and compress it to match what's stored in the ZIP).</span></p><p dir=\"ltr\" style=\"line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;\"><span style=\"white-space-collapse: preserve;\"><span face=\"Arial, sans-serif\"><br /></span></span></p><h3 style=\"line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;\"><span style=\"white-space-collapse: preserve;\"><span face=\"Arial, sans-serif\">Running the code</span></span></h3><p dir=\"ltr\" style=\"line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;\"><span style=\"white-space-collapse: preserve;\"><span face=\"Arial, sans-serif\"><br /></span></span></p><p dir=\"ltr\" style=\"line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;\"><span style=\"white-space-collapse: preserve;\"><span face=\"Arial, sans-serif\">I compiled two of the programs and ran them using DOSBox. The first, <a href=\"https://github.com/jgrahamc/jgc-vula-september-2024/blob/main/RANDOM.BAS\">RANDOM.BAS</a>, was used to create disks of random numbers to be used as a one time pad, the other, <a href=\"https://github.com/jgrahamc/jgc-vula-september-2024/blob/main/TECOD.BAS\">TECOD.BAS</a>, was used to encrypt and decrypt messages sent via email. The code I compiled and the generated executables <a href=\"https://github.com/jgrahamc/jgc-vula-september-2024/\">can be found here</a>.</span></span></p><p dir=\"ltr\" style=\"line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;\"><span style=\"white-space-collapse: preserve;\"><span face=\"Arial, sans-serif\"><br /></span></span></p><p dir=\"ltr\" style=\"line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;\"><span style=\"white-space-collapse: preserve;\"><span face=\"Arial, sans-serif\">Compilation is simply running the PowerBASIC compiler as follows:</span></span></p><p dir=\"ltr\" style=\"line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;\"><span style=\"white-space-collapse: preserve;\"><span face=\"Arial, sans-serif\"><br /></span></span></p><p dir=\"ltr\" style=\"line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;\"><span style=\"white-space-collapse: preserve;\"><span style=\"font-family: courier;\">C:\\>EXE\\PBC TECOD.BAS\nPowerBASIC Compiler Version 3.00b  Copyright (c) 1989-1993 by Robert S. Zale\nSpectra Publishing, Sunnyvale, CA, USA\nC:\\TECOD.BAS\n2575 statements, 2329 lines\nCompile time: 00:12.0 Compilation speed: 12600 stmts/minute\n45984 bytes code, 4880 bytes data, 2048 bytes stack\nSegments(1): 46k\n\nC:\\>EXE\\PBC RANDOM.BAS\nPowerBASIC Compiler Version 3.00b  Copyright (c) 1989-1993 by Robert S. Zale\nSpectra Publishing, Sunnyvale, CA, USA\nC:\\RANDOM.BAS\n2194 statements, 1940 lines\nCompile time: 00:10.1 Compilation speed: 12600 stmts/minute\n33328 bytes code, 4704 bytes data, 3072 bytes stack\nSegments(1): 34k\n\nC:\\></span></span></p><p dir=\"ltr\" style=\"line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;\"><span style=\"white-space-collapse: preserve;\"><span face=\"Arial, sans-serif\"><br /></span></span></p><p dir=\"ltr\" style=\"line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;\"><span style=\"white-space-collapse: preserve;\">The first step is to create random data on disk to be used as a one time pad. RANDOM.EXE uses three different randomness generating algorithms (one based on a random key you type in yourself). </span></p><p dir=\"ltr\" style=\"line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;\"><span style=\"white-space-collapse: preserve;\"><br /></span></p><p dir=\"ltr\" style=\"line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;\"></p><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuN0UGsMke0l_vABWoFgNkdBjmLu0FgzTgETRQgfSXVMJUlFo3rd6KGlzyGuGnVCIKN9bz4wS486EgARYw2OXCAqnPGanBalLVniCOUT_RzJywx9wjTnImPCe-GafBpPKIIFiHDxMUhubZVpYKoyRM1A9N_HUOCGgrZH8LSQDf06IKvD1mKWWtoQ/s1664/vula-1.png\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"1080\" data-original-width=\"1664\" height=\"415\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuN0UGsMke0l_vABWoFgNkdBjmLu0FgzTgETRQgfSXVMJUlFo3rd6KGlzyGuGnVCIKN9bz4wS486EgARYw2OXCAqnPGanBalLVniCOUT_RzJywx9wjTnImPCe-GafBpPKIIFiHDxMUhubZVpYKoyRM1A9N_HUOCGgrZH8LSQDf06IKvD1mKWWtoQ/w640-h415/vula-1.png\" width=\"640\" /></a></div><div class=\"separator\" style=\"clear: both; text-align: left;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: left;\">Encryption and decryption is done through TECOD.EXE which is password protected. </div><div class=\"separator\" style=\"clear: both; text-align: left;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnvCtEckKgHs-Pn02d1A6vrV9QjuOpc0P7ViAsQClIefLJ3UXh4FyxMYjbJSuSzOQo7mHjvMbaoc1_vIqDqB79kAGOYEYi0Hk9O9KUM62zx3-M_Mhmuktt3XdmNq12R3ta9UmhZV4_SEUw5wYBTyETGXrYlVlqvKkHAjwzRfPKV3veDcPsnCxoXg/s1664/vula-2.png\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"1080\" data-original-width=\"1664\" height=\"416\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnvCtEckKgHs-Pn02d1A6vrV9QjuOpc0P7ViAsQClIefLJ3UXh4FyxMYjbJSuSzOQo7mHjvMbaoc1_vIqDqB79kAGOYEYi0Hk9O9KUM62zx3-M_Mhmuktt3XdmNq12R3ta9UmhZV4_SEUw5wYBTyETGXrYlVlqvKkHAjwzRfPKV3veDcPsnCxoXg/w640-h416/vula-2.png\" width=\"640\" /></a></div><div class=\"separator\" style=\"clear: both; text-align: left;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: left;\">Although the password is embedded in the program and quite simple Tim Jenkin did obfuscate it as follows:</div><div class=\"separator\" style=\"clear: both; text-align: left;\"><br /></div><p></p><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">DIM PW$(PL)</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">PW$(9)=CHR$(66):PW$(4)=CHR$(66):PW$(1)=CHR$(84):PW$(5)=CHR$(79):PW$(2) = </span><span style=\"font-family: courier;\">CHR$(73)</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">PW$(3)=CHR$(77):PW$(6)=CHR$(66):PW$(8)=CHR$(77):PW$(10)=CHR$(79):PW$(7)=CHR$(</span><span style=\"font-family: courier;\">73)</span></div><div class=\"separator\" style=\"clear: both;\"><div class=\"separator\" style=\"clear: both;\"><br /></div><div class=\"separator\" style=\"clear: both;\">In this particular version of the program that makes the password TIMBOBIMBO which when entered takes you to the main menu. Note that each version of these programs being sent to different members of the ANC had different passwords.</div><div class=\"separator\" style=\"clear: both;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPEhfbubWzqACAf56urzB4c2MkrCyJVC9EcFocsHkWu8gTC5KCP80Ido9K_iAopeG9nYwV0tsOUtFlB_yXcwHn7OiklEDJop9UwWTk3B3pgT8N1P1APv7wODILo_ryQXS6ojfizJm2rcBrLgPav2uPsg3s3O7-Yl28PPFIJT0hMG7m66mtGwCVSQ/s1664/vula-3.png\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"1080\" data-original-width=\"1664\" height=\"416\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPEhfbubWzqACAf56urzB4c2MkrCyJVC9EcFocsHkWu8gTC5KCP80Ido9K_iAopeG9nYwV0tsOUtFlB_yXcwHn7OiklEDJop9UwWTk3B3pgT8N1P1APv7wODILo_ryQXS6ojfizJm2rcBrLgPav2uPsg3s3O7-Yl28PPFIJT0hMG7m66mtGwCVSQ/w640-h416/vula-3.png\" width=\"640\" /></a></div>If you're interested in running these programs yourself, <a href=\"https://github.com/Vulacode/TECOD/blob/main/TECOD_HLP.pdf\">the manual is here</a>.</div><div class=\"separator\" style=\"clear: both;\"><br /></div><div class=\"separator\" style=\"clear: both;\">Here are three short videos showing the creation of random data in <a href=\"https://github.com/jgrahamc/jgc-vula-september-2024/blob/main/RANDATA.1\">RANDATA.1</a> for the key using RANDOM.EXE, followed by encrypting a message stored in <a href=\"https://github.com/jgrahamc/jgc-vula-september-2024/blob/main/PLAIN.TXT\">PLAIN.TXT</a> on a RAM disk (all crypto operations were meant to happen on a RAM disk) and turning it into <a href=\"https://github.com/jgrahamc/jgc-vula-september-2024/blob/main/PLAIN.BIN\">PLAIN.BIN</a> (and the reverse).</div><div class=\"separator\" style=\"clear: both;\"><br /></div></span><h3 style=\"text-align: left;\"><span>\n\nCreating random data to be used as an encryption key</span></h3><div><span><br /></span></div><span><div>\n  <iframe allow=\"accelerometer; gyroscope; autoplay; encrypted-media; picture-in-picture;\" allowfullscreen=\"true\" loading=\"lazy\" src=\"https://customer-rww76yind8iym5aw.cloudflarestream.com/fba76afea511fe18ace045bd2500d257/iframe?poster=https%3A%2F%2Fcustomer-rww76yind8iym5aw.cloudflarestream.com%2Ffba76afea511fe18ace045bd2500d257%2Fthumbnails%2Fthumbnail.jpg%3Ftime%3D%26height%3D600\" style=\"border: none; height: 400px; left: 0; position: relative; top: 0; width: 100%;\"></iframe>\n</div></span><h3 style=\"text-align: left;\"><span><br /></span></h3><h3 style=\"text-align: left;\"><span>\n\nEncrypting a file\n  \n</span></h3><div><br /></div><div>Here the programs (TECOD.EXE/TECOD.CNF) are on a floppy disk in A:, the data disk (containing the key file created above) are in B: and there's a RAM disk on R:. To get this to work the RANDATA.1 file created in the step above needs to be renamed to SNUM. </div><div><br /></div><div><br /></div><span><div>\n  <iframe allow=\"accelerometer; gyroscope; autoplay; encrypted-media; picture-in-picture;\" allowfullscreen=\"true\" loading=\"lazy\" src=\"https://customer-rww76yind8iym5aw.cloudflarestream.com/7bc06352d23ddfa1a8ef3e3fa3c4575a/iframe?poster=https%3A%2F%2Fcustomer-rww76yind8iym5aw.cloudflarestream.com%2F7bc06352d23ddfa1a8ef3e3fa3c4575a%2Fthumbnails%2Fthumbnail.jpg%3Ftime%3D%26height%3D600\" style=\"border: none; height: 400px; left: 0; position: relative; top: 0; width: 100%;\"></iframe></div></span><h3 style=\"text-align: left;\"><span><br /></span></h3><h3 style=\"text-align: left;\"><span>\n\nDecrypting a file</span></h3><div><span><div><br /></div><div>Here the programs (TECOD.EXE/TECOD.CNF) are on a floppy disk in A:, the data disk (containing the key file created above) are in B: and there's a RAM disk on R:. The RANDATA.1 needs to be called RNUM on B:. </div><div><br /></div></span></div><h3 style=\"text-align: left;\"><span><iframe allow=\"accelerometer; gyroscope; autoplay; encrypted-media; picture-in-picture;\" allowfullscreen=\"true\" loading=\"lazy\" src=\"https://customer-rww76yind8iym5aw.cloudflarestream.com/0239333a091d0e8c8d0c9e5302c29260/iframe?poster=https%3A%2F%2Fcustomer-rww76yind8iym5aw.cloudflarestream.com%2F0239333a091d0e8c8d0c9e5302c29260%2Fthumbnails%2Fthumbnail.jpg%3Ftime%3D%26height%3D600\" style=\"border: none; height: 400px; left: 0; position: relative; top: 0; width: 100%;\"></iframe></span></h3><span><div class=\"separator\" style=\"clear: both; text-align: center;\"><br /></div>There are lots of interesting details of how these programs work that deserve another longer blog post when I have time. Or a detailed study by someone else. For example, the key material is destroyed after use, the RANDOM.EXE program has multiple ways of making randomness and code to check the distribution of the random bytes created. There's an emphasis on using the RAM disk for all cryptographic operations. </span></div></div>",
      "image": {
        "url": "https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7c14emcAhruoYELH_YTk0Gl_SMkPPV8rRdmnjs21QQGiGZoAGn0rnBR2SeSXd4bAQqF83Kgu6bRKkeGjhWXPpzlqJfKkrnuMfNlfZ0CCej9dmGMDlQvDP24Ka3iorprn474jZ_ZUCANTiu9EBC0FLUmjpug9avwL4eoCx3qeX9afO2v3SsqaGdg/s72-c/171421935.png",
        "title": null
      },
      "media": [],
      "authors": [
        {
          "name": "Unknown",
          "email": "[email protected]",
          "url": null
        }
      ],
      "categories": [
        {
          "label": "codes and ciphers",
          "term": "codes and ciphers",
          "url": "http://www.blogger.com/atom/ns#"
        },
        {
          "label": "hits",
          "term": "hits",
          "url": "http://www.blogger.com/atom/ns#"
        },
        {
          "label": "retro",
          "term": "retro",
          "url": "http://www.blogger.com/atom/ns#"
        },
        {
          "label": "security",
          "term": "security",
          "url": "http://www.blogger.com/atom/ns#"
        }
      ]
    },
    {
      "id": "tag:blogger.com,1999:blog-19303585.post-8452693863720025641",
      "title": "Steve Ballmer's incorrect binary search interview question",
      "description": null,
      "url": "http://blog.jgc.org/2024/09/steve-ballmers-binary-search-interview.html",
      "published": "2024-09-03T10:16:00.005Z",
      "updated": "2024-09-12T08:57:41.586Z",
      "content": "<div class=\"separator\" style=\"clear: both; text-align: left;\">In this short video <a href=\"https://en.wikipedia.org/wiki/Steve_Ballmer\">Steve Ballmer</a> talks about a puzzle question he would ask candidates interviewing at Microsoft. Solving it is based on <a href=\"https://en.wikipedia.org/wiki/Binary_search\">binary search</a> and the <a href=\"https://en.wikipedia.org/wiki/Expected_value\">expected value</a>.</div><div class=\"separator\" style=\"clear: both; text-align: left;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: center;\"><iframe allowfullscreen=\"\" class=\"BLOG_video_class\" height=\"266\" src=\"https://www.youtube.com/embed/svCYbkS0Sjk\" width=\"320\" youtube-src-id=\"svCYbkS0Sjk\"></iframe></div><br /><p>Here's what he says: \"<i>I'm thinking of a number between 1 and 100. You can guess, after each guess I'll tell you whether high or low. You get it the first guess I'll give you five bucks. Four bucks, three, two, one, zero, you pay me a buck, you pay me two, you pay me three</i>\". </p><p>The question is \"<i>Should you accept to play this game?</i>\". In the interview, Ballmer states that the answer is \"No\" for two reasons: firstly, because he can pick numbers that'll be the most difficult for you to determine, secondly because the expected value of the game (assuming Ballmer chooses randomly) is negative: you end up paying Ballmer.</p><p>He's right on the first count. If you follow a binary search strategy (which will be optimal if he's choosing randomly) and he chooses one of 2, 5, 8, 11, 14, 17, 20, 22, 24, 27, 30, 33, 36, 39, 42, 45, 47, 49, 52, 55, 58, 61, 64, 67, 70, 72, 74, 77, 80, 83, 85, 87, 90, 93, 96, 98 or 100 then you owe him $1. For all other numbers you get $0 (if he chose 1, 4, 7, 10, 13, 16, 19, 23, 26, 29, 32, 35, 38, 41, 44, 48, 51, 54, 57, 60, 63, 66, 69, 73, 76, 79, 82, 86, 89, 92, 95 or 99) or a positive outcome (some of his money!).</p><p>In the video above Ballmer chooses 59 which a binary search strategy would have found in 5 steps resulting in the interviewer, Emily Chang, winning $1. She was actually pretty close to doing that. The binary search steps would be 50, 75, 62, 56, 59 and she guessed 50, 75, 60, 55, 57, 58, 59. </p><p>On the second count (Baller implies the expected value is negative), if he's choosing randomly, then he's wrong. The expected value is $0.20 (calculated discretely using the code below). The code calculates the number of guesses for each value and an overall expected value assuming Ballmer chooses randomly.</p><p><span style=\"font-family: courier;\">use strict;<br /></span><span style=\"font-family: courier;\">use warnings;<br /></span><span style=\"font-family: courier;\"><br />my @v = (0, 5, 4, 3, 2, 1, 0, -1, -2);<br /></span><span style=\"font-family: courier;\"><br />my $ev = 0;<br /></span><span style=\"font-family: courier;\">my $ec = 0;<br /></span><span style=\"font-family: courier;\"><br />my @range = (1..100);<br /></span><span style=\"font-family: courier;\"><br />foreach my $r (@range) {<br /></span><span style=\"font-family: courier;\">    my $l = $range[0];<br /></span><span style=\"font-family: courier;\">    my $h = $range[$#range];<br /></span><span style=\"font-family: courier;\"><br />    my $s = 0;<br /></span><span style=\"font-family: courier;\">    while (1) {<br /></span><span style=\"font-family: courier;\">        $s += 1;<br /></span><span style=\"font-family: courier;\">        my $g = int(($l + $h)/2);<br /></span><span style=\"font-family: courier;\"><br />        if ($r == $g) {<br /></span><span style=\"font-family: courier;\">            print \"$r found in $s steps (\" . dollar($v[$s]) . \")\\n\";<br /></span><span style=\"font-family: courier;\">            $ev += $v[$s];<br /></span><span style=\"font-family: courier;\">            $ec += 1;<br /></span><span style=\"font-family: courier;\">            last;<br /></span><span style=\"font-family: courier;\">        }<br /></span><span style=\"font-family: courier;\"><br />        if ($g < $r) {<br /></span><span style=\"font-family: courier;\">            $l = $g + 1;<br /></span><span style=\"font-family: courier;\">            next;<br /></span><span style=\"font-family: courier;\">        }<br /></span><span style=\"font-family: courier;\"><br />        if ($g > $r) {<br /></span><span style=\"font-family: courier;\">            $h = $g - 1;<br /></span><span style=\"font-family: courier;\">            next;<br /></span><span style=\"font-family: courier;\">        }<br /></span><span style=\"font-family: courier;\">    }<br /></span><span style=\"font-family: courier;\">}<br /></span><span style=\"font-family: courier;\"><br />$ev /= $ec;<br /></span><span style=\"font-family: courier;\">print \"Game expected value is \" . dollar($ev) . \"\\n\";<br /></span><span style=\"font-family: courier;\"><br />sub dollar {</span></p><p><span style=\"font-family: courier;\">    my ($d) = @_;<br /></span><span style=\"font-family: courier;\"><br />    my $f = (int($d) == $d)?'%d':'%.2f';<br /></span><span style=\"font-family: courier;\">    return sprintf(\"%s\\$$f\", ($d<0)?'-':'', abs($d));<br /></span><span style=\"font-family: courier;\">}</span></p><p><span style=\"font-family: inherit;\">This chart shows the expected winnings (or loss) depending on the number Ballmer chooses. The shape of the binary search can be seen in the chart itself.</span></p><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiElRkalAf71qPuh9a1t0yhsoAO5ZPQ-mR3NpSBwwuYpdsbkASynXT_JOwyrOkzWUNJ1ZWGnArmU4tKHEQpsMVxe9s5h7qdXgZRaMprV8dV2X_0-dXG195Dsi7S3hnJknshVyiRIgKUXCRcy4RZcDv0tI_bWQd6OwzkdEfNavHTm8HV4NH4ZP4itg/s1800/bs-1.png\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"702\" data-original-width=\"1800\" height=\"250\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiElRkalAf71qPuh9a1t0yhsoAO5ZPQ-mR3NpSBwwuYpdsbkASynXT_JOwyrOkzWUNJ1ZWGnArmU4tKHEQpsMVxe9s5h7qdXgZRaMprV8dV2X_0-dXG195Dsi7S3hnJknshVyiRIgKUXCRcy4RZcDv0tI_bWQd6OwzkdEfNavHTm8HV4NH4ZP4itg/w640-h250/bs-1.png\" width=\"640\" /></a></div><p>A different way to think about the expected value and binary search is as follows:</p><p>1. On the first guess you choose 50 and win $5 with a probability of 1/100</p><p>2. On the second guess you choose 25 or 75 and win $4 with a probability of 2/100</p><p>3. On the third guess you choose 12, 37, 62 or 88 and win $3 with a probability of 4/100</p><p>4. On the fourth guess you choose 6, 18, 31, 43, 56, 68, 81 or 94 and win $2 with a probability of 8/100</p><p>5. And so on.</p><p>The gives the expected value as 5 * 1/100 + 4 * 2/100 + 3 * 4/100 + 2 * 8/100 + 1 * 16/100 + 0 * 32/100 + -1 * 37/100 (note the last term is the remaining possible numbers having reached the end of the binary search). That's 0.2.</p><p><i>Why was Ballmer wrong?</i></p><p>One possibility is that he didn't mean to have the $0 for 6 guesses. If he'd said \"<i>I'm thinking of a number between 1 and 100. You can guess, after each guess I'll tell you whether high or low. You get it the first guess I'll give you five bucks. Four bucks, three, two, one, you pay me a buck, you pay me two, you pay me three</i>\" then the expected value is -$0.49.</p>",
      "image": {
        "url": "https://img.youtube.com/vi/svCYbkS0Sjk/default.jpg",
        "title": null
      },
      "media": [],
      "authors": [
        {
          "name": "Unknown",
          "email": "[email protected]",
          "url": null
        }
      ],
      "categories": [
        {
          "label": "hits",
          "term": "hits",
          "url": "http://www.blogger.com/atom/ns#"
        },
        {
          "label": "mathematics",
          "term": "mathematics",
          "url": "http://www.blogger.com/atom/ns#"
        },
        {
          "label": "pseudo-randomness",
          "term": "pseudo-randomness",
          "url": "http://www.blogger.com/atom/ns#"
        }
      ]
    },
    {
      "id": "tag:blogger.com,1999:blog-19303585.post-8870263574877874516",
      "title": "Two ways to use  an LED as a light sensor with Arduino",
      "description": null,
      "url": "http://blog.jgc.org/2024/06/two-ways-to-use-led-as-light-sensor.html",
      "published": "2024-06-19T07:43:00.016Z",
      "updated": "2024-06-20T12:38:31.606Z",
      "content": "<p>I needed to log when a light switched on and off during the night as part of debugging an oddly behaving movement sensor. To do that I built a really simple light sensor logger using an Arduino Leonardo, a large LED and a resistor or three. Here it is:</p><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXokF70rNbNS2w0ei9bHqVGaFi6KVXF6Cjlnd3Hp9yhhSD38FrvHTbdFRYr1JE4GUTywylxdFse1dKiBoO98IY3IYqpq8MSaUq6iAyq36rGKzgnli8gUKw_QmgleW2eJlX6Ns6MOukC_K3HvjRXfakGLjoHmCKL3Bj_-ful7Rz779ZPTy8UH-qXQ/s800/light-sense-1.jpg\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"768\" data-original-width=\"800\" height=\"614\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXokF70rNbNS2w0ei9bHqVGaFi6KVXF6Cjlnd3Hp9yhhSD38FrvHTbdFRYr1JE4GUTywylxdFse1dKiBoO98IY3IYqpq8MSaUq6iAyq36rGKzgnli8gUKw_QmgleW2eJlX6Ns6MOukC_K3HvjRXfakGLjoHmCKL3Bj_-ful7Rz779ZPTy8UH-qXQ/w640-h614/light-sense-1.jpg\" width=\"640\" /></a></div><div class=\"separator\" style=\"clear: both; text-align: center;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: left;\">And here's the entire Arduino code:</div><div class=\"separator\" style=\"clear: both; text-align: left;\"><br /></div><blockquote style=\"border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;\"><div class=\"separator\" style=\"clear: both; text-align: left;\"><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">void setup() {</span></div></div><div class=\"separator\" style=\"clear: both; text-align: left;\"><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">  Serial.begin(9600);</span></div></div><div class=\"separator\" style=\"clear: both; text-align: left;\"><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">  analogReference(EXTERNAL);</span></div></div><div class=\"separator\" style=\"clear: both; text-align: left;\"><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">}</span></div></div><div class=\"separator\" style=\"clear: both; text-align: left;\"><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\"><br /></span></div></div><div class=\"separator\" style=\"clear: both; text-align: left;\"><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">void loop() {</span></div></div><div class=\"separator\" style=\"clear: both; text-align: left;\"><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">  Serial.println(analogRead(A1));</span></div></div><div class=\"separator\" style=\"clear: both; text-align: left;\"><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">  delay(1000);</span></div></div><div class=\"separator\" style=\"clear: both; text-align: left;\"><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">}</span></div></div></blockquote><div class=\"separator\" style=\"clear: both; text-align: left;\"><div class=\"separator\" style=\"clear: both;\"><br /></div><div class=\"separator\" style=\"clear: both;\">The main <span style=\"font-family: courier;\">loop()</span> just reads the voltage across the LED from analog input A1 and writes it to the serial port. Then it waits for a second. The <span style=\"font-family: courier;\">setup()</span> routine tells the ADC converter to use the voltage on AREF as the reference maximum voltage for the ADC.</div><div class=\"separator\" style=\"clear: both;\"><br /></div><div class=\"separator\" style=\"clear: both;\">The LED has a voltage of between about 0mV and 400mV depending on the amount of light. </div>\n  <br />\n  <iframe allow=\"accelerometer; gyroscope; autoplay; encrypted-media; picture-in-picture;\" allowfullscreen=\"true\" loading=\"lazy\" src=\"https://customer-rww76yind8iym5aw.cloudflarestream.com/036d470ad7ea9dfb3e7207f81d19feaa/iframe?poster=https%3A%2F%2Fcustomer-rww76yind8iym5aw.cloudflarestream.com%2F036d470ad7ea9dfb3e7207f81d19feaa%2Fthumbnails%2Fthumbnail.jpg%3Ftime%3D%26height%3D600\" style=\"border: none; height: 400px; left: 0; position: relative; top: 0; width: 100%;\"></iframe>\n  <br />\n  <div class=\"separator\" style=\"clear: both;\"><span><br /></span></div><div class=\"separator\" style=\"clear: both;\"><span>By default the voltage range of the ADC on the Arduino Leonardo is 0V to 5V but it's possible to scale it with a call to </span><span style=\"font-family: courier;\"><a href=\"https://www.arduino.cc/reference/en/language/functions/analog-io/analogreference/\">analogReference</a>()</span><span>.</span><span>Calling </span><span style=\"font-family: courier;\">analogReference(INTERNAL)</span><span> would set the range to 0V to 2.56V which is still a bit large given the small voltage across the LED. AREF to the rescue!</span></div><div class=\"separator\" style=\"clear: both;\"><br /></div><div class=\"separator\" style=\"clear: both;\">The AREF pin allows a range to be set for the ADC. It has an internal resistance of 32K and I added a 66K resistor (made from three resistors I had lying around) connected to the Arduino's 3.3V pin. The 66K and 32K form a voltage divider giving an AREF of 1.1V (which is the low end of valid AREF values). Then it's just necessary to call <span style=\"font-family: courier;\">analogReference(EXTERNAL)</span>.</div><div class=\"separator\" style=\"clear: both;\"><br /></div><div class=\"separator\" style=\"clear: both;\">Here's the output of the program when I had covered the LED with my hand and then uncovered it.</div><div class=\"separator\" style=\"clear: both;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5C4KpjJPdeYzeMG_mGgLzz_rlRxpzg4NQA_kLMTs-YTcuotxyRdN-mSKALKT-RXDF-SsinkMmjWoZ5XdydL3OlNcc8msaA1-q4kU1PDf0Sfc7H7HG2bKcZsIWrmywzl5JKTew7STFQOU2U7J4B_OITOqG3MZdZxmIa54QelvvjHJK2h8dQjhkdA/s1908/light-sense-2.png\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"1314\" data-original-width=\"1908\" height=\"440\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5C4KpjJPdeYzeMG_mGgLzz_rlRxpzg4NQA_kLMTs-YTcuotxyRdN-mSKALKT-RXDF-SsinkMmjWoZ5XdydL3OlNcc8msaA1-q4kU1PDf0Sfc7H7HG2bKcZsIWrmywzl5JKTew7STFQOU2U7J4B_OITOqG3MZdZxmIa54QelvvjHJK2h8dQjhkdA/w640-h440/light-sense-2.png\" width=\"640\" /></a></div><div class=\"separator\" style=\"clear: both; text-align: left;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: left;\">You can also use the built in Arduino Serial Plotter to get an instant chart. Here I covered the LED with my hand, took my hand away and then shone a torch directly into the LED.</div><div class=\"separator\" style=\"clear: both; text-align: left;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2jnALyAtZGaxR_bgWBPHA4XvF-WN-u2uBru3P_1KMtVFQ_b_RdwgriJTjG4t3hn8cIdSURke7W_SRpq_mQjYK7kZLmTWSgrEcykLnIYSDDAbCWD2Q5bWNmpXpIM3H4ERg4jyFXb-IDDwkqV-_8haWN1najFGHfufcU-YM8M36uS6FLt35qagV5Q/s1908/light-sense-3.png\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"1314\" data-original-width=\"1908\" height=\"440\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2jnALyAtZGaxR_bgWBPHA4XvF-WN-u2uBru3P_1KMtVFQ_b_RdwgriJTjG4t3hn8cIdSURke7W_SRpq_mQjYK7kZLmTWSgrEcykLnIYSDDAbCWD2Q5bWNmpXpIM3H4ERg4jyFXb-IDDwkqV-_8haWN1najFGHfufcU-YM8M36uS6FLt35qagV5Q/w640-h440/light-sense-3.png\" width=\"640\" /></a></div><div class=\"separator\" style=\"clear: both; text-align: left;\"><br /></div>To get timestamped output I am using <a href=\"https://freeware.the-meiers.org/\">CoolTerm</a> which will automatically save to a file and add timestamps. </div><div class=\"separator\" style=\"clear: both; text-align: left;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: left;\"><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7jHD3aMjlC14A1AvxHpk2sD7BDr1cti8yHmEVQ2QYz0p0935ip3Br3hFKKi1VHxff5vYjBsOg4FgK3N7AfAoK9AhD0L-BDt_IZxAzPOWWImTyyOR3z8FMJZhhAvqbCiwfcfvRITmJGdaeAmjokKtMFK14E1J-_ahX_dwctcTCLacHzvkBeMCPHA/s1624/light-sense-5.png\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"1344\" data-original-width=\"1624\" height=\"530\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7jHD3aMjlC14A1AvxHpk2sD7BDr1cti8yHmEVQ2QYz0p0935ip3Br3hFKKi1VHxff5vYjBsOg4FgK3N7AfAoK9AhD0L-BDt_IZxAzPOWWImTyyOR3z8FMJZhhAvqbCiwfcfvRITmJGdaeAmjokKtMFK14E1J-_ahX_dwctcTCLacHzvkBeMCPHA/w640-h530/light-sense-5.png\" width=\"640\" /></a></div></div><div class=\"separator\" style=\"clear: both; text-align: left;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: left;\">That light sensor via LED relies on the photovoltaic effect: when light strikes the PN junction inside the LED it creates a voltage (albeit a small one). But there's another way to measure the light hitting an LED.</div><h3 style=\"clear: both; text-align: left;\"><br /></h3><h3 style=\"clear: both; text-align: left;\">Reverse bias</h3><div class=\"separator\" style=\"clear: both; text-align: left;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: left;\">If the LED is reverse biased (i.e. connected to a voltage source the wrong way round) then it won't light up but it will <a href=\"https://playground.arduino.cc/Learning/LEDSensor/\">act as a capacitor that charges when light hits it</a>. So the idea is to reverse bias the LED using two digital pins on the Arduino (one set HIGH and one set LOW) and then remove the bias and measure how long the LED (acting as a capacitor) takes to discharge. The brighter the light the faster the discharge.</div><div class=\"separator\" style=\"clear: both; text-align: left;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: left;\">This can be achieved with a single LED connected between two digital pins like this: the +ve lead of the LED goes into the pin identified by LED_P and the -ve into the pin identified by LED_N.</div><div class=\"separator\" style=\"clear: both; text-align: left;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzcPt_arHEonZr14PoYz7qDp3W-2aUlU_2CqeAoqIAnLASKQHAkYcrVsfhN2V1wWd9dX7u0P-HRPSPc5AQBv6exjrCakObSKg4C0_KRzPzWPUA1i37Dlx_5qdMjCGLNMZXJqIBFt2FXf82TFps23Qechway9f20uBX7lNX0LBaAsnzRw-3dSJkjA/s578/light-sense-6.jpg\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"478\" data-original-width=\"578\" height=\"530\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzcPt_arHEonZr14PoYz7qDp3W-2aUlU_2CqeAoqIAnLASKQHAkYcrVsfhN2V1wWd9dX7u0P-HRPSPc5AQBv6exjrCakObSKg4C0_KRzPzWPUA1i37Dlx_5qdMjCGLNMZXJqIBFt2FXf82TFps23Qechway9f20uBX7lNX0LBaAsnzRw-3dSJkjA/w640-h530/light-sense-6.jpg\" width=\"640\" /></a></div><div class=\"separator\" style=\"clear: both; text-align: left;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: left;\">And here's the code.</div><div class=\"separator\" style=\"clear: both; text-align: left;\"><br /></div><blockquote style=\"border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;\"><div class=\"separator\" style=\"clear: both; text-align: left;\"><div class=\"separator\" style=\"clear: both;\"><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">#define LED_N 4</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">#define LED_P 5</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\"><br /></span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">void setup()</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">{</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">  Serial.begin(9600);</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">}</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\"><br /></span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">void loop()</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">{</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">  unsigned long maxtime = 5000;</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">  </span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">  pinMode(LED_N, OUTPUT);</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">  pinMode(LED_P, OUTPUT);</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">  digitalWrite(LED_N, HIGH);</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">  digitalWrite(LED_P, LOW);</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\"><br /></span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">  pinMode(LED_N, INPUT);</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">  digitalWrite(LED_N,LOW);</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\"><br /></span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">  unsigned long elapsed = 0;</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">  unsigned long start = millis();</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">  while ((digitalRead(LED_N) != 0) && (elapsed < maxtime)) {</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">    elapsed = millis() - start;</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">  }</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">  </span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">  Serial.println(elapsed);</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\"><br /></span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">  if (elapsed < maxtime) {</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">    delay(</span><span style=\"font-family: courier;\">maxtime - elapsed</span><span style=\"font-family: courier;\">);</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">  }</span></div><div class=\"separator\" style=\"clear: both;\"><span style=\"font-family: courier;\">}</span></div><div class=\"separator\" style=\"clear: both;\"><br /></div></div></div></blockquote><div class=\"separator\" style=\"clear: both; text-align: left;\"><div class=\"separator\" style=\"clear: both;\">I found this worked better than the first version with more sensitive output. Note that smaller numbers mean brighter here (whereas in the previous code smaller meant darker). Here's a plot showing me covering the LED twice with my hand, followed by shining a torch at it. Each time I let the LED be exposed to ambient light between tests.</div><div class=\"separator\" style=\"clear: both;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhU9XtvQK_LGnB-qHkJAj7oeXNiYMjBLMIql4tUTfgkRSH993an_KUcFhchLh8sCiwXIJMHL52zAAXzXCk9UC65DY5KPT48Wo9qiX8svrTdu6CqGxoz1b4TH2dSHjk6SOeMhg8FdWz2PaZ1opmDmKy3Y2JFkgo2bmsI29p0LC5Y5yAVkXltJfYa5g/s1908/light-sense-4.png\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"1314\" data-original-width=\"1908\" height=\"440\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhU9XtvQK_LGnB-qHkJAj7oeXNiYMjBLMIql4tUTfgkRSH993an_KUcFhchLh8sCiwXIJMHL52zAAXzXCk9UC65DY5KPT48Wo9qiX8svrTdu6CqGxoz1b4TH2dSHjk6SOeMhg8FdWz2PaZ1opmDmKy3Y2JFkgo2bmsI29p0LC5Y5yAVkXltJfYa5g/w640-h440/light-sense-4.png\" width=\"640\" /></a></div><div class=\"separator\" style=\"clear: both; text-align: center;\"><br /></div><h3 style=\"clear: both; text-align: left;\">In action</h3><div class=\"separator\" style=\"clear: both; text-align: center;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: left;\">Certainly looks like that motion sensor is turning the light on in the night uselessly.</div><div class=\"separator\" style=\"clear: both; text-align: left;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEguPSeXwgqstXmsa2s_b8K9nR3bMNPNekwykDxlX3o6_xjm3Tk0QMWvpZsx45ANjV9LSn0f9YnIA79IgKZ04dHZ3ashLcG2oC2YK8RfwkUSFtxWarNYRTqru7DH79E0b1aDqBAhJrjLSQAU0l66JOpbgmZOzGx4guMW8MAhvjGzQsLIAc7oGy7SLw/s1045/light-sense-7.png\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"646\" data-original-width=\"1045\" height=\"396\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEguPSeXwgqstXmsa2s_b8K9nR3bMNPNekwykDxlX3o6_xjm3Tk0QMWvpZsx45ANjV9LSn0f9YnIA79IgKZ04dHZ3ashLcG2oC2YK8RfwkUSFtxWarNYRTqru7DH79E0b1aDqBAhJrjLSQAU0l66JOpbgmZOzGx4guMW8MAhvjGzQsLIAc7oGy7SLw/w640-h396/light-sense-7.png\" width=\"640\" /></a></div></div>",
      "image": {
        "url": "https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXokF70rNbNS2w0ei9bHqVGaFi6KVXF6Cjlnd3Hp9yhhSD38FrvHTbdFRYr1JE4GUTywylxdFse1dKiBoO98IY3IYqpq8MSaUq6iAyq36rGKzgnli8gUKw_QmgleW2eJlX6Ns6MOukC_K3HvjRXfakGLjoHmCKL3Bj_-ful7Rz779ZPTy8UH-qXQ/s72-w640-h614-c/light-sense-1.jpg",
        "title": null
      },
      "media": [],
      "authors": [
        {
          "name": "Unknown",
          "email": "[email protected]",
          "url": null
        }
      ],
      "categories": [
        {
          "label": "hardware",
          "term": "hardware",
          "url": "http://www.blogger.com/atom/ns#"
        }
      ]
    },
    {
      "id": "tag:blogger.com,1999:blog-19303585.post-6968922646267599704",
      "title": "Acorn Computer Systems catalogue circa 1983",
      "description": null,
      "url": "http://blog.jgc.org/2024/06/acorn-computer-systems-catalogue-circa.html",
      "published": "2024-06-15T16:36:00.003Z",
      "updated": "2024-06-15T16:36:27.119Z",
      "content": "<p>I unearthed a catalogue that I'd picked up in around 1983 of <a href=\"https://en.wikipedia.org/wiki/Acorn_System\">Acorn Computer Systems</a>. This catalogue overlaps the BBC Micro era (which was released in 1981) as it goes up to the final Acorn System 5 (released in 1983).</p><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYB_ryt3FgR3bm1pwlfDV1jRwCeCUsS1mZT4i5TcAnMLi97PmT1pY10luDQifXwfB6Fj0ZSXRBQ9VoOkvtaGdVnmt7ewBTnwvOR4p4pFh_739x5QF68AsfJui7HOhTmfFyxXWmYI65F5pymISiQ6BvV-C4b-ApbQHJr_1chswGLAfu5wwTyePBmQ/s1820/acs-1.png\" imageanchor=\"1\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"1820\" data-original-width=\"1284\" height=\"640\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYB_ryt3FgR3bm1pwlfDV1jRwCeCUsS1mZT4i5TcAnMLi97PmT1pY10luDQifXwfB6Fj0ZSXRBQ9VoOkvtaGdVnmt7ewBTnwvOR4p4pFh_739x5QF68AsfJui7HOhTmfFyxXWmYI65F5pymISiQ6BvV-C4b-ApbQHJr_1chswGLAfu5wwTyePBmQ/w452-h640/acs-1.png\" width=\"452\" /></a></div><p>The Acorn Computer Systems were based on the <a href=\"https://en.wikipedia.org/wiki/Eurocard_(printed_circuit_board)\">Eurocard</a> format for PCBs that can be mounted in a standard chassis.</p><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhD9H3L4jE0uGxHaedCcbSJ_SgbU6JYz4oc2b4AJ8dPqUQZOQPeRXakUwiGR5PO5yuqN_x42FNkcbFS0J8lzilUEFFRLJDMFXRet23td9eTFXKGI1ykIZiQ1Ncs7Z5qPsqFR9S11CGTh6u8pcZMN6dQaQZYhJZ6I0t38UMjpzMlyZsqgkAHO3C18Q/s2576/acs-2.png\" imageanchor=\"1\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"1832\" data-original-width=\"2576\" height=\"456\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhD9H3L4jE0uGxHaedCcbSJ_SgbU6JYz4oc2b4AJ8dPqUQZOQPeRXakUwiGR5PO5yuqN_x42FNkcbFS0J8lzilUEFFRLJDMFXRet23td9eTFXKGI1ykIZiQ1Ncs7Z5qPsqFR9S11CGTh6u8pcZMN6dQaQZYhJZ6I0t38UMjpzMlyZsqgkAHO3C18Q/w640-h456/acs-2.png\" width=\"640\" /></a></div><div class=\"separator\" style=\"clear: both; text-align: center;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: left;\">The Eurocard format meant that you could design a system for your needs, including handling <a href=\"https://en.wikipedia.org/wiki/Prestel\">Prestel</a>/Teletext.</div><div class=\"separator\" style=\"clear: both; text-align: left;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsON78AbO8VJDb3GukdR6KseGoFfxzzegqHcwKs9puAVI21QtObA67KglXU33UgJYyODviq0jaAMATccfey2Vxgee6FdLqvol0VNFhomGJuWVmUhgzRiPIp_vzHyCmJ0l35ldp6ivogczNXRHJcudL5OtbeB6Bl0N5KDUPN05iZrgw7_9WTE8jwA/s2576/acs-3.png\" imageanchor=\"1\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"1832\" data-original-width=\"2576\" height=\"456\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsON78AbO8VJDb3GukdR6KseGoFfxzzegqHcwKs9puAVI21QtObA67KglXU33UgJYyODviq0jaAMATccfey2Vxgee6FdLqvol0VNFhomGJuWVmUhgzRiPIp_vzHyCmJ0l35ldp6ivogczNXRHJcudL5OtbeB6Bl0N5KDUPN05iZrgw7_9WTE8jwA/w640-h456/acs-3.png\" width=\"640\" /></a></div><div class=\"separator\" style=\"clear: both; text-align: left;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: left;\">And, of course, you could add RAM.</div><div class=\"separator\" style=\"clear: both; text-align: left;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNqOO-CoDyKGq8YC3uMyVJDC0Uyc0Bm8LRM99hWEWoZxXL5M36AyX1pxdcvX1KskI_93IIE1FvYZVF0ESfsF1MfEJ20_iHsAguH3MMyPLma1mR3fZVm5NSAtrLfzNi4M1kK4m4V-_63roMoIq36wIkGOeZicdjwr7ORBdj6LfBIfxqe6Mja9mSFA/s2576/acs-4.png\" imageanchor=\"1\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"1832\" data-original-width=\"2576\" height=\"456\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNqOO-CoDyKGq8YC3uMyVJDC0Uyc0Bm8LRM99hWEWoZxXL5M36AyX1pxdcvX1KskI_93IIE1FvYZVF0ESfsF1MfEJ20_iHsAguH3MMyPLma1mR3fZVm5NSAtrLfzNi4M1kK4m4V-_63roMoIq36wIkGOeZicdjwr7ORBdj6LfBIfxqe6Mja9mSFA/w640-h456/acs-4.png\" width=\"640\" /></a></div><div class=\"separator\" style=\"clear: both; text-align: center;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: left;\">A complete scan of the catalogue is available <a href=\"https://drive.google.com/file/d/1SuvuhgH5UQz12DHGqSy5rZFS4aavdGf7/view?usp=sharing\">here</a> as a PDF.</div>",
      "image": {
        "url": "https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYB_ryt3FgR3bm1pwlfDV1jRwCeCUsS1mZT4i5TcAnMLi97PmT1pY10luDQifXwfB6Fj0ZSXRBQ9VoOkvtaGdVnmt7ewBTnwvOR4p4pFh_739x5QF68AsfJui7HOhTmfFyxXWmYI65F5pymISiQ6BvV-C4b-ApbQHJr_1chswGLAfu5wwTyePBmQ/s72-w452-h640-c/acs-1.png",
        "title": null
      },
      "media": [],
      "authors": [
        {
          "name": "Unknown",
          "email": "[email protected]",
          "url": null
        }
      ],
      "categories": [
        {
          "label": "retro",
          "term": "retro",
          "url": "http://www.blogger.com/atom/ns#"
        }
      ]
    },
    {
      "id": "tag:blogger.com,1999:blog-19303585.post-5445303529809922034",
      "title": "Fixing my iPhone 13 Pro cameras at -18C",
      "description": null,
      "url": "http://blog.jgc.org/2024/06/fixing-my-iphone-13-pro-cameras-at-18c.html",
      "published": "2024-06-05T17:29:00.007Z",
      "updated": "2024-06-07T16:20:02.448Z",
      "content": "<p>Look, I don't recommend you do this with your phone because bad things may happen, but the front and back cameras on my iPhone 13 Pro stopped working (in the camera app the image was black) and I \"fixed\" them myself using only a household appliance. </p><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjO4w9hVxSZm6TGzsmvw1GUKUb4eN109N4zqYyIE_Ptj3ZqOS8whM9P6Dao0TQBFvakuNjRm-9_7HFkAuTOqQDqtRue0wpcP2p2yMyyfyOan4OTsyaWrVmkoqoLzJMuLN8LXDh8aAyiPyzJi-8aQv23U11opY56U-ylSyLFGmAC4pVOKf9kjGl_wg/s1082/255k-1.jpeg\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"1082\" data-original-width=\"500\" height=\"400\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjO4w9hVxSZm6TGzsmvw1GUKUb4eN109N4zqYyIE_Ptj3ZqOS8whM9P6Dao0TQBFvakuNjRm-9_7HFkAuTOqQDqtRue0wpcP2p2yMyyfyOan4OTsyaWrVmkoqoLzJMuLN8LXDh8aAyiPyzJi-8aQv23U11opY56U-ylSyLFGmAC4pVOKf9kjGl_wg/w185-h400/255k-1.jpeg\" width=\"185\" /></a></div><p>I was planning to get them replaced but to do that I'd need to replace the screen (because it has a crack in it) and it turned out to be €€€ so I figured I'd soldier on with a phone with a broken camera. Oddly, the flashlight still worked and FaceID.</p><p>But, hey, in the past I'd retrieved <a href=\"https://blog.jgc.org/2023/08/retrieving-1tb-of-data-from-faulty.html\">1TB of data using woodworking tools</a> and this camera problem looked like yet another small connection fault to me. And connection faults like this shout \"cool the thing down\" to me, so I figured it was worth a try cooling the phone down (a lot). To be fair, I don't have a case on my phone have dropped it a few times.</p><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJ-0hfZKAopa8bT_2U6yRCeIu5DMg3xLsOQxdx02inFIY4wuQvohZhTTFrxEDNzE4WmPvotdsXOklojkpKMSYnz-MlkvtBM97hlNRwFNedJ_2PBT9u658mCjlbSNZNjUtMfqBMv_gS3Q8dSaB-WMWRVxxjOVnRgk90IIj3PGVWr5HCl9xcNKsWkQ/s500/255k-3.jpg\" imageanchor=\"1\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"342\" data-original-width=\"500\" height=\"274\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJ-0hfZKAopa8bT_2U6yRCeIu5DMg3xLsOQxdx02inFIY4wuQvohZhTTFrxEDNzE4WmPvotdsXOklojkpKMSYnz-MlkvtBM97hlNRwFNedJ_2PBT9u658mCjlbSNZNjUtMfqBMv_gS3Q8dSaB-WMWRVxxjOVnRgk90IIj3PGVWr5HCl9xcNKsWkQ/w400-h274/255k-3.jpg\" width=\"400\" /></a></div><p>Apple says the <a href=\"https://support.apple.com/en-gb/guide/iphone/iphbbe12ba1/\">iPhone can be stored at -20C switched off</a> and a quick check of my freezer showed it was at -18C. So, one switched off iPhone in a ziplock bag and fifteen minutes later I had a phone with working cameras again.</p><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjiZ-5OQdBlGA7FvhMSapl4b5aFORcG4EBFqceijo_ckLLkK1QI_IXMHg-nfZTm1MFbsQHZE-hvQlKJTnsIjaNB9nMhaeQJ0GL0uacI_dz-z-mNx8NO58d7xv2DZjj0wRHGCFZiTV391Rs-iOPLBsfjNHaFcH9_DzbXO1jwAumMGJ-VHaIt3iKlUA/s747/255k-2.jpg\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"747\" data-original-width=\"500\" height=\"400\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjiZ-5OQdBlGA7FvhMSapl4b5aFORcG4EBFqceijo_ckLLkK1QI_IXMHg-nfZTm1MFbsQHZE-hvQlKJTnsIjaNB9nMhaeQJ0GL0uacI_dz-z-mNx8NO58d7xv2DZjj0wRHGCFZiTV391Rs-iOPLBsfjNHaFcH9_DzbXO1jwAumMGJ-VHaIt3iKlUA/w268-h400/255k-2.jpg\" width=\"268\" /></a></div><p>And a battery that needed recharging.</p>",
      "image": {
        "url": "https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjO4w9hVxSZm6TGzsmvw1GUKUb4eN109N4zqYyIE_Ptj3ZqOS8whM9P6Dao0TQBFvakuNjRm-9_7HFkAuTOqQDqtRue0wpcP2p2yMyyfyOan4OTsyaWrVmkoqoLzJMuLN8LXDh8aAyiPyzJi-8aQv23U11opY56U-ylSyLFGmAC4pVOKf9kjGl_wg/s72-w185-h400-c/255k-1.jpeg",
        "title": null
      },
      "media": [],
      "authors": [
        {
          "name": "Unknown",
          "email": "[email protected]",
          "url": null
        }
      ],
      "categories": [
        {
          "label": "pseudo-randomness",
          "term": "pseudo-randomness",
          "url": null
        },
        {
          "label": "hardware",
          "term": "hardware",
          "url": null
        },
        {
          "label": "babbage",
          "term": "babbage",
          "url": null
        },
        {
          "label": "gaga",
          "term": "gaga",
          "url": null
        },
        {
          "label": "anti-spam",
          "term": "anti-spam",
          "url": null
        },
        {
          "label": "gnu make",
          "term": "gnu make",
          "url": null
        },
        {
          "label": "retro",
          "term": "retro",
          "url": null
        },
        {
          "label": "security",
          "term": "security",
          "url": null
        },
        {
          "label": "codes and ciphers",
          "term": "codes and ciphers",
          "url": null
        },
        {
          "label": "the geek atlas",
          "term": "the geek atlas",
          "url": null
        },
        {
          "label": "rants and raves",
          "term": "rants and raves",
          "url": null
        },
        {
          "label": "alan turing",
          "term": "alan turing",
          "url": null
        },
        {
          "label": "hits",
          "term": "hits",
          "url": null
        },
        {
          "label": "mathematics",
          "term": "mathematics",
          "url": null
        },
        {
          "label": "climate change",
          "term": "climate change",
          "url": null
        },
        {
          "label": "perl",
          "term": "perl",
          "url": null
        },
        {
          "label": "calculators",
          "term": "calculators",
          "url": null
        },
        {
          "label": "google go",
          "term": "google go",
          "url": null
        },
        {
          "label": "minitel",
          "term": "minitel",
          "url": null
        },
        {
          "label": "toys",
          "term": "toys",
          "url": null
        },
        {
          "label": "behind the screens",
          "term": "behind the screens",
          "url": null
        },
        {
          "label": "clocks",
          "term": "clocks",
          "url": null
        },
        {
          "label": "machine learning",
          "term": "machine learning",
          "url": null
        },
        {
          "label": "babygaga",
          "term": "babygaga",
          "url": null
        },
        {
          "label": "games",
          "term": "games",
          "url": null
        },
        {
          "label": "arc",
          "term": "arc",
          "url": null
        },
        {
          "label": "my services",
          "term": "my services",
          "url": null
        },
        {
          "label": "popfile",
          "term": "popfile",
          "url": null
        },
        {
          "label": "cansole",
          "term": "cansole",
          "url": null
        },
        {
          "label": "facebook",
          "term": "facebook",
          "url": null
        },
        {
          "label": "privacy",
          "term": "privacy",
          "url": null
        },
        {
          "label": "radio",
          "term": "radio",
          "url": null
        },
        {
          "label": "well... actually",
          "term": "well... actually",
          "url": null
        }
      ]
    },
    {
      "id": "tag:blogger.com,1999:blog-19303585.post-4308511000929231325",
      "title": "Controlling the Taylor Swift Eras Tour wristbands with Flipper Zero",
      "description": null,
      "url": "http://blog.jgc.org/2024/05/controlling-taylor-swift-eras-tour.html",
      "published": "2024-05-27T16:55:00.004Z",
      "updated": "2024-09-12T08:58:20.564Z",
      "content": "<p>Many large concerts feature wristbands that light up on command. They are used to produce varied visual effects across a stadium. One company that makes these is <a href=\"https://pixmob.com/\">PixMob</a>. Their controllable, illuminated wristbands are currently being used as part of <a href=\"https://en.wikipedia.org/wiki/The_Eras_Tour\">Taylor Swift's Eras Tour</a>. A short Wired article <a href=\"https://wired.me/technology/the-tech-behind-taylor-swift-concert-wristbands/\">here</a> gives some details and here's a video from the Wall Street Journal:</p><div style=\"text-align: center;\"><iframe allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" allowfullscreen=\"\" frameborder=\"0\" height=\"315\" referrerpolicy=\"strict-origin-when-cross-origin\" src=\"https://www.youtube.com/embed/GCsmZA08oD8?si=e3755KHJFdna_zBV\" title=\"YouTube video player\" width=\"560\"></iframe></div><p>For the Eras Tour the company's X2 product is being used. It looks like this:</p><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQg9Q19zegc3hBuX2vNtiBNssn2XKYwLKBcAw1y34T1bEwMY3ITvksGMnVa4Ifzt_yaCsWHZf8AJjHRMoiodRsSMp8nKfm13E-oldA1RQ9UEqRxJkF98UzunZfGwo49Nwp7xjCMGl56Prugv67T6tXT9msEmRpl2FDuvLMXef31xgDZij7j-5sdg/s3731/eras-1.jpg\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"1340\" data-original-width=\"3731\" height=\"230\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQg9Q19zegc3hBuX2vNtiBNssn2XKYwLKBcAw1y34T1bEwMY3ITvksGMnVa4Ifzt_yaCsWHZf8AJjHRMoiodRsSMp8nKfm13E-oldA1RQ9UEqRxJkF98UzunZfGwo49Nwp7xjCMGl56Prugv67T6tXT9msEmRpl2FDuvLMXef31xgDZij7j-5sdg/w640-h230/eras-1.jpg\" width=\"640\" /></a></div><div class=\"separator\" style=\"clear: both; text-align: center;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: left;\">Since these wristbands are designed for reuse they are easily opened revealing two batteries and a lovely little circuit board:</div><div class=\"separator\" style=\"clear: both; text-align: left;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQsQ3X_JVN4fln9WOBbyohyphenhyphenrSuV8jFu_Cm-oYlf9pa7o5_2pv4AEzpDbRNTPGZcfA4bDvzVM_4qpvNB-jZRUuawJo28u9fjCIFNDXEh8SkR5TYxMGBi3B9qNBfNOf6ihbqAn23fhXdwywkCpLqO1nNZ6IroifiZtGkviBfCfKDQtivvgyy07zg-g/s2823/eras-2.jpg\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"2234\" data-original-width=\"2823\" height=\"506\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQsQ3X_JVN4fln9WOBbyohyphenhyphenrSuV8jFu_Cm-oYlf9pa7o5_2pv4AEzpDbRNTPGZcfA4bDvzVM_4qpvNB-jZRUuawJo28u9fjCIFNDXEh8SkR5TYxMGBi3B9qNBfNOf6ihbqAn23fhXdwywkCpLqO1nNZ6IroifiZtGkviBfCfKDQtivvgyy07zg-g/w640-h506/eras-2.jpg\" width=\"640\" /></a></div><div class=\"separator\" style=\"clear: both; text-align: center;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: left;\">Here's that circuit board with the copyright date of 20230629, clear markings of the components and a little palm tree next to PALM V2.6r1. It does look \"Designed with 🖤 in Montréal\"!</div><div class=\"separator\" style=\"clear: both; text-align: left;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgu9JtblHe06nqdgEHaGGxg7jAha5zSxrJnkZYcUoCdAz3jHfeZ07_9waLR0RW8SvvyjkHfDqz_ak_M0bIZCrE0v-08Q5raviX844Mgm_bZf9gpQROLKtlUwuatt0_2ErTXD6HEAsR-vCm8HmYFADwmYYJo490ez5xksNqmlm8v63vBefTl6PQqCg/s3483/eras-3.jpg\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"1996\" data-original-width=\"3483\" height=\"366\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgu9JtblHe06nqdgEHaGGxg7jAha5zSxrJnkZYcUoCdAz3jHfeZ07_9waLR0RW8SvvyjkHfDqz_ak_M0bIZCrE0v-08Q5raviX844Mgm_bZf9gpQROLKtlUwuatt0_2ErTXD6HEAsR-vCm8HmYFADwmYYJo490ez5xksNqmlm8v63vBefTl6PQqCg/w640-h366/eras-3.jpg\" width=\"640\" /></a></div><div class=\"separator\" style=\"clear: both; text-align: center;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: left;\">On that board are two RGB LEDs, a little microcontroller, a little bit of EEPROM and an infrared diode to receive a signal. So, simply put, PixMob works by installed a really big (and moveable) IR remote control (you can read about this on their website <a href=\"https://pixmob.com/our-effects\">here</a>) and transmitting commands to the bracelets to produce colours, fades, flashes, etc. Cute.</div><div class=\"separator\" style=\"clear: both; text-align: left;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: left;\">There are a bunch of hardware details <a href=\"https://yeokhengmeng.com/2019/08/teardown-of-ndp2019-led-wristband/\">here</a>.</div><div class=\"separator\" style=\"clear: both; text-align: left;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: left;\">Since they are projecting infrared with moveable projector they can sweep effects around the stadium, and cover the projector with cut outs to make things like hearts. It's simple technology that works very nicely. And, of course, there's a reverse engineering community built up around this.</div><div class=\"separator\" style=\"clear: both; text-align: left;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: left;\">The best place to start learning about that is <a href=\"https://github.com/danielweidman/pixmob-ir-reverse-engineering\">this</a> GitHub repository. It brings together a bunch of reverse engineering efforts that have looked into the IR protocol. These have been somewhat successful and, since the <a href=\"https://flipperzero.one/\">Flipper Zero</a> has IR capability, there's a <a href=\"https://github.com/danielweidman/flipper-pixmob-ir-codes\">project</a> that makes it control the wristband.</div><div class=\"separator\" style=\"clear: both; text-align: left;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: left;\">Here's a short video of me making the wristbands fade orange.</div><br /><iframe allow=\"accelerometer; gyroscope; autoplay; encrypted-media; picture-in-picture;\" allowfullscreen=\"true\" loading=\"lazy\" src=\"https://customer-rww76yind8iym5aw.cloudflarestream.com/e2e26c96afd3438d0114d293ec4c0cac/iframe?poster=https%3A%2F%2Fcustomer-rww76yind8iym5aw.cloudflarestream.com%2Fe2e26c96afd3438d0114d293ec4c0cac%2Fthumbnails%2Fthumbnail.jpg%3Ftime%3D%26height%3D600\" style=\"border: none; height: 400px; left: 0; position: relative; top: 0; width: 100%;\"></iframe><div class=\"separator\" style=\"clear: both; text-align: left;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: left;\">Such nice simple technology that produces very cool effects.</div><div class=\"separator\" style=\"clear: both; text-align: left;\"></div>",
      "image": {
        "url": "https://img.youtube.com/vi/GCsmZA08oD8/default.jpg",
        "title": null
      },
      "media": [],
      "authors": [
        {
          "name": "Unknown",
          "email": "[email protected]",
          "url": null
        }
      ],
      "categories": [
        {
          "label": "hits",
          "term": "hits",
          "url": "http://www.blogger.com/atom/ns#"
        },
        {
          "label": "pseudo-randomness",
          "term": "pseudo-randomness",
          "url": "http://www.blogger.com/atom/ns#"
        }
      ]
    },
    {
      "id": "tag:blogger.com,1999:blog-19303585.post-974739914720448872",
      "title": "The Economist's ugly new print typeface",
      "description": null,
      "url": "http://blog.jgc.org/2024/04/the-economists-ugly-new-print-typeface.html",
      "published": "2024-04-11T12:22:00.000Z",
      "updated": "2024-04-11T12:22:22.922Z",
      "content": "Turning to the back page of a recent copy of The Economist to read the obituary of <a href=\"https://www.economist.com/obituary/2024/04/03/paul-alexander-lived-longer-than-anyone-in-an-iron-lung\">Paul Alexander</a> the eye is assaulted by The Economist's <a href=\"https://www.economist.com/the-economist-explains/2024/02/07/why-has-the-economist-changed-its-typeface\">new, ugly, hard-to-read typeface</a> (which came about because: \"In early 2023, as our font licence was coming up for renewal, we decided that we wanted to create something unique to The Economist.\") <div><br /></div><div>The very first letter of the obituary, the drop capital, seems set adrift from the rest of the word it belongs to and about to slam into a letter on the following line. This really bugs me,<div><br /></div><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghV9qeDSGH6Ovc6e5iAMyqf49Eu0IPh119LHE9auqRtrdu1O2kyDw43UUcsBFErDJVJonAm8w8y6lyL1ep8B101kuPajzafqdt-HPl-3bBI7gd-rAPBSewzvy_7i86UQdPBJzxMvtS4Hm4USPFp-Bf-5khaE7oOqsqlB7VdxZwqcDhkmKZUamXuA/s1243/economist-1.jpg\" imageanchor=\"1\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"317\" data-original-width=\"1243\" height=\"163\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghV9qeDSGH6Ovc6e5iAMyqf49Eu0IPh119LHE9auqRtrdu1O2kyDw43UUcsBFErDJVJonAm8w8y6lyL1ep8B101kuPajzafqdt-HPl-3bBI7gd-rAPBSewzvy_7i86UQdPBJzxMvtS4Hm4USPFp-Bf-5khaE7oOqsqlB7VdxZwqcDhkmKZUamXuA/w640-h163/economist-1.jpg\" width=\"640\" /></a></div><br /><div>The problems don't stop with drop capitals. Here's a short part of the article <a href=\"https://www.economist.com/united-states/2024/04/04/the-biden-campaign-in-michigan-has-a-tremendous-ground-game-advantage\">The Biden campaign in Michigan has a tremendous ground-game advantage</a>. The W from Wolverine seems to be about snag on the g of campaign.</div><div><br /></div><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFvtQ8nmx_4FA6ouIMAY-hPCFMgxzOhqbTzslvyTOwM4_SwRlQ14EtFOz1weN6Iqq_NmYDP6XjNI67EPpzzllYqn-dcKKIBRTEAGvMgHxZdSjvHjFjzEvFyRsEs-DepJY7283m4kxp9XdRiKBmwgpqYm7BlMPnSOgWZub_3nvmjQt7Du-0i-h6XA/s847/economist-2.jpg\" imageanchor=\"1\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"260\" data-original-width=\"847\" height=\"196\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFvtQ8nmx_4FA6ouIMAY-hPCFMgxzOhqbTzslvyTOwM4_SwRlQ14EtFOz1weN6Iqq_NmYDP6XjNI67EPpzzllYqn-dcKKIBRTEAGvMgHxZdSjvHjFjzEvFyRsEs-DepJY7283m4kxp9XdRiKBmwgpqYm7BlMPnSOgWZub_3nvmjQt7Du-0i-h6XA/w640-h196/economist-2.jpg\" width=\"640\" /></a></div><br /><div>And here's a little bit of <a href=\"https://www.economist.com/the-americas/2024/04/04/justin-trudeau-is-beset-by-a-divided-party-and-an-angry-electorate\">Justin Trudeau is beset by a divided party and an angry electorate</a>. The gg in staggering and the T in The draw the eye to their closeness. The overall effect in this excerpt is that some lines seem closer together than others.</div><div><br /></div><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhilAeEgDN-pajI_J5k5XzY7OX80s1diWLIYG42qpnpRoxnvzPBP-ckDrjv8_QdhyphenhyphenWQAsEB1zB9UIryzOeUu-tqgXedTlTD_AHLGsL3KqlTvGcXSU6nVk1FRSx9IM3oBZI-nmw-_uMpMYUzI1L-lF-FSdxJaX1ZsXcrZn-csvoJHG1aayureHu2ig/s858/economist-3.jpg\" imageanchor=\"1\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"352\" data-original-width=\"858\" height=\"262\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhilAeEgDN-pajI_J5k5XzY7OX80s1diWLIYG42qpnpRoxnvzPBP-ckDrjv8_QdhyphenhyphenWQAsEB1zB9UIryzOeUu-tqgXedTlTD_AHLGsL3KqlTvGcXSU6nVk1FRSx9IM3oBZI-nmw-_uMpMYUzI1L-lF-FSdxJaX1ZsXcrZn-csvoJHG1aayureHu2ig/w640-h262/economist-3.jpg\" width=\"640\" /></a></div><div class=\"separator\" style=\"clear: both; text-align: center;\"><br /></div>The new typeface makes the print edition of The Economist hard to read. As the eye scans across the page it snags on lines that seem on a collision course. And at the end of a line finding the corresponding next line is harder than before.<div><br /></div><div><div>These problems do not occur when the new typeface is used online. Something about the line spacing in print makes the new typeface hard to read on paper and easy on screen. Perhaps print doesn't matter any more to The Economist. In the article about the new typeface they say that \"Most of our readers subscribe to us digitally\". </div></div></div>",
      "image": {
        "url": "https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghV9qeDSGH6Ovc6e5iAMyqf49Eu0IPh119LHE9auqRtrdu1O2kyDw43UUcsBFErDJVJonAm8w8y6lyL1ep8B101kuPajzafqdt-HPl-3bBI7gd-rAPBSewzvy_7i86UQdPBJzxMvtS4Hm4USPFp-Bf-5khaE7oOqsqlB7VdxZwqcDhkmKZUamXuA/s72-w640-h163-c/economist-1.jpg",
        "title": null
      },
      "media": [],
      "authors": [
        {
          "name": "Unknown",
          "email": "[email protected]",
          "url": null
        }
      ],
      "categories": [
        {
          "label": "pseudo-randomness",
          "term": "pseudo-randomness",
          "url": null
        },
        {
          "label": "hardware",
          "term": "hardware",
          "url": null
        },
        {
          "label": "babbage",
          "term": "babbage",
          "url": null
        },
        {
          "label": "gaga",
          "term": "gaga",
          "url": null
        },
        {
          "label": "anti-spam",
          "term": "anti-spam",
          "url": null
        },
        {
          "label": "gnu make",
          "term": "gnu make",
          "url": null
        },
        {
          "label": "retro",
          "term": "retro",
          "url": null
        },
        {
          "label": "security",
          "term": "security",
          "url": null
        },
        {
          "label": "codes and ciphers",
          "term": "codes and ciphers",
          "url": null
        },
        {
          "label": "the geek atlas",
          "term": "the geek atlas",
          "url": null
        },
        {
          "label": "rants and raves",
          "term": "rants and raves",
          "url": null
        },
        {
          "label": "alan turing",
          "term": "alan turing",
          "url": null
        },
        {
          "label": "hits",
          "term": "hits",
          "url": null
        },
        {
          "label": "mathematics",
          "term": "mathematics",
          "url": null
        },
        {
          "label": "climate change",
          "term": "climate change",
          "url": null
        },
        {
          "label": "perl",
          "term": "perl",
          "url": null
        },
        {
          "label": "calculators",
          "term": "calculators",
          "url": null
        },
        {
          "label": "google go",
          "term": "google go",
          "url": null
        },
        {
          "label": "minitel",
          "term": "minitel",
          "url": null
        },
        {
          "label": "toys",
          "term": "toys",
          "url": null
        },
        {
          "label": "behind the screens",
          "term": "behind the screens",
          "url": null
        },
        {
          "label": "clocks",
          "term": "clocks",
          "url": null
        },
        {
          "label": "machine learning",
          "term": "machine learning",
          "url": null
        },
        {
          "label": "babygaga",
          "term": "babygaga",
          "url": null
        },
        {
          "label": "games",
          "term": "games",
          "url": null
        },
        {
          "label": "arc",
          "term": "arc",
          "url": null
        },
        {
          "label": "my services",
          "term": "my services",
          "url": null
        },
        {
          "label": "popfile",
          "term": "popfile",
          "url": null
        },
        {
          "label": "cansole",
          "term": "cansole",
          "url": null
        },
        {
          "label": "facebook",
          "term": "facebook",
          "url": null
        },
        {
          "label": "privacy",
          "term": "privacy",
          "url": null
        },
        {
          "label": "radio",
          "term": "radio",
          "url": null
        },
        {
          "label": "well... actually",
          "term": "well... actually",
          "url": null
        }
      ]
    },
    {
      "id": "tag:blogger.com,1999:blog-19303585.post-1499907955973408015",
      "title": "The formal development of secure systems (my 1992 doctoral thesis)",
      "description": null,
      "url": "http://blog.jgc.org/2024/03/the-formal-development-of-secure.html",
      "published": "2024-03-13T17:54:00.005Z",
      "updated": "2024-03-13T17:55:56.255Z",
      "content": "<p>Since this doesn't seem to be findable online anywhere here's <a href=\"https://jgc.org/jgc-thesis.pdf\">a PDF generated from the original .tex files</a> that I kept on a floppy for 30 years!</p><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPr9V1X6gahw9x5YhG_1dOF0m5vM937lO4xgvtxdLhLrp_x9Sv9pPatWgfXfKyV-td-TG1AlcCofPoy8zAubokQmL64wxKTpc8T7FYfa9y-at545Yr06_Y62XK5G49H9wEJCcmSIiwmGFprTUodBHyoltlEDhEbG7ad7_7nYlarcI9ljCxD97x4A/s1828/thesis-1.png\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"1828\" data-original-width=\"1294\" height=\"640\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPr9V1X6gahw9x5YhG_1dOF0m5vM937lO4xgvtxdLhLrp_x9Sv9pPatWgfXfKyV-td-TG1AlcCofPoy8zAubokQmL64wxKTpc8T7FYfa9y-at545Yr06_Y62XK5G49H9wEJCcmSIiwmGFprTUodBHyoltlEDhEbG7ad7_7nYlarcI9ljCxD97x4A/w454-h640/thesis-1.png\" width=\"454\" /></a></div><br /><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjA7oV4zi-An_TKRShSa1bZYhhxn0r3ueZ9pVZNnZTi-8tlBQguQst-QRYZm8kBdbchHU1p3TCyMAp8SKgaaag_Ie_VqxQKkex7zasZI2rSCtjsAToN5JUeVLUxY8_rz1coao2aTHkMXXiN-Qo0NasrOI1Tj3CZHFO3HCPLqvH2DLzaOH4HIuxJmw/s1828/thesis-2.png\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"1828\" data-original-width=\"1294\" height=\"640\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjA7oV4zi-An_TKRShSa1bZYhhxn0r3ueZ9pVZNnZTi-8tlBQguQst-QRYZm8kBdbchHU1p3TCyMAp8SKgaaag_Ie_VqxQKkex7zasZI2rSCtjsAToN5JUeVLUxY8_rz1coao2aTHkMXXiN-Qo0NasrOI1Tj3CZHFO3HCPLqvH2DLzaOH4HIuxJmw/w454-h640/thesis-2.png\" width=\"454\" /></a></div><div><br /></div>If you're curious about formal methods and computer security in 1992, or just want to read some <a href=\"https://en.wikipedia.org/wiki/Communicating_sequential_processes\">CSP</a> and <a href=\"https://en.wikipedia.org/wiki/Occam_(programming_language)\">occam</a> code, you may enjoy it. It does get a little technical:<div><br /></div><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjA6DyYdI95wN_Kt1-y7BXDj3kgF5r5L1IeOeTVnLGLsub9koKlN8WaLLE1Snc-NppZmsxQ0D7b5V25BDgSYtABQKbDgc7vtBbfxqEwg7ZNrW4EvNO4ZsisCJcSuWtuyVLZzxJZg_ttld1eVUNyInF4BrbLHMlKm9B3ENlqTIqsZDbG90ASSHpUg/s1828/thesis-3.png\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"1828\" data-original-width=\"1294\" height=\"640\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjA6DyYdI95wN_Kt1-y7BXDj3kgF5r5L1IeOeTVnLGLsub9koKlN8WaLLE1Snc-NppZmsxQ0D7b5V25BDgSYtABQKbDgc7vtBbfxqEwg7ZNrW4EvNO4ZsisCJcSuWtuyVLZzxJZg_ttld1eVUNyInF4BrbLHMlKm9B3ENlqTIqsZDbG90ASSHpUg/w454-h640/thesis-3.png\" width=\"454\" /></a></div>",
      "image": {
        "url": "https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPr9V1X6gahw9x5YhG_1dOF0m5vM937lO4xgvtxdLhLrp_x9Sv9pPatWgfXfKyV-td-TG1AlcCofPoy8zAubokQmL64wxKTpc8T7FYfa9y-at545Yr06_Y62XK5G49H9wEJCcmSIiwmGFprTUodBHyoltlEDhEbG7ad7_7nYlarcI9ljCxD97x4A/s72-w454-h640-c/thesis-1.png",
        "title": null
      },
      "media": [],
      "authors": [
        {
          "name": "Unknown",
          "email": "[email protected]",
          "url": null
        }
      ],
      "categories": [
        {
          "label": "pseudo-randomness",
          "term": "pseudo-randomness",
          "url": null
        },
        {
          "label": "hardware",
          "term": "hardware",
          "url": null
        },
        {
          "label": "babbage",
          "term": "babbage",
          "url": null
        },
        {
          "label": "gaga",
          "term": "gaga",
          "url": null
        },
        {
          "label": "anti-spam",
          "term": "anti-spam",
          "url": null
        },
        {
          "label": "gnu make",
          "term": "gnu make",
          "url": null
        },
        {
          "label": "retro",
          "term": "retro",
          "url": null
        },
        {
          "label": "security",
          "term": "security",
          "url": null
        },
        {
          "label": "codes and ciphers",
          "term": "codes and ciphers",
          "url": null
        },
        {
          "label": "the geek atlas",
          "term": "the geek atlas",
          "url": null
        },
        {
          "label": "rants and raves",
          "term": "rants and raves",
          "url": null
        },
        {
          "label": "alan turing",
          "term": "alan turing",
          "url": null
        },
        {
          "label": "hits",
          "term": "hits",
          "url": null
        },
        {
          "label": "mathematics",
          "term": "mathematics",
          "url": null
        },
        {
          "label": "climate change",
          "term": "climate change",
          "url": null
        },
        {
          "label": "perl",
          "term": "perl",
          "url": null
        },
        {
          "label": "calculators",
          "term": "calculators",
          "url": null
        },
        {
          "label": "google go",
          "term": "google go",
          "url": null
        },
        {
          "label": "minitel",
          "term": "minitel",
          "url": null
        },
        {
          "label": "toys",
          "term": "toys",
          "url": null
        },
        {
          "label": "behind the screens",
          "term": "behind the screens",
          "url": null
        },
        {
          "label": "clocks",
          "term": "clocks",
          "url": null
        },
        {
          "label": "machine learning",
          "term": "machine learning",
          "url": null
        },
        {
          "label": "babygaga",
          "term": "babygaga",
          "url": null
        },
        {
          "label": "games",
          "term": "games",
          "url": null
        },
        {
          "label": "arc",
          "term": "arc",
          "url": null
        },
        {
          "label": "my services",
          "term": "my services",
          "url": null
        },
        {
          "label": "popfile",
          "term": "popfile",
          "url": null
        },
        {
          "label": "cansole",
          "term": "cansole",
          "url": null
        },
        {
          "label": "facebook",
          "term": "facebook",
          "url": null
        },
        {
          "label": "privacy",
          "term": "privacy",
          "url": null
        },
        {
          "label": "radio",
          "term": "radio",
          "url": null
        },
        {
          "label": "well... actually",
          "term": "well... actually",
          "url": null
        }
      ]
    },
    {
      "id": "tag:blogger.com,1999:blog-19303585.post-6683007227968107268",
      "title": "Taschen, Acorn and Knoll's Law",
      "description": null,
      "url": "http://blog.jgc.org/2024/03/taschen-acorn-and-knolls-law.html",
      "published": "2024-03-13T09:06:00.003Z",
      "updated": "2024-03-13T10:31:19.587Z",
      "content": "<p>I have a copy of Taschen's huge book <a href=\"https://www.taschen.com/en/books/popculture/04692/the-computer\">The Computer</a>. 472 pages of computer history with lots of lovely photographs.</p><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheoT_uB9SbbnOoCjcAqXc1datswx92Hq9vHSJ-DU5hCn05tGCF_3n9KjGcrU7eMcL-c8WQDKcH-8WhVjNe3HR1MIpLTmp9x8r6OkuoWuViCL_oRsWgwKeupH08DG8efLcHTV9stZyB3-wyE8wB9T45fjn8vt4W0ju7MwTvx0x3GiLF-yL9Vzc8ww/s1004/book.png\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"1004\" data-original-width=\"674\" height=\"640\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheoT_uB9SbbnOoCjcAqXc1datswx92Hq9vHSJ-DU5hCn05tGCF_3n9KjGcrU7eMcL-c8WQDKcH-8WhVjNe3HR1MIpLTmp9x8r6OkuoWuViCL_oRsWgwKeupH08DG8efLcHTV9stZyB3-wyE8wB9T45fjn8vt4W0ju7MwTvx0x3GiLF-yL9Vzc8ww/w430-h640/book.png\" width=\"430\" /></a></div><p>Which is great, except that I turned to the page that covers one of the computers I know well, the <a href=\"https://en.wikipedia.org/wiki/BBC_Micro\">BBC Micro</a>, and see this:</p><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIs3Hspf8ci09EX9FljbKSUhWryOz3RJAxB1AbeTabozF_KU4_Rm4DcIQdu7VUzJAqXsc1AiIjvvi0H4zqhIRlig_lwcEH9LvZmFiPpXZqr-LTAEykE9Gilg3E_FlAGZaUVNw4-Ns7GViGWuZPz_lir_RCGb_fhf2or8Mc9X3u_P77PjNrfhKhhQ/s3220/amneisa.jpg\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"1752\" data-original-width=\"3220\" height=\"348\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIs3Hspf8ci09EX9FljbKSUhWryOz3RJAxB1AbeTabozF_KU4_Rm4DcIQdu7VUzJAqXsc1AiIjvvi0H4zqhIRlig_lwcEH9LvZmFiPpXZqr-LTAEykE9Gilg3E_FlAGZaUVNw4-Ns7GViGWuZPz_lir_RCGb_fhf2or8Mc9X3u_P77PjNrfhKhhQ/w640-h348/amneisa.jpg\" width=\"640\" /></a></div><div class=\"separator\" style=\"clear: both; text-align: center;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: left;\">Which, at first glance, look fine, or rather it doesn't. The machine on the right is not an \"Acorn BBC Micro, 1981\", it's an \"Acorn BBC Master 128, 1986\". Sure, it's part of the BBC Micro line of computers but it's not what the caption says.</div><div class=\"separator\" style=\"clear: both; text-align: left;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: left;\">So now I'm stuck looking at the book thinking about Knoll's Law of Media Accuracy: \"Everything you read in the newspapers is absolutely true except for the rare story of which you happen to have firsthand knowledge.\"</div><div class=\"separator\" style=\"clear: both; text-align: left;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: left;\">PS Also, I'd argue that Acorn did \"stand a chance in the face of competition from Silicon Valley\" because it pivoted (as the Silicon Valley types like to say) into <a href=\"https://www.arm.com/\">Arm</a>.</div>",
      "image": {
        "url": "https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheoT_uB9SbbnOoCjcAqXc1datswx92Hq9vHSJ-DU5hCn05tGCF_3n9KjGcrU7eMcL-c8WQDKcH-8WhVjNe3HR1MIpLTmp9x8r6OkuoWuViCL_oRsWgwKeupH08DG8efLcHTV9stZyB3-wyE8wB9T45fjn8vt4W0ju7MwTvx0x3GiLF-yL9Vzc8ww/s72-w430-h640-c/book.png",
        "title": null
      },
      "media": [],
      "authors": [
        {
          "name": "Unknown",
          "email": "[email protected]",
          "url": null
        }
      ],
      "categories": [
        {
          "label": "pseudo-randomness",
          "term": "pseudo-randomness",
          "url": null
        },
        {
          "label": "hardware",
          "term": "hardware",
          "url": null
        },
        {
          "label": "babbage",
          "term": "babbage",
          "url": null
        },
        {
          "label": "gaga",
          "term": "gaga",
          "url": null
        },
        {
          "label": "anti-spam",
          "term": "anti-spam",
          "url": null
        },
        {
          "label": "gnu make",
          "term": "gnu make",
          "url": null
        },
        {
          "label": "retro",
          "term": "retro",
          "url": null
        },
        {
          "label": "security",
          "term": "security",
          "url": null
        },
        {
          "label": "codes and ciphers",
          "term": "codes and ciphers",
          "url": null
        },
        {
          "label": "the geek atlas",
          "term": "the geek atlas",
          "url": null
        },
        {
          "label": "rants and raves",
          "term": "rants and raves",
          "url": null
        },
        {
          "label": "alan turing",
          "term": "alan turing",
          "url": null
        },
        {
          "label": "hits",
          "term": "hits",
          "url": null
        },
        {
          "label": "mathematics",
          "term": "mathematics",
          "url": null
        },
        {
          "label": "climate change",
          "term": "climate change",
          "url": null
        },
        {
          "label": "perl",
          "term": "perl",
          "url": null
        },
        {
          "label": "calculators",
          "term": "calculators",
          "url": null
        },
        {
          "label": "google go",
          "term": "google go",
          "url": null
        },
        {
          "label": "minitel",
          "term": "minitel",
          "url": null
        },
        {
          "label": "toys",
          "term": "toys",
          "url": null
        },
        {
          "label": "behind the screens",
          "term": "behind the screens",
          "url": null
        },
        {
          "label": "clocks",
          "term": "clocks",
          "url": null
        },
        {
          "label": "machine learning",
          "term": "machine learning",
          "url": null
        },
        {
          "label": "babygaga",
          "term": "babygaga",
          "url": null
        },
        {
          "label": "games",
          "term": "games",
          "url": null
        },
        {
          "label": "arc",
          "term": "arc",
          "url": null
        },
        {
          "label": "my services",
          "term": "my services",
          "url": null
        },
        {
          "label": "popfile",
          "term": "popfile",
          "url": null
        },
        {
          "label": "cansole",
          "term": "cansole",
          "url": null
        },
        {
          "label": "facebook",
          "term": "facebook",
          "url": null
        },
        {
          "label": "privacy",
          "term": "privacy",
          "url": null
        },
        {
          "label": "radio",
          "term": "radio",
          "url": null
        },
        {
          "label": "well... actually",
          "term": "well... actually",
          "url": null
        }
      ]
    },
    {
      "id": "tag:blogger.com,1999:blog-19303585.post-6321735604645731335",
      "title": "The Acme Klein Bottle (from Cliff Stoll and family)",
      "description": null,
      "url": "http://blog.jgc.org/2024/03/the-acme-klein-bottle-from-cliff-stoll.html",
      "published": "2024-03-09T13:42:00.002Z",
      "updated": "2024-05-08T13:28:46.298Z",
      "content": "<p><a href=\"https://en.wikipedia.org/wiki/Clifford_Stoll\">Cliff Stoll</a> (who is probably most famous for writing the wonderful <a href=\"https://en.wikipedia.org/wiki/The_Cuckoo%27s_Egg_(book)\">Cuckoo's Egg</a> about tracking a hacker when doing so was almost recreational) runs a business making Klein bottles: <a href=\"https://www.kleinbottle.com/\">Acme Klein Bottle</a>. A Klein bottle is a weird shape (that doesn't actually exist in three dimensions) with only one side. A bottle with no inside and outside. A bit like the <a href=\"https://en.wikipedia.org/wiki/M%C3%B6bius_strip\">Möbius strip</a> has only one side.</p><p>In fact a Klein bottle can be made from two Möbius strips glued together along their edges. Unfortunately, that doesn't actually work in three dimensions so we're left with doing something called \"immersing\" the bottle in our three dimensional world.</p><p>The result is the bottle has to intersect itself. And that's what Cliff Stoll sells: immersions of Klein bottles in three dimensions. The real Klein bottle would need an extra dimension to not intersect itself. Here's my Acme Klein Bottle:</p><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUn4GP_thu9QY6vATo6fr7wJpGJoiAnFO1o8Ef0qNZ6pFyoCre2LrqTmwKiJm1S23u-ACP2keYHUsmASAVCRARoU7plviSUEIsNxNHbccKBxyM4Ov5XEkJLhyphenhyphen4I2D23sTBLnU7wnaLvfVSzZPXZZr1JoiJTkT6I76dtPxaeY51E_yZwib4j5RFjg/s3309/klein-1.jpg\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"3309\" data-original-width=\"2145\" height=\"640\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUn4GP_thu9QY6vATo6fr7wJpGJoiAnFO1o8Ef0qNZ6pFyoCre2LrqTmwKiJm1S23u-ACP2keYHUsmASAVCRARoU7plviSUEIsNxNHbccKBxyM4Ov5XEkJLhyphenhyphen4I2D23sTBLnU7wnaLvfVSzZPXZZr1JoiJTkT6I76dtPxaeY51E_yZwib4j5RFjg/w414-h640/klein-1.jpg\" width=\"414\" /></a></div><div class=\"separator\" style=\"clear: both; text-align: center;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: left;\">Cliff has <a href=\"https://www.kleinbottle.com/whats_a_klein_bottle.htm\">a whole page</a> describing the properties of a Klein Bottle. It's worth a read. Buying from Cliff is an experience in itself. Here's the packaging mine came in:</div><div class=\"separator\" style=\"clear: both; text-align: left;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaGdvQ8rNva9n8FhVc69v5I0gq0bjcAKS1VpLVkyoNtk58aqrT7t0Vxz4vRwBmmxTrQgVdcaCRbgo2IRapUglXh10zsmgtNgK3DLF4mm0fDfclOXD1fWSQiC99lylTdwOkg79VkrTH8CHYRnih4itTKzbCzE2nvTD1D5rkj3UObEvlipRD0r_-2g/s2989/1.jpeg\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"1999\" data-original-width=\"2989\" height=\"428\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaGdvQ8rNva9n8FhVc69v5I0gq0bjcAKS1VpLVkyoNtk58aqrT7t0Vxz4vRwBmmxTrQgVdcaCRbgo2IRapUglXh10zsmgtNgK3DLF4mm0fDfclOXD1fWSQiC99lylTdwOkg79VkrTH8CHYRnih4itTKzbCzE2nvTD1D5rkj3UObEvlipRD0r_-2g/w640-h428/1.jpeg\" width=\"640\" /></a></div><br /><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2Qz2olMfKIjous1YyCQyUmczPqywUNcBVoSn5BywW5hCj2-LxtZToZfHlakb_GtNkm3ejmz1bim9bdU8WhOatFrPqwbxGZNWm-wSf4Sjtll-cjqBePrHrk1Ee-_Nc-WOvRqXjtdpOtv3Gziz6upJVMGclQPmTCFq3MjgEDYGiho_WVOxRKg2-pg/s3417/2.jpeg\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"2308\" data-original-width=\"3417\" height=\"432\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2Qz2olMfKIjous1YyCQyUmczPqywUNcBVoSn5BywW5hCj2-LxtZToZfHlakb_GtNkm3ejmz1bim9bdU8WhOatFrPqwbxGZNWm-wSf4Sjtll-cjqBePrHrk1Ee-_Nc-WOvRqXjtdpOtv3Gziz6upJVMGclQPmTCFq3MjgEDYGiho_WVOxRKg2-pg/w640-h432/2.jpeg\" width=\"640\" /></a></div><br /><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqeJR36T10S9LbdrulIwHtL9Mdx5ixV3u2DNYkr7wG3wvRNlPzT_p2xDLvAYeyI1GQOnLhHpROOaxlSMvs99FWo-3PtSbX3lEZMgi_ShFzwO-kOLrQtCBmBVV67DFA5Uq0dMX3wDrZKHV-SfqPqdKYbK9qyyaJnNnS6BGBY9r68WO9qFQgd2cwbg/s3166/5.jpeg\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"2100\" data-original-width=\"3166\" height=\"424\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqeJR36T10S9LbdrulIwHtL9Mdx5ixV3u2DNYkr7wG3wvRNlPzT_p2xDLvAYeyI1GQOnLhHpROOaxlSMvs99FWo-3PtSbX3lEZMgi_ShFzwO-kOLrQtCBmBVV67DFA5Uq0dMX3wDrZKHV-SfqPqdKYbK9qyyaJnNnS6BGBY9r68WO9qFQgd2cwbg/w640-h424/5.jpeg\" width=\"640\" /></a></div><br /><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5-1bqhJSKD1EV4p60PllG0H4WW_fe4q0hjgyCvsq1DexCdkNKVPD0B89MD5mLzZ_LfJXiOIqbpxQx9m6JVRmQX-kQ6ttSiAbUoavAe_eTgyCEJ-okruPoWiXdvKyZiOWt9KmTD2mVuXX9nM6IfFg2bDQVm0tH47xovNQLn-KBxFpYapvjTStI0Q/s3111/6.jpeg\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"2125\" data-original-width=\"3111\" height=\"438\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5-1bqhJSKD1EV4p60PllG0H4WW_fe4q0hjgyCvsq1DexCdkNKVPD0B89MD5mLzZ_LfJXiOIqbpxQx9m6JVRmQX-kQ6ttSiAbUoavAe_eTgyCEJ-okruPoWiXdvKyZiOWt9KmTD2mVuXX9nM6IfFg2bDQVm0tH47xovNQLn-KBxFpYapvjTStI0Q/w640-h438/6.jpeg\" width=\"640\" /></a></div><div><br /></div>Plus it comes with a free slide rule (every detail of every document included is worth reading):<div><br /></div><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizANwZNwKGBeEYNMjP66mwT4toeyBI0SnpGjeqmCSfwwbPRd9cj7yYs1I69ZOIyLg9rv8AqmKrTZGfCYlrN7CL_5zbY39nkGy2OGzm4u2GSb8ds3O95_CY5-UG5ZHWuqdFFFYwQiB6gBTkRdenGuuKvvihedQYaDba72GURipBhuhktj3hgayD5g/s3713/klein-2.jpg\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"3713\" data-original-width=\"2817\" height=\"640\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizANwZNwKGBeEYNMjP66mwT4toeyBI0SnpGjeqmCSfwwbPRd9cj7yYs1I69ZOIyLg9rv8AqmKrTZGfCYlrN7CL_5zbY39nkGy2OGzm4u2GSb8ds3O95_CY5-UG5ZHWuqdFFFYwQiB6gBTkRdenGuuKvvihedQYaDba72GURipBhuhktj3hgayD5g/w486-h640/klein-2.jpg\" width=\"486\" /></a></div><div class=\"separator\" style=\"clear: both; text-align: center;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: left;\">Inspection report:</div><div class=\"separator\" style=\"clear: both; text-align: left;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjx24K8Q2Tqs92-IiqqPLc-U5xDRVhCs9vA3T57v1foXp6Zb3lxx-P3H4iVlfxkiXVtFThQhyphenhyphenC2ZWAKG1CPBdzxFEAhyphenhyphenj6RuOsgTTxZkIHKj8hKFpTQtEBh-kk8B8k5ooklp_MnObpg0oI46V4Lxhiv-Qu5nQon7RGXak1Rq-LivfD0rjNOzWp1nA/s3577/klein-3.jpg\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"3577\" data-original-width=\"2838\" height=\"640\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjx24K8Q2Tqs92-IiqqPLc-U5xDRVhCs9vA3T57v1foXp6Zb3lxx-P3H4iVlfxkiXVtFThQhyphenhyphenC2ZWAKG1CPBdzxFEAhyphenhyphenj6RuOsgTTxZkIHKj8hKFpTQtEBh-kk8B8k5ooklp_MnObpg0oI46V4Lxhiv-Qu5nQon7RGXak1Rq-LivfD0rjNOzWp1nA/w508-h640/klein-3.jpg\" width=\"508\" /></a></div><br /><div class=\"separator\" style=\"clear: both; text-align: left;\">Safety instructions:</div><div class=\"separator\" style=\"clear: both; text-align: left;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhubiVSlEn7l9l56F4DYVLPFe-_ryfRHcWhiIs7W48ggdeGcf6Fewh73igMJ9BxgHKayXY8ze4TjZDJqD8O54N60xOWaT_et3LeBLY48uOYXWiPeJmhyATxuYYo2oJMUvuB8UEOqgf2lzfuxtlYiD0t-ysrFooywOiNGW-SR2s_STZHrXn_q955mg/s3653/klein-4.jpg\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"3653\" data-original-width=\"2842\" height=\"640\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhubiVSlEn7l9l56F4DYVLPFe-_ryfRHcWhiIs7W48ggdeGcf6Fewh73igMJ9BxgHKayXY8ze4TjZDJqD8O54N60xOWaT_et3LeBLY48uOYXWiPeJmhyATxuYYo2oJMUvuB8UEOqgf2lzfuxtlYiD0t-ysrFooywOiNGW-SR2s_STZHrXn_q955mg/w498-h640/klein-4.jpg\" width=\"498\" /></a></div><br /><div class=\"separator\" style=\"clear: both; text-align: left;\">For best results, avoid doing stupid things.</div><div class=\"separator\" style=\"clear: both; text-align: left;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6fSCT-KO4GUrEA6pFS4FG5_OhphSUEFZjDOiq0cqZFJSplOnr2IX6Z3ybvqThyphenhyphen4Z54RTdsfQP9izT5BxurLK31JT3gQMMvX2X8fOa7Ky4CHf2j441VVpvZtAxWIGwQt65NXpAcNFBJHPjmxbGmhZEJzcLpYiMm6iCxo3cTSc7vdZlHVC_tKNhJA/s3743/klein-5.jpg\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"3743\" data-original-width=\"2883\" height=\"640\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6fSCT-KO4GUrEA6pFS4FG5_OhphSUEFZjDOiq0cqZFJSplOnr2IX6Z3ybvqThyphenhyphen4Z54RTdsfQP9izT5BxurLK31JT3gQMMvX2X8fOa7Ky4CHf2j441VVpvZtAxWIGwQt65NXpAcNFBJHPjmxbGmhZEJzcLpYiMm6iCxo3cTSc7vdZlHVC_tKNhJA/w492-h640/klein-5.jpg\" width=\"492\" /></a></div><br /><div class=\"separator\" style=\"clear: both; text-align: left;\">And there are some stickers, and a graduated scale you can add to the bottle (plus Cliff threw in a punched card to use as a bookmark):</div><div class=\"separator\" style=\"clear: both; text-align: left;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTo66hRgVGpOdNi9ELUbMiOVdZkrh9sR2rX8-7cB0nNWgDmS9iPHiesU7448ElLCWwcEzapsiml0ejXGAmYxX4CDjWOco6HJPbJchLX6yIE7-T_gLKePCsmr3n9bbdQn-qHbjHplPE8rBkupWKkhuxLPxLUJVL7obSNxL6rRkKOiRgLXWg-gw9ng/s3577/klein-6.jpg\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"3577\" data-original-width=\"2904\" height=\"640\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTo66hRgVGpOdNi9ELUbMiOVdZkrh9sR2rX8-7cB0nNWgDmS9iPHiesU7448ElLCWwcEzapsiml0ejXGAmYxX4CDjWOco6HJPbJchLX6yIE7-T_gLKePCsmr3n9bbdQn-qHbjHplPE8rBkupWKkhuxLPxLUJVL7obSNxL6rRkKOiRgLXWg-gw9ng/w520-h640/klein-6.jpg\" width=\"520\" /></a></div><div><br /></div>So, if like me you were tired of the Möbius strip being the only <a href=\"https://en.wikipedia.org/wiki/Orientability\">non-orientable surface</a> you have in your home, rush over to Acme Klein Bottle and peruse the fine selection of bottles, large and klein, at <a href=\"https://www.kleinbottle.com/\">Acme Klein Bottle</a>.<br /><div class=\"separator\" style=\"clear: both; text-align: left;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: left;\">I haven't described all that comes in the package, or what communication with Cliff via email is like. But if you want an experience that ends with a Klein bottle in your home, buy one.</div>",
      "image": {
        "url": "https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUn4GP_thu9QY6vATo6fr7wJpGJoiAnFO1o8Ef0qNZ6pFyoCre2LrqTmwKiJm1S23u-ACP2keYHUsmASAVCRARoU7plviSUEIsNxNHbccKBxyM4Ov5XEkJLhyphenhyphen4I2D23sTBLnU7wnaLvfVSzZPXZZr1JoiJTkT6I76dtPxaeY51E_yZwib4j5RFjg/s72-w414-h640-c/klein-1.jpg",
        "title": null
      },
      "media": [],
      "authors": [
        {
          "name": "Unknown",
          "email": "[email protected]",
          "url": null
        }
      ],
      "categories": [
        {
          "label": "pseudo-randomness",
          "term": "pseudo-randomness",
          "url": null
        },
        {
          "label": "hardware",
          "term": "hardware",
          "url": null
        },
        {
          "label": "babbage",
          "term": "babbage",
          "url": null
        },
        {
          "label": "gaga",
          "term": "gaga",
          "url": null
        },
        {
          "label": "anti-spam",
          "term": "anti-spam",
          "url": null
        },
        {
          "label": "gnu make",
          "term": "gnu make",
          "url": null
        },
        {
          "label": "retro",
          "term": "retro",
          "url": null
        },
        {
          "label": "security",
          "term": "security",
          "url": null
        },
        {
          "label": "codes and ciphers",
          "term": "codes and ciphers",
          "url": null
        },
        {
          "label": "the geek atlas",
          "term": "the geek atlas",
          "url": null
        },
        {
          "label": "rants and raves",
          "term": "rants and raves",
          "url": null
        },
        {
          "label": "alan turing",
          "term": "alan turing",
          "url": null
        },
        {
          "label": "hits",
          "term": "hits",
          "url": null
        },
        {
          "label": "mathematics",
          "term": "mathematics",
          "url": null
        },
        {
          "label": "climate change",
          "term": "climate change",
          "url": null
        },
        {
          "label": "perl",
          "term": "perl",
          "url": null
        },
        {
          "label": "calculators",
          "term": "calculators",
          "url": null
        },
        {
          "label": "google go",
          "term": "google go",
          "url": null
        },
        {
          "label": "minitel",
          "term": "minitel",
          "url": null
        },
        {
          "label": "toys",
          "term": "toys",
          "url": null
        },
        {
          "label": "behind the screens",
          "term": "behind the screens",
          "url": null
        },
        {
          "label": "clocks",
          "term": "clocks",
          "url": null
        },
        {
          "label": "machine learning",
          "term": "machine learning",
          "url": null
        },
        {
          "label": "babygaga",
          "term": "babygaga",
          "url": null
        },
        {
          "label": "games",
          "term": "games",
          "url": null
        },
        {
          "label": "arc",
          "term": "arc",
          "url": null
        },
        {
          "label": "my services",
          "term": "my services",
          "url": null
        },
        {
          "label": "popfile",
          "term": "popfile",
          "url": null
        },
        {
          "label": "cansole",
          "term": "cansole",
          "url": null
        },
        {
          "label": "facebook",
          "term": "facebook",
          "url": null
        },
        {
          "label": "privacy",
          "term": "privacy",
          "url": null
        },
        {
          "label": "radio",
          "term": "radio",
          "url": null
        },
        {
          "label": "well... actually",
          "term": "well... actually",
          "url": null
        }
      ]
    },
    {
      "id": "tag:blogger.com,1999:blog-19303585.post-1960659042426703991",
      "title": "The original WWW proposal is a Word for Macintosh 4.0 file from 1990, can we open it?",
      "description": null,
      "url": "http://blog.jgc.org/2024/02/the-original-www-proposal-is-word-for.html",
      "published": "2024-02-13T14:05:00.014Z",
      "updated": "2024-02-14T08:24:05.461Z",
      "content": "<p>The W3C has a page with the <a href=\"https://www.w3.org/History/1989/proposal.html\">original WWW proposal</a> from Tim Berners-Lee. One of the downloads says </p><ul style=\"color: #302005;\"><li><a href=\"https://www.w3.org/History/1989/proposal\">The original document file (I think - I can't test it)</a></li></ul><div><span style=\"color: #302005;\">The \"I can't test it\" made me sad. There are two other files (an RTF version and an HTML version generated in 1998 from the original file). But can we open the original document?</span></div><div><span style=\"color: #302005;\"><br /></span></div><div><span style=\"color: #302005;\">The original document is 68,608 bytes and <span style=\"font-family: courier;\">file</span> on my Mac says it's a <span style=\"font-family: courier;\">Microsoft Word for Macintosh 4.0</span><span style=\"font-family: inherit;\"> file</span>. That matches with TBL's note on the W3C page saying: \"A hand conversion to HTML of the original MacWord (or Word for Mac?) document written in March 1989 and later redistributed unchanged apart from the date added in May 1990.\" </span></div><div><span style=\"color: #302005;\"><br /></span></div><div><span style=\"color: #302005;\">Microsoft Office for Mac came out in 1989 with System 6.0. That was Microsoft Word 4.0 so we're looking for compatibility with Microsoft Word for Macintosh 4.0. Let's see what modern software can open this. What I really want to be able to do is open it and convert it to, say, PDF with high fidelity.</span></div><h2 style=\"text-align: left;\"><span style=\"color: #302005;\">Microsoft Word</span></h2><div><span style=\"color: #302005;\">Let's begin with Microsoft Word itself. I uploaded the file to Microsoft OneDrive with the extension .doc and clicked on it to open it in Microsoft Word.</span></div><div><span style=\"color: #302005;\"><br /></span></div><div><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivCGzwNqeNyN4mZPNF593LeO14xECSZPabgJK43_trMY-NNlDrGrUYeGPAQ11lVk4vmh8o9U05sPW7xIYx1vDLIGDQWHFo9x6gEwqkvA3JzPkmLhyVS8HGHSCRXqH-yQXFo3Q9qxsje_rF5Vuzzm1YfxlIU2mlCXEvjDJ1ebeSl8G6gDD9zJ7iRA/s1358/proposal-1.png\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"524\" data-original-width=\"1358\" height=\"246\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivCGzwNqeNyN4mZPNF593LeO14xECSZPabgJK43_trMY-NNlDrGrUYeGPAQ11lVk4vmh8o9U05sPW7xIYx1vDLIGDQWHFo9x6gEwqkvA3JzPkmLhyVS8HGHSCRXqH-yQXFo3Q9qxsje_rF5Vuzzm1YfxlIU2mlCXEvjDJ1ebeSl8G6gDD9zJ7iRA/w640-h246/proposal-1.png\" width=\"640\" /></a></div><h2 style=\"clear: both; text-align: left;\">Apple Pages</h2><div class=\"separator\" style=\"clear: both; text-align: left;\">I switched to the Mac and hoped that Apple Pages might understand an old Microsoft Word for Macintosh file. No such luck.</div><div class=\"separator\" style=\"clear: both; text-align: left;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisHsxI8gafx3rr9vSA7jui-HrzV_8CQYERBqT-6gQJwr1QbIiaIzYedxMRkiULhHaDkE8f0Lc7F-9erQ620RSRR_9e0qgX2tqoN1cxfScEwu7zzk2XO4LFiHAUbdOnvnRQNUGp8jt_p0r8cfiTw84qyH1JKCUFGK7-WQD2A2SqIYNA8BVCM_iSZw/s744/proposal-2.png\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"664\" data-original-width=\"744\" height=\"358\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisHsxI8gafx3rr9vSA7jui-HrzV_8CQYERBqT-6gQJwr1QbIiaIzYedxMRkiULhHaDkE8f0Lc7F-9erQ620RSRR_9e0qgX2tqoN1cxfScEwu7zzk2XO4LFiHAUbdOnvnRQNUGp8jt_p0r8cfiTw84qyH1JKCUFGK7-WQD2A2SqIYNA8BVCM_iSZw/w400-h358/proposal-2.png\" width=\"400\" /></a></div><h2 style=\"clear: both; text-align: left;\">Apache OpenOffice</h2><div><div>Next let's hope open source software will come to the rescue. I downloaded the latest Apache OpenOffice and it did open the file but the formatting is gone and the diagrams are missing.</div></div></div><div><br /></div><table align=\"center\" cellpadding=\"0\" cellspacing=\"0\" class=\"tr-caption-container\" style=\"margin-left: auto; margin-right: auto;\"><tbody><tr><td style=\"text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8eASEUl_mTNLs2hF2Fi-omu_5WvEjHONP_sAi8Wwn5R5GO0gciGwx7E-TySj-NUiz-xFxQ0XjDgRMcvKtJFPP6MLWOcwwBwBrpG50e2f8m3ld6eD23Afq-kCRT4Eb9_K4W_j1OaqeWP9aOYnIY7uaJ0E3iWyH2xXnSDL2UJF5TSI_zhKa_fI6CQ/s2652/proposal-3.png\" style=\"margin-left: auto; margin-right: auto;\"><img border=\"0\" data-original-height=\"1920\" data-original-width=\"2652\" height=\"464\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8eASEUl_mTNLs2hF2Fi-omu_5WvEjHONP_sAi8Wwn5R5GO0gciGwx7E-TySj-NUiz-xFxQ0XjDgRMcvKtJFPP6MLWOcwwBwBrpG50e2f8m3ld6eD23Afq-kCRT4Eb9_K4W_j1OaqeWP9aOYnIY7uaJ0E3iWyH2xXnSDL2UJF5TSI_zhKa_fI6CQ/w640-h464/proposal-3.png\" width=\"640\" /></a></td></tr><tr><td class=\"tr-caption\" style=\"text-align: center;\"><br /></td></tr></tbody></table><h2 style=\"text-align: left;\">LibreOffice</h2><div>OK, maybe I need different open source software, so I switched to the latest <a href=\"https://www.libreoffice.org/\">LibreOffice</a> and it opened it. And the diagrams are crisp! Although there's something weird about the margins and there are other formatting problems.</div><div><br /></div><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMG83H6sPE9zk7abtg9woYAM6ryYid5DOmz_yegn0x7U_B5rkalViax7vrgAI2b6Zy9dD39gsMjBwmMhMMlefWQu0DfdT9ELMSlFcNFKh2DNRr7KsKMGwJgGmXUvhXiEd_OrE93V99yBr6c4WMS7Ak_7W0DSH5ezoYX3ob1gut5Nhd0XDyp63szA/s2644/proposal-4.png\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"2158\" data-original-width=\"2644\" height=\"522\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMG83H6sPE9zk7abtg9woYAM6ryYid5DOmz_yegn0x7U_B5rkalViax7vrgAI2b6Zy9dD39gsMjBwmMhMMlefWQu0DfdT9ELMSlFcNFKh2DNRr7KsKMGwJgGmXUvhXiEd_OrE93V99yBr6c4WMS7Ak_7W0DSH5ezoYX3ob1gut5Nhd0XDyp63szA/w640-h522/proposal-4.png\" width=\"640\" /></a></div><h2 style=\"text-align: left;\"><br /></h2><h2 style=\"text-align: left;\">CERN PDF</h2><div>CERN makes available <a href=\"https://cds.cern.ch/record/369245/files/dd-89-001.pdf\">a PDF version</a> of the proposal which was apparently created in 1998 using Acrobat Distiller Daemon 2.1 for SunOS/Solaris (SPARC). It has 20 pages. The LibreOffice imported version has 24 pages. </div><div><br /></div><div>To get an overview of what's different I created a PDF from the LibreOffice version and then looked at it and the CERN PDF in the contact sheet version in Apple Preview.</div><div><br /></div><div>Here's the CERN PDF:</div><div><br /></div><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtmLx2yw7hBNA1hZ0YGxlcvJee0qSv5IoSm6ytWun-nEFw7z-5yWT0Ckc7pzcW6SGZl72nM-jYZUbV5ZUhUlfrGjYWcmz6HVD_p6XI1bEegfQucRbHhjfaPwnlz4mH_V-ANzeCzsMNDX8Fr5vsBpTi8oY1M-zCB26mlpsvCwdUzWXGi9mSNUfBrg/s2444/proposal-5.png\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"700\" data-original-width=\"2444\" height=\"184\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtmLx2yw7hBNA1hZ0YGxlcvJee0qSv5IoSm6ytWun-nEFw7z-5yWT0Ckc7pzcW6SGZl72nM-jYZUbV5ZUhUlfrGjYWcmz6HVD_p6XI1bEegfQucRbHhjfaPwnlz4mH_V-ANzeCzsMNDX8Fr5vsBpTi8oY1M-zCB26mlpsvCwdUzWXGi9mSNUfBrg/w640-h184/proposal-5.png\" width=\"640\" /></a></div><div><br /></div><div>Here's the LibreOffice-generated PDF:</div><div><br /></div><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKTElIxIWy-jOHKCzOuLo8pd1rk_9ChaGL93vgNMElSsu9eRgIh_LHJ3yDVXzOvHFfF5iDEwRoPMH_Dyeuk1HNcB5K6wZOKu229VWK7kNpvpgGMXF7oekB5C-O4sRxK9fRPFTxSqEj8u3fUH7t9p8Un9on_hKu8sh0vliaQ98GRtp-TYRrrQ2PYQ/s2444/proposal-6.png\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"1052\" data-original-width=\"2444\" height=\"276\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKTElIxIWy-jOHKCzOuLo8pd1rk_9ChaGL93vgNMElSsu9eRgIh_LHJ3yDVXzOvHFfF5iDEwRoPMH_Dyeuk1HNcB5K6wZOKu229VWK7kNpvpgGMXF7oekB5C-O4sRxK9fRPFTxSqEj8u3fUH7t9p8Un9on_hKu8sh0vliaQ98GRtp-TYRrrQ2PYQ/w640-h276/proposal-6.png\" width=\"640\" /></a></div><br /><div>Things that are different:</div><div><br /></div><div>1. The right-hand margin is missing in the LibreOffice version.</div><div><br /></div><div>2. The LibreOffice version is using 14 pt vs. 12 pt for most of the text.</div><div><br /></div><div>3. The LibreOffice version has turned headers with TBL's initials in them into footers.</div><div><br /></div><div>4. The page breaks look in the right places (see how the images are correctly placed towards the end); thus it's probably the font size that's the biggest problem.</div><div><br /></div><div>5. There CERN PDF has a space under the heading and the LibreOffice version does not.</div><h2 style=\"text-align: left;\">Emulation</h2><div>To make sure that I knew what the actual original document looked like I decided to use <a href=\"https://infinitemac.org/1990/System%206.0.5\">Infinite Mac</a> to boot a 1990-era Macintosh and run actual Word for Macintosh 4.0 on the original document.</div><div><br /></div><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiijOiXeCEF_J1oTZBDun1YT3lye7507nTXRpEAUjYW6CQOVFhI6Qb1jGJhDgAJeOEA1BwmDFLqPYnq25JSXaK5zw2oZOFBTvZiVqmNfhf8Vfp4UYQ_HwJzIKuC_a3kAfvGNhR3U6rSlB77KUFilVUX2lVL7SKnnaQU4ZHkwilImtVFGqKak4kG1w/s1411/proposal-9.png\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"1081\" data-original-width=\"1411\" height=\"490\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiijOiXeCEF_J1oTZBDun1YT3lye7507nTXRpEAUjYW6CQOVFhI6Qb1jGJhDgAJeOEA1BwmDFLqPYnq25JSXaK5zw2oZOFBTvZiVqmNfhf8Vfp4UYQ_HwJzIKuC_a3kAfvGNhR3U6rSlB77KUFilVUX2lVL7SKnnaQU4ZHkwilImtVFGqKak4kG1w/w640-h490/proposal-9.png\" width=\"640\" /></a></div><br /><div>That way I can see actual fonts, font sizes and layout to confirm how the document should have looked. And that's where it became obvious that the original document on the original Mac and the CERN PDF are quite different. The CERN PDF has 20 pages. On the Mac running Word for Macintosh 4.0 with A4 paper it has 22 pages. So I decided to aim to get us close to the original document on the Mac.</div><div><br /></div><table align=\"center\" cellpadding=\"0\" cellspacing=\"0\" class=\"tr-caption-container\" style=\"margin-left: auto; margin-right: auto;\"><tbody><tr><td style=\"text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjM3_thqxV_ZB-VqLJRytn7oA8LbAMlQ2a3kRZrubYhWt4M8ns2R-3nHFXFG-367BDUJQkHtLO6oqFNrZWGXhwlQfarVp_ih1SDBgBWsWGBKqKmZUYD51WLmLIGCQ1no0EcAPeTidkHBb52Y-EY7AXYnBX9nll33G7FuZofLN9XgpD0bWak-T1ONQ/s1389/proposal-10.png\" style=\"margin-left: auto; margin-right: auto;\"><img border=\"0\" data-original-height=\"1062\" data-original-width=\"1389\" height=\"490\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjM3_thqxV_ZB-VqLJRytn7oA8LbAMlQ2a3kRZrubYhWt4M8ns2R-3nHFXFG-367BDUJQkHtLO6oqFNrZWGXhwlQfarVp_ih1SDBgBWsWGBKqKmZUYD51WLmLIGCQ1no0EcAPeTidkHBb52Y-EY7AXYnBX9nll33G7FuZofLN9XgpD0bWak-T1ONQ/w640-h490/proposal-10.png\" width=\"640\" /></a></td></tr><tr><td class=\"tr-caption\" style=\"text-align: center;\"></td></tr></tbody></table><br /><div><span style=\"color: #302005;\">So... set to A4 paper and set right margin to same size as left margin. Change the first page format to be different since it doesn't have the same gutters, footers or headers. </span><span style=\"color: #302005;\">Manually change the body text from 14 pt (and other sizes) to 12 pt. Manually deal with text that breaks across pages incorrectly and other alignment problems. Fix the footer that should be a header.</span></div><div><span style=\"color: #302005;\"><br /></span></div><div><span style=\"color: #302005;\">In the end I got pretty close to what's visible on the Mac. </span></div><div><span style=\"color: #302005;\"><br /></span></div><div><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOA-gPDF3aSCcLgZumx8lW7yXDF34EKE6VIUUcyp7etjaA66vInZOvD7Dxa3DPBGQmKbKlTQQxThHv48XrTdcTWaaLYEacOYAvk2J0qLfEPLOeUWiii286namyfei9NHd2F3pokvQoOEFrRhxWnHi254ONzTxfgFhKMBr6mFcXOcSu7U2DgkIMWQ/s2408/proposal-11.png\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"1040\" data-original-width=\"2408\" height=\"276\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOA-gPDF3aSCcLgZumx8lW7yXDF34EKE6VIUUcyp7etjaA66vInZOvD7Dxa3DPBGQmKbKlTQQxThHv48XrTdcTWaaLYEacOYAvk2J0qLfEPLOeUWiii286namyfei9NHd2F3pokvQoOEFrRhxWnHi254ONzTxfgFhKMBr6mFcXOcSu7U2DgkIMWQ/w640-h276/proposal-11.png\" width=\"640\" /></a></div><h2>Conclusion</h2></div><div>Converting this document from its original format was a bit of a victory for open source software. And a lesson in how hard document preservation is. To help preserve it a bit, and in an open format, I've uploaded my .odt version to GitHub <a href=\"https://github.com/jgrahamc/www-proposal\">here</a>. It's interesting, and a little disheartening to see that this 34 year old document is difficult to open, and even when opened the resulting output isn't exactly the same as the original.</div><div><br /></div><div>PS If you're wondering why I ever started this project. I just wanted a high quality version of the diagrams in the original proposal for a presentation. Took me a lot longer than I thought it would.</div><div><br /></div><div>PPS A <a href=\"https://news.ycombinator.com/item?id=39358074\">comment</a> on Hacker News pointed out that I could probably either create a PostScript file or a PDF via an emulated Mac. I was able to boot another Mac (System 7) that had Word from 1992 and Print2PDF (a driver that creates a printer that makes a PDF file) and print directly from Word for Macintosh 5.1a.</div><div><br /></div><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgx49b2BxnfgvZQp6amCJ3JWT_B0Fcgyv-hz6O4rG0vxhImvBWk_3WvYJhFcv6rwE45ySKg1GBJchujq4AJE2s8emtZm8B1YuwmXtEeCAE6m4wRhjQxnCrHRZ1XRTJK4CwjZJy9xsYQIH2ZFHEpRUzrMynlP2QddrGZl6ol5YJIRWA-xjRHY97jow/s1969/proposal-12.png\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"1573\" data-original-width=\"1969\" height=\"512\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgx49b2BxnfgvZQp6amCJ3JWT_B0Fcgyv-hz6O4rG0vxhImvBWk_3WvYJhFcv6rwE45ySKg1GBJchujq4AJE2s8emtZm8B1YuwmXtEeCAE6m4wRhjQxnCrHRZ1XRTJK4CwjZJy9xsYQIH2ZFHEpRUzrMynlP2QddrGZl6ol5YJIRWA-xjRHY97jow/w640-h512/proposal-12.png\" width=\"640\" /></a></div><div class=\"separator\" style=\"clear: both; text-align: center;\"><br /></div>I've added the generated PDF file to the GitHub. This version has 20 pages and the fonts are different but it does meet my original requirement of a PDF.<div><br /></div><div>PPPS A Hacker News <a href=\"https://news.ycombinator.com/item?id=39363611\">comment</a> links to another conversion done using different versions of Word and bit of fiddling around to get a really nice version of the document in modern formats.<br /><div><br /></div></div>",
      "image": {
        "url": "https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivCGzwNqeNyN4mZPNF593LeO14xECSZPabgJK43_trMY-NNlDrGrUYeGPAQ11lVk4vmh8o9U05sPW7xIYx1vDLIGDQWHFo9x6gEwqkvA3JzPkmLhyVS8HGHSCRXqH-yQXFo3Q9qxsje_rF5Vuzzm1YfxlIU2mlCXEvjDJ1ebeSl8G6gDD9zJ7iRA/s72-w640-h246-c/proposal-1.png",
        "title": null
      },
      "media": [],
      "authors": [
        {
          "name": "Unknown",
          "email": "[email protected]",
          "url": null
        }
      ],
      "categories": [
        {
          "label": "pseudo-randomness",
          "term": "pseudo-randomness",
          "url": "http://www.blogger.com/atom/ns#"
        }
      ]
    },
    {
      "id": "tag:blogger.com,1999:blog-19303585.post-2834485746776529070",
      "title": "Repairing (sort of) a Dyson fan remote control",
      "description": null,
      "url": "http://blog.jgc.org/2024/02/repairing-sort-of-dyson-fan-remote.html",
      "published": "2024-02-04T20:52:00.005Z",
      "updated": "2024-02-04T22:41:36.150Z",
      "content": "<p>I have a couple of fancy Dyson fans that do cooling (or at least blowing air around) and heating. They use a little IR remote control that attaches to the top with magnets. One of the remotes decided to stop working; its failure mode was: consume an entire CR2032 battery in a few days. Apparently, <a href=\"https://www.reddit.com/r/dyson/comments/f5rt1m/dyson_am09_remote_control_battery_needs_replacing/\">I'm not alone</a> in experiencing this problem.</p><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJwRJuZfFNpzHSiOsaj1oEyeiKLlTMBb3No8S26vg7rgvVlER-6mdNJE_e8_GWZmsQyA-xohZphLvFttRmdjbYbBJoOv0gnXdT2Kj98pza7ayVkyh5kFp_quzbjcx0vJmTk3aQ0o0h_r5bY8C6IsQq5YOeaHwx-z6pKWJZL-uIDDmwwEZJgTaV8g/s496/dyson-8.jpg\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"355\" data-original-width=\"496\" height=\"286\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJwRJuZfFNpzHSiOsaj1oEyeiKLlTMBb3No8S26vg7rgvVlER-6mdNJE_e8_GWZmsQyA-xohZphLvFttRmdjbYbBJoOv0gnXdT2Kj98pza7ayVkyh5kFp_quzbjcx0vJmTk3aQ0o0h_r5bY8C6IsQq5YOeaHwx-z6pKWJZL-uIDDmwwEZJgTaV8g/w400-h286/dyson-8.jpg\" width=\"400\" /></a></div><p>Before seeing if I could repair it, I made a backup of the IR codes from the remote using my Flipper Zero:</p><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgOMLvNXN1CihUrjCQGB7q9M5h9TaKQbjZapuTyFHh6ad4OwYW4a48HQ722IoDnhVmGWvv1mMqRHXD77wGiEH1ysgTzR8aQISRMI3-R2ewjj7MNqdS7prkG552uMVOpsM5H6ieLoPnR9m61AnEuhpB-CbOVsSYuGoT7lYlzDsGPg30ZoNQhP_RaQ/s750/dyson-7.png\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"350\" data-original-width=\"750\" height=\"186\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgOMLvNXN1CihUrjCQGB7q9M5h9TaKQbjZapuTyFHh6ad4OwYW4a48HQ722IoDnhVmGWvv1mMqRHXD77wGiEH1ysgTzR8aQISRMI3-R2ewjj7MNqdS7prkG552uMVOpsM5H6ieLoPnR9m61AnEuhpB-CbOVsSYuGoT7lYlzDsGPg30ZoNQhP_RaQ/w400-h186/dyson-7.png\" width=\"400\" /></a></div><p>Dyson were good enough to replace the remote but I began to wonder why this was happening and so I opened it. Here's the little circuit board inside. The pads are the underside of the buttons.</p><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh92uQYxF5oL0ncvi2wKle1f9DpkWeVp9pn507Nzcjhr4g669-VZx25DWj9H8Z6yCW4B7KZmGG37msYSr-lX_z6HHHFzhULOPF0h0ydeJn_RPKbPtID3GPcD9oOhTecJklgQCfH88roqd5yNYiKLpZt-Yfc3fVJPk-F34D8h2488OFjlgD24bPJVw/s3463/dyson-1.jpg\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"3463\" data-original-width=\"1561\" height=\"640\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh92uQYxF5oL0ncvi2wKle1f9DpkWeVp9pn507Nzcjhr4g669-VZx25DWj9H8Z6yCW4B7KZmGG37msYSr-lX_z6HHHFzhULOPF0h0ydeJn_RPKbPtID3GPcD9oOhTecJklgQCfH88roqd5yNYiKLpZt-Yfc3fVJPk-F34D8h2488OFjlgD24bPJVw/w288-h640/dyson-1.jpg\" width=\"288\" /></a></div><br /><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEju16NBKQgWeraenUz0Tm4RnoNHLcW67OANzCRdl4C_cOdcZq8WHn0iu0H8fa96GnNjnBMTiJWefRq1VW020LDli1UUuLuIs4JL7ZgLP-3i5MvT9xIrlvlzYQgZ5X66CxjxFSMcO1QL0lD3Z5rw3tJa20KsRR2pXTenvnRcw0Ec1LpU2nW31IbT1Q/s3161/dyson-2.jpg\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"3161\" data-original-width=\"1266\" height=\"640\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEju16NBKQgWeraenUz0Tm4RnoNHLcW67OANzCRdl4C_cOdcZq8WHn0iu0H8fa96GnNjnBMTiJWefRq1VW020LDli1UUuLuIs4JL7ZgLP-3i5MvT9xIrlvlzYQgZ5X66CxjxFSMcO1QL0lD3Z5rw3tJa20KsRR2pXTenvnRcw0Ec1LpU2nW31IbT1Q/w256-h640/dyson-2.jpg\" width=\"256\" /></a></div><p>Using a multimeter I discovered that the resistance across the battery terminals was 2.5kΩ when I was expecting it to be very, very high or even infinite.</p><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmXInq3B_Bdg9aoUOymUFK1uQl_jXXztK4-6-Xfe774nkNJNxWifQdw2UnSFS5tGxZ7VxWDg3ocMhw2DuFndPfkMykaf-fP29ibzd5R_gnGb_GJMq8eimYwwUgWl_Ebu-b6GPzmQai4ryOCqGn6FcJryUR97xblrZ_5F0yInG_RfK7gDgWT_a2YA/s1738/dyson-3.jpg\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"1641\" data-original-width=\"1738\" height=\"378\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmXInq3B_Bdg9aoUOymUFK1uQl_jXXztK4-6-Xfe774nkNJNxWifQdw2UnSFS5tGxZ7VxWDg3ocMhw2DuFndPfkMykaf-fP29ibzd5R_gnGb_GJMq8eimYwwUgWl_Ebu-b6GPzmQai4ryOCqGn6FcJryUR97xblrZ_5F0yInG_RfK7gDgWT_a2YA/w400-h378/dyson-3.jpg\" width=\"400\" /></a></div><p>And that the remote control was drawing 1.1mA when doing nothing. </p><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDevJLZYjCVQ2xHp764sFp4A1mWpsTgryeH-mXsTu1PV-i00a9xmdl2Tyr5n89tibrYpVJW6s7EyaWkSUHhyphenhyphenDVOFFvo33vdgk0VIQhuJ3aG2MyJv0pt1kONR23C4FchUT5eKBGJMJ9C4AaiM0hCVBp0eaCD1-Ee_Oi0rZVSFqlkTcBoTyAKW5HIg/s1375/dyson-4.jpg\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"1065\" data-original-width=\"1375\" height=\"310\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDevJLZYjCVQ2xHp764sFp4A1mWpsTgryeH-mXsTu1PV-i00a9xmdl2Tyr5n89tibrYpVJW6s7EyaWkSUHhyphenhyphenDVOFFvo33vdgk0VIQhuJ3aG2MyJv0pt1kONR23C4FchUT5eKBGJMJ9C4AaiM0hCVBp0eaCD1-Ee_Oi0rZVSFqlkTcBoTyAKW5HIg/w400-h310/dyson-4.jpg\" width=\"400\" /></a></div><p>A quick check of Ohm's law gives I = V/R, I = 3V/2500Ω, I = 1.2mA. Close enough. </p><p>The capacity of a CR2032 battery varies a lot from manufacturer to manufacturer but seems to be between 150mAh and 250mAh (roughly). At 1.2mA constant current that's between 125h and 208h to drain the battery (about 5 to 7 days). </p><p>But why was there 2.5kΩ across the battery? The culprit is the capacitor C1 which is in parallel with the CR2032. It's decided that it would prefer to be a resistor! Sometimes capacitors fail like this.</p><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBF9m6Ss1Ai5TWar2eHt1gIf_XzQwFiVAYHQ8qv4Y9xqwa57A2qX1pQu9sx8XJDSL2JVjVI2qtIgxilfAdMY3E_olJOxhx-suFtMVkCumsPlDdOrseh33P1toyU8cekxfj5CmZwVrFNHcHjuOPvAbcmK7pOQsDh2UWmmI5sJIiw5Nj-mYrJYFOhg/s2156/dyson-5.jpg\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"1631\" data-original-width=\"2156\" height=\"303\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBF9m6Ss1Ai5TWar2eHt1gIf_XzQwFiVAYHQ8qv4Y9xqwa57A2qX1pQu9sx8XJDSL2JVjVI2qtIgxilfAdMY3E_olJOxhx-suFtMVkCumsPlDdOrseh33P1toyU8cekxfj5CmZwVrFNHcHjuOPvAbcmK7pOQsDh2UWmmI5sJIiw5Nj-mYrJYFOhg/w400-h303/dyson-5.jpg\" width=\"400\" /></a></div><p>Aside: why is there a capacitor in parallel with the battery? Almost certainly because it's the capacitor that powers the remote when a button is pressed. Most of the time no button is pressed and the capacitor will sit charged fully. When a button is pressed a load is applied to the battery/capacitor combination and it's the capacitor which will provide the needed current. This will likely prolong the life of the battery as it will slowly charge a capacitor and not have to provide a sudden larger current when a button is pressed.</p><p>I didn't have a spare surface mount capacitor around so I simply removed C1. With C1 removed there's no current drain when idle and the remote works fine. Unfortunately, Dyson didn't design the remote to be opened and so the case didn't survive. Also, I'm sure I've shortened the life of the CR2032 battery by removing C1, but at least it'll last longer than a week!</p><p>I fixed the remote up so I could use it by printing a picture of what it should look like and taping the paper into place. You may also notice the small felt pad. That's there to <strike>make it pleasant to hold</strike> prevent you from being stabbed by the mechanism that connects to the +ve terminal of the battery.</p><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiPD5Pc0lNO5k1leWW9TskgjjvhxQLRm1CofXGZLi6V6LXCwp12uhxHKcmMhk44jZ-jrsqdE0wIs-nkUm5cD1F_kiPYjmhkKACJh-3Slmf154b57HVrNwb9sl4YxZv6T612YjL-jODfgy45SILV7MF4VP65xSGo3frwvnWrmU37QP2QQBFhy4SjxQ/s3078/dyson-9.jpg\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"3078\" data-original-width=\"1255\" height=\"640\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiPD5Pc0lNO5k1leWW9TskgjjvhxQLRm1CofXGZLi6V6LXCwp12uhxHKcmMhk44jZ-jrsqdE0wIs-nkUm5cD1F_kiPYjmhkKACJh-3Slmf154b57HVrNwb9sl4YxZv6T612YjL-jODfgy45SILV7MF4VP65xSGo3frwvnWrmU37QP2QQBFhy4SjxQ/w261-h640/dyson-9.jpg\" width=\"261\" /></a></div><div class=\"separator\" style=\"clear: both; text-align: center;\"><br /></div><div class=\"separator\" style=\"clear: both; text-align: left;\">As good as new! Or at least it works and I can keep using the fan until the replacement Dyson is sending arrives.</div>",
      "image": {
        "url": "https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJwRJuZfFNpzHSiOsaj1oEyeiKLlTMBb3No8S26vg7rgvVlER-6mdNJE_e8_GWZmsQyA-xohZphLvFttRmdjbYbBJoOv0gnXdT2Kj98pza7ayVkyh5kFp_quzbjcx0vJmTk3aQ0o0h_r5bY8C6IsQq5YOeaHwx-z6pKWJZL-uIDDmwwEZJgTaV8g/s72-w400-h286-c/dyson-8.jpg",
        "title": null
      },
      "media": [],
      "authors": [
        {
          "name": "Unknown",
          "email": "[email protected]",
          "url": null
        }
      ],
      "categories": [
        {
          "label": "hardware",
          "term": "hardware",
          "url": "http://www.blogger.com/atom/ns#"
        },
        {
          "label": "pseudo-randomness",
          "term": "pseudo-randomness",
          "url": "http://www.blogger.com/atom/ns#"
        }
      ]
    },
    {
      "id": "tag:blogger.com,1999:blog-19303585.post-2628625242840790888",
      "title": "My daily driver is older than I thought; it's positively vintage!",
      "description": null,
      "url": "http://blog.jgc.org/2024/01/my-daily-driver-is-older-than-i-thought.html",
      "published": "2024-01-17T12:19:00.004Z",
      "updated": "2024-01-18T12:59:23.311Z",
      "content": "<p>I was doing some clean up on my main laptop and realized it had been a while since bought a new computer. Turns out it was a lot older than I thought:</p><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvzO4ipKTzs-wGERqTADkb60TVjR1Lk1TQVSNkeik6A0tfdToCWa5cdDlyM6B4_4YfG76iJQyuFQsY8_zD8P9wH6sZc3fcFsNeiWuQ4mlIVc4dA8vYn71DWI_n-Xl8hRl6Nwg_Y5NQs8_JVfcadvmPx3Rshtkz0x5YnHDn-apiuP_CAAtqQbDriQ/s1338/mac-1.jpg\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"1338\" data-original-width=\"784\" height=\"640\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvzO4ipKTzs-wGERqTADkb60TVjR1Lk1TQVSNkeik6A0tfdToCWa5cdDlyM6B4_4YfG76iJQyuFQsY8_zD8P9wH6sZc3fcFsNeiWuQ4mlIVc4dA8vYn71DWI_n-Xl8hRl6Nwg_Y5NQs8_JVfcadvmPx3Rshtkz0x5YnHDn-apiuP_CAAtqQbDriQ/w375-h640/mac-1.jpg\" width=\"375\" /></a></div><div class=\"separator\" style=\"clear: both; text-align: left;\">Apple considers this machine to be <a href=\"https://support.apple.com/en-us/HT201624\">vintage</a> but I don't have any compelling reason to upgrade it. Apple still supports it in macOS (although I can't upgrade beyond macOS Ventura), all the hardware works, and I haven't run out of disk space (although I did have to offload all the the work on <a href=\"https://behind-the-screens.tv/\">Behind The Screens</a> to an external drive because of their size).</div><p>But there is one thing I hate about it: the bloody Touch Bar and its phony ESC key. I thought I'd get used to the Touch Bar but it turns out I didn't. </p><p>This is the longest I've ever owned a laptop without upgrading and I think that comes down to a few things. Firstly, I spend most of my time on this machine either in a web browser, or using a terminal to SSH to somewhere else. Secondly, the most powerful program I tend to use on it is Final Cut Pro but my videos tend to me short and not particularly complicated to output.</p><p>So, a combination of Apple's hardware and software holding up and a lot of my computing needs being offloaded to the cloud means this old machine is banging along nicely.</p><p>PS If you're interested in a really vintage machine, <a href=\"https://blog.jgc.org/2023/12/restoration-of-ibm-thinkpad-701c.html\">read about my complete restoration of an IBM ThinkPad 701c</a> (the one with the butterfly keyboard).</p><div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0w9j6ps4wMjnvsJkGCtrjkn1E98IL3px8ijlwGW2fEq7wzhgVi0DQH-8JinjPBbCOb4ycfi66mp8irN3wU8FOl2KAW1cKmh5m9jQ_aqtPBk_LGitLZr991Pp-K2FsPjrn97dWMZWY1AoIkSTe2J4AhUz64pekzCzX2ECXoVNP3SZ8Jp6HTnCLHQ/s639/701c-40.jpg\" style=\"margin-left: 1em; margin-right: 1em;\"><img border=\"0\" data-original-height=\"524\" data-original-width=\"639\" height=\"524\" src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0w9j6ps4wMjnvsJkGCtrjkn1E98IL3px8ijlwGW2fEq7wzhgVi0DQH-8JinjPBbCOb4ycfi66mp8irN3wU8FOl2KAW1cKmh5m9jQ_aqtPBk_LGitLZr991Pp-K2FsPjrn97dWMZWY1AoIkSTe2J4AhUz64pekzCzX2ECXoVNP3SZ8Jp6HTnCLHQ/w640-h524/701c-40.jpg\" width=\"640\" /></a></div>",
      "image": {
        "url": "https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvzO4ipKTzs-wGERqTADkb60TVjR1Lk1TQVSNkeik6A0tfdToCWa5cdDlyM6B4_4YfG76iJQyuFQsY8_zD8P9wH6sZc3fcFsNeiWuQ4mlIVc4dA8vYn71DWI_n-Xl8hRl6Nwg_Y5NQs8_JVfcadvmPx3Rshtkz0x5YnHDn-apiuP_CAAtqQbDriQ/s72-w375-h640-c/mac-1.jpg",
        "title": null
      },
      "media": [],
      "authors": [
        {
          "name": "Unknown",
          "email": "[email protected]",
          "url": null
        }
      ],
      "categories": [
        {
          "label": "pseudo-randomness",
          "term": "pseudo-randomness",
          "url": null
        },
        {
          "label": "hardware",
          "term": "hardware",
          "url": null
        },
        {
          "label": "babbage",
          "term": "babbage",
          "url": null
        },
        {
          "label": "gaga",
          "term": "gaga",
          "url": null
        },
        {
          "label": "anti-spam",
          "term": "anti-spam",
          "url": null
        },
        {
          "label": "gnu make",
          "term": "gnu make",
          "url": null
        },
        {
          "label": "retro",
          "term": "retro",
          "url": null
        },
        {
          "label": "security",
          "term": "security",
          "url": null
        },
        {
          "label": "codes and ciphers",
          "term": "codes and ciphers",
          "url": null
        },
        {
          "label": "the geek atlas",
          "term": "the geek atlas",
          "url": null
        },
        {
          "label": "rants and raves",
          "term": "rants and raves",
          "url": null
        },
        {
          "label": "alan turing",
          "term": "alan turing",
          "url": null
        },
        {
          "label": "hits",
          "term": "hits",
          "url": null
        },
        {
          "label": "mathematics",
          "term": "mathematics",
          "url": null
        },
        {
          "label": "climate change",
          "term": "climate change",
          "url": null
        },
        {
          "label": "perl",
          "term": "perl",
          "url": null
        },
        {
          "label": "calculators",
          "term": "calculators",
          "url": null
        },
        {
          "label": "google go",
          "term": "google go",
          "url": null
        },
        {
          "label": "minitel",
          "term": "minitel",
          "url": null
        },
        {
          "label": "toys",
          "term": "toys",
          "url": null
        },
        {
          "label": "behind the screens",
          "term": "behind the screens",
          "url": null
        },
        {
          "label": "clocks",
          "term": "clocks",
          "url": null
        },
        {
          "label": "machine learning",
          "term": "machine learning",
          "url": null
        },
        {
          "label": "babygaga",
          "term": "babygaga",
          "url": null
        },
        {
          "label": "games",
          "term": "games",
          "url": null
        },
        {
          "label": "arc",
          "term": "arc",
          "url": null
        },
        {
          "label": "my services",
          "term": "my services",
          "url": null
        },
        {
          "label": "popfile",
          "term": "popfile",
          "url": null
        },
        {
          "label": "cansole",
          "term": "cansole",
          "url": null
        },
        {
          "label": "facebook",
          "term": "facebook",
          "url": null
        },
        {
          "label": "privacy",
          "term": "privacy",
          "url": null
        },
        {
          "label": "radio",
          "term": "radio",
          "url": null
        },
        {
          "label": "well... actually",
          "term": "well... actually",
          "url": null
        }
      ]
    },
    {
      "id": "tag:blogger.com,1999:blog-19303585.post-8778475752762716090",
      "title": "Compression of the lyrics of the \"12 Days Of Christmas\"",
      "description": null,
      "url": "http://blog.jgc.org/2023/12/compression-of-lyrics-of-12-days-of.html",
      "published": "2023-12-27T15:43:00.007Z",
      "updated": "2024-01-24T15:42:07.935Z",
      "content": "<p>Eleven years ago I blogged about a solution to the \"Never Gonna Give You Up\" compression code golf challenge: what's the smallest program that output the lyrics of Rick Astley's phenomenon? My solution was 589 bytes of Perl that looked like this:</p><p><span style=\"font-family: courier;\">$b=<<E;<br /></span><span style=\"font-family: courier;\"> gÐngÑveÒe >ÓthÔouÕo Önd× yÕØÖloÙiÑ Út's Û(OohÜe'reÝ<br /></span><span style=\"font-family: courier;\">YÕÞ knowß,ÐivàÚoá I'm â tÖsãtell ä a× åØ æeåçay it<br /></span><span style=\"font-family: courier;\">è äértØêß ëÐonna ì oÔer íæupîmakeæïÛbeen ðëÔÓñÕ'rÓtoÖòeî)<br /></span><span style=\"font-family: courier;\">óeÒrìô<br /></span><span style=\"font-family: courier;\">We'Òßõ<br /></span><span style=\"font-family: courier;\">NôöóÜ÷ôgiÒø howâfeeliÑ<br /></span><span style=\"font-family: courier;\">ù<br /></span><span style=\"font-family: courier;\">Nøú÷)ú, nø<br /></span><span style=\"font-family: courier;\">(Givû<br /></span><span style=\"font-family: courier;\">I just wannaéyÕùGotta ïu×ersta×<br /></span><span style=\"font-family: courier;\">þü eachífor sÙÑÞr hearðachÚbut<br /></span><span style=\"font-family: courier;\">YòshyãèInsidÓwÓboÔëwhaðgoán<br /></span><span style=\"font-family: courier;\">WeñgamçwÝìplèýúîöletædownörun arÕ×ådeseêöïcryösayÐoodbyeöäa liçhuê<br /></span><span style=\"font-family: courier;\">þWÝ nÖstraÑers tÙÒÞñrulesåsÖdÖI<br /></span><span style=\"font-family: courier;\">A full commitmenÛwhatâÔinkáfÞ wÕldn'tÐet Ôis from anyíguyüõnýA× <br /></span><span style=\"font-family: courier;\">ifæask meùDon'témÓyòbli×ãee<br /></span><span style=\"font-family: courier;\">þþ<br /></span><span style=\"font-family: courier;\">Üà÷àûûóõýüþþ<br /></span><span style=\"font-family: courier;\">E<br /></span><span style=\"font-family: courier;\">map{($a,$b)=split($c=chr,$b,2);$b=~s/$c/$a/g}(208..254);print$b</span></p><p>The <span style=\"font-family: courier;\">$b </span>variable contains a dictionary where the index is made up of ASCII characters above 128 and the single line of Perl code at the end substitutes the dictionary entries until the full lyrics are output.</p><p>I wondered about using the same technique on the \"12 Days Of Christmas\" as there's a lot of repetition but the song is longer. \"Never Gonna Give You Up\" is 1,872 bytes and \"12 Days Of Christmas\" is 2,386. Using the same technique results in this 479 byte Perl program that outputs in the \"12 Days Of Christmas\":</p><div style=\"text-align: left;\"><span style=\"font-family: courier;\">$b=<<Z;<br />enÙ tÚ<br />TÛs,Üe ÝingÞÙ ßvÝgà druás a-âÞ,ãdâäevßåpãæmmãçOnÚhÝè.<br />èééfêéeëétìésí<br />NinÝladies dancãþî partridgÝin a pearÚreeïßloräleaæîð day of ChristmaÜ<br />myÚruÝloàavÝto meñdñòthñónóôóÛõeveôöÛwoÚurtlÝdoveÜ<br />And aï÷<br />Elåpipers piæÛðøÛhreÝFrÙch hÙÜ÷ù<br />Four callÞ birdÜùú<br />FiàoldßrÞÜúû<br />Six geesÝa-layãûü<br />Såswanâswiçüý<br />Eight maiämilkãýþèfirstñ<br />Aïíeconò÷ìhiròùêouróúêifóûíixóüíöýëighóþéniôîìÙõðëlöøìwelfõwelveámmersáçø!<br />Z<br />map{($a,$b)=split($c=chr,$b,2);$b=~s/$c/$a/g}(217..254);print$b</span></div><pre class=\"prettyprint\" style=\"line-height: 10pt;\"><pre class=\"prettyprint\" style=\"line-height: 10pt;\"><pre class=\"prettyprint\" style=\"line-height: 10pt;\"><pre class=\"prettyprint\" style=\"line-height: 10pt;\"></pre></pre></pre></pre>",
      "image": null,
      "media": [],
      "authors": [
        {
          "name": "Unknown",
          "email": "[email protected]",
          "url": null
        }
      ],
      "categories": [
        {
          "label": "pseudo-randomness",
          "term": "pseudo-randomness",
          "url": "http://www.blogger.com/atom/ns#"
        }
      ]
    }
  ]
}
Analyze Another View with RSS.Style