We move the "_Thanks for the help_" out from under the "Entries" menu and under the "About" menu to better balance the menus. Besides, "_Thanks for the help_" is more **about** the IOCCC itself.
1016 lines
41 KiB
HTML
1016 lines
41 KiB
HTML
<!DOCTYPE html>
|
||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||
<!-- START: two lines up starts content from: inc/top.default.html -->
|
||
|
||
<!-- END: this line ends content from: inc/top.default.html -->
|
||
<!-- START: this line starts content from: inc/head.default.html -->
|
||
|
||
<head>
|
||
<link rel="stylesheet" href="../../ioccc.css">
|
||
<link href="https://fonts.googleapis.com/css2?family=Outfit:wght@100..900&display=swap" rel="stylesheet">
|
||
<meta charset="utf-8">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
|
||
<title>The International Obfuscated C Code Contest</title>
|
||
<link rel="icon" type="image/x-icon" href="../../favicon.ico">
|
||
<meta name="description" content="recode.md for 2020/ferguson2">
|
||
<meta name="keywords" content="IOCCC, 2020/ferguson2, recode.md">
|
||
</head>
|
||
|
||
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
|
||
<!-- !!! DO NOT MODIFY THIS FILE - This file is generated by a tool !!! -->
|
||
<!-- !!! DO NOT MODIFY THIS FILE - This file is generated by a tool !!! -->
|
||
<!-- !!! DO NOT MODIFY THIS FILE - This file is generated by a tool !!! -->
|
||
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
|
||
|
||
<!-- END: this line ends content from: inc/head.default.html -->
|
||
|
||
<!-- -->
|
||
<!-- This web page was formed via the tool: bin/gen-other-html.sh -->
|
||
<!-- The content of main section of this web page came from: 2020/ferguson2/recode.md -->
|
||
<!-- -->
|
||
|
||
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
|
||
<!-- !!! Do not modify this web page, instead modify the file: 2020/ferguson2/recode.md !!! -->
|
||
<!-- !!! Do not modify this web page, instead modify the file: 2020/ferguson2/recode.md !!! -->
|
||
<!-- !!! Do not modify this web page, instead modify the file: 2020/ferguson2/recode.md !!! -->
|
||
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
|
||
|
||
<!-- Markdown content was converted into HTML via the tool: bin/md2html.sh -->
|
||
|
||
<!-- START: this line starts content from: inc/body.default.html -->
|
||
|
||
<body>
|
||
|
||
<!-- END: this line ends content from: inc/body.default.html -->
|
||
<!-- START: this line starts content from: inc/topbar.default.html -->
|
||
|
||
<div class="theader">
|
||
<nav class="topbar">
|
||
<div class="container">
|
||
<div class="logo">
|
||
<a href="../../index.html" class="logo-link">
|
||
IOCCC
|
||
</a>
|
||
</div>
|
||
|
||
<div class="topbar-items">
|
||
<div class="item">
|
||
<span class="item-header">
|
||
Entries
|
||
</span>
|
||
|
||
<div class="sub-item">
|
||
<div class="outfit-font">
|
||
<a href="../../years.html" class="sub-item-link">
|
||
Winning entries
|
||
</a>
|
||
</div>
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../authors.html" class="sub-item-link">
|
||
Winning authors
|
||
</a>
|
||
</div>
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../location.html" class="sub-item-link">
|
||
Location of authors
|
||
</a>
|
||
</div>
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../bugs.html" class="sub-item-link">
|
||
Bugs and (mis)features
|
||
</a>
|
||
</div>
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../faq.html#fix_an_entry" class="sub-item-link">
|
||
Fixing entries
|
||
</a>
|
||
</div>
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../faq.html#fix_author" class="sub-item-link">
|
||
Updating author info
|
||
</a>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="item">
|
||
<span class="item-header">
|
||
Status
|
||
</span>
|
||
|
||
<div class="sub-item">
|
||
<div class="outfit-font">
|
||
<a href="../../news.html" class="sub-item-link">
|
||
News
|
||
</a>
|
||
</div>
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../status.html" class="sub-item-link">
|
||
Contest status
|
||
</a>
|
||
</div>
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../next/index.html" class="sub-item-link">
|
||
Rules and guidelines
|
||
</a>
|
||
</div>
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../markdown.html" class="sub-item-link">
|
||
Markdown guidelines
|
||
</a>
|
||
</div>
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../SECURITY.html" class="sub-item-link">
|
||
Security policy
|
||
</a>
|
||
</div>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="item">
|
||
<span class="item-header">
|
||
FAQ
|
||
</span>
|
||
|
||
<div class="sub-item">
|
||
<div class="outfit-font">
|
||
<a href="../../faq.html" class="sub-item-link">
|
||
Frequently Asked Questions
|
||
</a>
|
||
</div>
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../faq.html#submit" class="sub-item-link">
|
||
How to enter
|
||
</a>
|
||
</div>
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../faq.html#compiling" class="sub-item-link">
|
||
Compiling entries
|
||
</a>
|
||
</div>
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../faq.html#running_entries" class="sub-item-link">
|
||
Running entries
|
||
</a>
|
||
</div>
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../faq.html#help" class="sub-item-link">
|
||
How to help
|
||
</a>
|
||
</div>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="item">
|
||
<span class="item-header">
|
||
About
|
||
</span>
|
||
|
||
<div class="sub-item">
|
||
<div class="outfit-font">
|
||
<a href="../../index.html" class="sub-item-link">
|
||
Home page
|
||
</a>
|
||
</div>
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../about.html" class="sub-item-link">
|
||
About the IOCCC
|
||
</a>
|
||
</div>
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../judges.html" class="sub-item-link">
|
||
The Judges
|
||
</a>
|
||
</div>
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../thanks-for-help.html" class="sub-item-link">
|
||
Thanks for the help
|
||
</a>
|
||
</div>
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../contact.html" class="sub-item-link">
|
||
Contact us
|
||
</a>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</nav>
|
||
|
||
<div class="header-mobile-menu">
|
||
<noscript>
|
||
<a href="../../nojs-menu.html" class="topbar-js-label">
|
||
Please Enable JavaScript
|
||
</a>
|
||
</noscript>
|
||
|
||
<button id="header-open-menu-button" class="topbar-mobile-menu">
|
||
<img
|
||
src="../../png/hamburger-icon-open.png"
|
||
alt="hamburger style menu icon - open state"
|
||
width=48
|
||
height=48>
|
||
</button>
|
||
|
||
<button id="header-close-menu-button" class="hide-content">
|
||
<img
|
||
src="../../png/hamburger-icon-closed.png"
|
||
alt="hamburger style menu icon - closed state"
|
||
width=48
|
||
height=48>
|
||
</button>
|
||
|
||
<div id="mobile-menu-panel" class="hide-content">
|
||
<div class="mobile-menu-container">
|
||
|
||
<div class="mobile-menu-wrapper">
|
||
<div class="mobile-menu-item">
|
||
Entries
|
||
</div>
|
||
<div class="mobile-submenu-wrapper">
|
||
|
||
<a class="mobile-submenu-item" href="../../years.html">
|
||
Winning entries
|
||
</a>
|
||
|
||
<a class="mobile-submenu-item" href="../../authors.html">
|
||
Winning authors
|
||
</a>
|
||
|
||
<a class="mobile-submenu-item" href="../../location.html">
|
||
Location of authors
|
||
</a>
|
||
|
||
<a class="mobile-submenu-item" href="../../bugs.html">
|
||
Bugs and (mis)features
|
||
</a>
|
||
|
||
<a class="mobile-submenu-item" href="../../faq.html#fix_an_entry">
|
||
Fixing entries
|
||
</a>
|
||
|
||
<a class="mobile-submenu-item" href="../../faq.html#fix_author">
|
||
Updating author info
|
||
</a>
|
||
|
||
<a class="mobile-submenu-item" href="../../thanks-for-help.html">
|
||
Thanks for the help
|
||
</a>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="mobile-menu-wrapper">
|
||
|
||
<div class="mobile-menu-item">
|
||
Status
|
||
</div>
|
||
<div class="mobile-submenu-wrapper">
|
||
|
||
<a class="mobile-submenu-item" href="../../news.html">
|
||
News
|
||
</a>
|
||
|
||
<a class="mobile-submenu-item" href="../../status.html">
|
||
Contest status
|
||
</a>
|
||
|
||
<a class="mobile-submenu-item" href="../../next/index.html">
|
||
Rules and guidelines
|
||
</a>
|
||
|
||
<a class="mobile-submenu-item" href="../../markdown.html">
|
||
Markdown guidelines
|
||
</a>
|
||
|
||
<a class="mobile-submenu-item" href="../../SECURITY.html">
|
||
Security policy
|
||
</a>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="mobile-menu-wrapper">
|
||
<div class="mobile-menu-item">
|
||
FAQ
|
||
</div>
|
||
<div class="mobile-submenu-wrapper">
|
||
|
||
<a class="mobile-submenu-item" href="../../faq.html">
|
||
Frequently Asked Questions
|
||
</a>
|
||
|
||
<a class="mobile-submenu-item" href="../../faq.html#submit">
|
||
How to enter
|
||
</a>
|
||
|
||
<a class="mobile-submenu-item" href="../../faq.html#compiling">
|
||
Compiling entries
|
||
</a>
|
||
|
||
<a class="mobile-submenu-item" href="../../faq.html#running_entries">
|
||
Running entries
|
||
</a>
|
||
|
||
<a class="mobile-submenu-item" href="../../faq.html#help">
|
||
How to help
|
||
</a>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="mobile-menu-wrapper">
|
||
<div class="mobile-menu-item">
|
||
About
|
||
</div>
|
||
<div class="mobile-submenu-wrapper">
|
||
|
||
<a class="mobile-submenu-item" href="../../index.html">
|
||
Home page
|
||
</a>
|
||
|
||
<a class="mobile-submenu-item" href="../../about.html">
|
||
About the IOCCC
|
||
</a>
|
||
|
||
<a class="mobile-submenu-item" href="../../judges.html">
|
||
The Judges
|
||
</a>
|
||
|
||
<a class="mobile-submenu-item" href="../../contact.html">
|
||
Contact us
|
||
</a>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<script>
|
||
var headerOpenMenuButton = document.getElementById("header-open-menu-button");
|
||
var headerCloseMenuButton = document.getElementById("header-close-menu-button");
|
||
var mobileMenuPanel = document.getElementById("mobile-menu-panel");
|
||
|
||
headerOpenMenuButton.addEventListener("click", () => {
|
||
headerOpenMenuButton.classList.remove("topbar-mobile-menu");
|
||
headerOpenMenuButton.classList.add("hide-content");
|
||
|
||
headerCloseMenuButton.classList.remove("hide-content");
|
||
headerCloseMenuButton.classList.add("topbar-mobile-menu");
|
||
|
||
mobileMenuPanel.classList.remove("hide-content");
|
||
mobileMenuPanel.classList.add("topbar-mobile-panel");
|
||
});
|
||
|
||
headerCloseMenuButton.addEventListener("click", () => {
|
||
headerCloseMenuButton.classList.remove("topbar-mobile-menu");
|
||
headerCloseMenuButton.classList.add("hide-content");
|
||
|
||
mobileMenuPanel.classList.add("hide-content");
|
||
mobileMenuPanel.classList.remove("topbar-mobile-panel");
|
||
|
||
headerOpenMenuButton.classList.add("topbar-mobile-menu");
|
||
headerOpenMenuButton.classList.remove("hide-content");
|
||
});
|
||
</script>
|
||
|
||
<!-- END: this line ends content from: inc/topbar.default.html -->
|
||
<!-- START: this line starts content from: inc/header.default.html -->
|
||
|
||
<div class="header">
|
||
<a href="../../2011/zucker/index.html">
|
||
<img src="../../png/ioccc.png"
|
||
alt="IOCCC image by Matt Zucker"
|
||
width=300
|
||
height=110>
|
||
</a>
|
||
<h1>The International Obfuscated C Code Contest</h1>
|
||
<h2>recode.html for 2020/ferguson2</h2>
|
||
</div>
|
||
|
||
<!-- END: this line ends content from: inc/header.default.html -->
|
||
<!-- START: this line starts content from: inc/navbar.up2index.html -->
|
||
|
||
<div class="navbar">
|
||
<a class="Left" href="index.html">↑ jump to 2020/ferguson2/index.html ↑</a>
|
||
<a class="Right" href="https://validator.w3.org/nu/?doc=https%3A%2F%2Fioccc-src.github.io%2Ftemp-test-ioccc%2F2020%2Fferguson2%2Frecode.html">✓</a>
|
||
</div>
|
||
|
||
<!-- END: this line ends content from: inc/navbar.up2index.html -->
|
||
<!-- START: this line starts content from: inc/before-content.default.html -->
|
||
|
||
<div class="content" id="content">
|
||
|
||
<!-- END: this line ends content from: inc/before-content.default.html -->
|
||
<!-- START: this line starts content for HTML phase 21 by: bin/pandoc-wrapper.sh via bin/md2html.sh -->
|
||
|
||
<!-- BEFORE: 1st line of markdown file: 2020/ferguson2/recode.md -->
|
||
<h1 id="the-recode-configurator-documentation-and-a-fun-way-to-explore-my-2020-ioccc-enigma-simulator">The recode configurator documentation (and a fun way to explore my 2020 IOCCC Enigma simulator)</h1>
|
||
<p>N.B. At the end of this file I have given a fun exercise that can be used to
|
||
explore my <a href="https://www.cryptomuseum.com/crypto/enigma/index.htm">Enigma machine</a>
|
||
<a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2020/ferguson2/prog.c">simulator</a>. I really encourage you to do this but of course you don’t
|
||
have to if you don’t wish to.</p>
|
||
<div id="toc">
|
||
<ul>
|
||
<li><a href="#recode">What is recode and why is it recommended?</a></li>
|
||
<li><a href="#options">Options</a>
|
||
<ul>
|
||
<li><a href="#samefile">Protecting against the same I/O file</a></li>
|
||
<li><a href="#fileoptions">File options parser limitation</a></li>
|
||
<li><a href="#validation"><code>-R</code> option validation?</a></li>
|
||
</ul></li>
|
||
<li><a href="#pipingtorecode">Piping commands to recode</a></li>
|
||
<li><a href="#pipingtoenigma">Piping recode to the Enigma simulator</a></li>
|
||
<li><a href="#manuallytest">Manually test the recode program with the Enigma program</a></li>
|
||
<li><a href="#onlyconfig">Only write config file</a></li>
|
||
<li><a href="#reuseconfig">Reusing a configuration</a></li>
|
||
<li><a href="#passtoenigma">Write config file, read data file and pass to Enigma simulator</a></li>
|
||
<li><a href="#directlytoenigma">Piping directly to the Enigma code once (with randomised settings, saved)</a></li>
|
||
<li><a href="#conclusion">Usage conclusion</a></li>
|
||
<li><a href="#additions">Example additions</a></li>
|
||
<li><a href="#exampleuses">Example uses</a></li>
|
||
<li><a href="#fun">A fun way to explore my Enigma machine, with a surprise</a></li>
|
||
</ul>
|
||
</div>
|
||
<div id="recode">
|
||
<h1 id="what-is-recode-and-why-is-it-recommended"><a href="#toc">What is recode and why is it recommended?</a></h1>
|
||
</div>
|
||
<p>To demonstrate how to and why you should use the <a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2020/ferguson2/recode.c">recode.c</a> program with
|
||
the <a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2020/ferguson2/prog.c">Enigma machine simulator</a> I have included some examples here as
|
||
well as brief (‘brief?!’ I am sure many would think but it’s brief for me)
|
||
commentary.</p>
|
||
<p>It would not be possible to do all that the recode program does in my entry
|
||
itself but I wanted to demonstrate the features of my entry and this seemed the
|
||
best way to do that. It also enhances the use of the simulator to make it
|
||
reusable etc.</p>
|
||
<p>The recode name idea is that it recodes the input (validating first) to be input
|
||
for the simulator itself. It can pseudo-randomly select all the settings, it can
|
||
write the settings to a file, read from input file (e.g. for the text to
|
||
encipher/decipher if piped to the simulator) etc.</p>
|
||
<p>Basically it’s a configurator for the Enigma simulator that makes it easier to
|
||
use the simulator as well as to reuse the configuration to decipher messages
|
||
that have been enciphered by those settings. But it also tries to make it look
|
||
more like the real thing in that it shows the actual rotors (e.g. labelling them
|
||
with the Roman numeral, showing their actual orders etc.), the reflectors
|
||
(labelling them with B, C and showing the actual strings) etc.</p>
|
||
<p>In this file I will show an example of each feature and then get to the
|
||
wonderful ‘challenge’ for everyone.</p>
|
||
<h1 id="options"><a href="#toc">Options</a></h1>
|
||
<pre><code> ./recode -h
|
||
usage: ./recode [options]
|
||
-v display selected settings
|
||
-r pseudo-randomly select settings
|
||
-f<input file> read file for Enigma input
|
||
-R<string|file> init settings from settings string or file
|
||
-o<output file> write settings to file</code></pre>
|
||
<p><code>-r</code> randomises settings. It won’t prompt you for settings but it will for input
|
||
if you don’t give the option to read in a file for input.</p>
|
||
<p><code>-v</code> shows selected settings. For example combining <code>-r</code> and <code>-v</code>:</p>
|
||
<pre><code> $ echo IOCCC | ./recode -r -v
|
||
Ring 1: ( I) EKMFLGDQVZNTOWYHXUSPAIBRCJ
|
||
Ring 2: ( V) VZBRGITYUPSDNHLXAWMJQOFECK
|
||
Ring 3: ( IV) ESOVPZJAYQUIRHXLNFTGKDCMWB
|
||
Ring settings: WAR
|
||
Ring positions: XKE
|
||
Reflector: (B) YRUHQSLDPXNGOKMIEBFZCWVJAT
|
||
Plugboard pair #01: XE
|
||
Plugboard pair #02: HJ
|
||
Plugboard pair #03: SA
|
||
Plugboard pair #04: PY
|
||
Plugboard pair #05: CI
|
||
Plugboard pair #06: ZB
|
||
Plugboard pair #07: WD
|
||
Plugboard pair #08: QN
|
||
Plugboard pair #09: RU
|
||
Plugboard pair #10: VG
|
||
1WX5AK4RE1XEHJSAPYCIZBWDQNRUVGIOCCC</code></pre>
|
||
<p>Though you won’t find some of those strings in <a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2020/ferguson2/recode.c">recode.c</a> or
|
||
<a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2020/ferguson2/prog.c">prog.c</a>. Yes the <code>WAR</code> for the Ringstellung (Ring settings) is an
|
||
amusing coincidence <em>but it really did happen!</em></p>
|
||
<p>As for <code>-f</code> the contents would be output with the settings e.g. to pipe to
|
||
<code>prog</code> itself (as if you redirected the file contents to the Enigma machine for
|
||
encipherment/decipherment). If the file cannot be opened it sets back to stdin.</p>
|
||
<p><code>-o</code> outputs the settings to the file. If the file cannot be opened for writing
|
||
or is the same file name (see below) then only stdout will be used. Example of
|
||
randomised output going to a file:</p>
|
||
<pre><code> $ ./recode -r -oconfig
|
||
IOCCC
|
||
3PP4UB5GG1ELGTKFCOPVBNUYXJAWSDIOCCC
|
||
$ cat config
|
||
3PP4UB5GG1ELGTKFCOPVBNUYXJAWSD$</code></pre>
|
||
<p>Notice that a terminating newline isn’t added. Also note that it outputs to
|
||
stdout so you can pipe it to the Enigma machine but at the same time have the
|
||
settings saved for deciphering the text later (the configuration does not have
|
||
the input but both the configuration and the input text is printed to stdout).</p>
|
||
<p>If you want to initialise the settings from previously saved settings (as a
|
||
string or an input file that has the same format) use the <code>-R<settings></code> option.
|
||
Again note that this does not validate input! Although it detects out of range
|
||
for the arrays it doesn’t detect duplicates. This is because it wasn’t meant to
|
||
be any given file or anything else other than the direct output of a previous
|
||
run (thus validated). I’m not even guaranteeing that I got the array tests valid
|
||
in <a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2020/ferguson2/recode.c">recode.c</a> <code>-R</code> option!</p>
|
||
<div id="samefile">
|
||
<h2 id="protecting-against-the-same-io-file"><a href="#toc">Protecting against the same I/O file</a></h2>
|
||
</div>
|
||
<p>Because some file systems are case-insensitive I have implemented a
|
||
case-insensitive <code>strcmp()</code>; if the input file name is the same as the output file
|
||
name I won’t write to it. From a quick test this is important particularly if
|
||
neither file exist because if both calls to <code>stat()</code> fail then the inodes will be
|
||
the same (since what else could they be set to but the same initial value?).
|
||
This might be overprotective but I believe it better to prevent user error where
|
||
possible. Of course if neither file exists it might be argued that it’s not
|
||
necessary to worry since you can’t read from a file that doesn’t exist. But then
|
||
what about if one exists but the other does not?</p>
|
||
<div id="fileoptions">
|
||
<h2 id="file-options-parser-limitation"><a href="#toc">File options parser limitation</a></h2>
|
||
</div>
|
||
<p>Due to the way the parsing of options is done (no spaces between option char and
|
||
argument) shell expansion will not work right so for example doing:</p>
|
||
<pre><code> $ ./recode -R~/config</code></pre>
|
||
<p>will <em>not</em> read the file ‘config’ in the home directory. I show another way to
|
||
achieve this later.</p>
|
||
<p>This limitation also applies to the <code>-f</code> and <code>-o</code> options!</p>
|
||
<div id="validation">
|
||
<h2 id="r-option-validation"><a href="#toc">-R option validation?</a></h2>
|
||
</div>
|
||
<p>Again the <code>-R</code> option does not validate input. For validation you have to run
|
||
the program interactively.</p>
|
||
<div id="pipingtorecode">
|
||
<h1 id="piping-commands-to-recode"><a href="#toc">Piping commands to recode</a></h1>
|
||
</div>
|
||
<p>If stdin is not a tty (<code>!isatty(0)</code>) and neither randomised mode nor reading in
|
||
from a file is specified then you might just see something like:</p>
|
||
<pre><code> $ echo testing test tests | ./recode
|
||
1AB2BB3CC1testing test tests
|
||
|
||
$ echo testing test tests | ./recode | ./prog - 2>/dev/null
|
||
mfrwxan lzng ofnlu
|
||
|
||
$ echo testing test tests | ./recode | ./prog - 2>/dev/null | ./recode
|
||
1AB2BB3CC1mfrwxan lzng ofnlu
|
||
|
||
$ echo testing test tests | ./recode | ./prog - 2>/dev/null | ./recode | ./prog - 2>/dev/null
|
||
testing test tests</code></pre>
|
||
<p>In other words just the defaults. This was to simplify the problems with
|
||
prompting again for input if it’s invalid (though as you’ll see it does a good
|
||
job at this anyway).</p>
|
||
<div id="pipingtoenigma">
|
||
<h1 id="piping-recode-to-the-enigma-simulator"><a href="#toc">Piping recode to the Enigma simulator</a></h1>
|
||
</div>
|
||
<p>If you’re using recode to recode the input so you don’t have to type in the
|
||
input manually (if you randomise or read in from previously saved file no input
|
||
need be done at all) then make sure to redirect stderr to /dev/null. If you
|
||
don’t you might see something like:</p>
|
||
<pre><code> $ ./recode -r | ./prog -
|
||
Ring 1: IOCCC
|
||
Setting 1: Position 1: Ring 2: Setting 2: Position 2: Ring 3: Setting 3: Position 3: Reflector: Plugboard pair 1: Plugboard pair 2: Plugboard pair 3: Plugboard pair 4: Plugboard pair 5: Plugboard pair 6: Plugboard pair 7: Plugboard pair 8: Plugboard pair 9: Plugboard pair 10: DEVIY</code></pre>
|
||
<p>What happened is that <code>Ring 1:</code> is printed to stderr but since it’s not been
|
||
redirected to <code>/dev/null</code> it prints this out; at this point however it prompts for
|
||
input. Why or how it shows the first prompt instead of later on I do not know.
|
||
Anyway at this point the simulator is already expecting input to en/decipher.
|
||
That’s why after I sent EOF it printed out the remaining strings to stderr.</p>
|
||
<div id="manuallytest">
|
||
<h1 id="manually-test-the-recode-program-with-the-enigma-program"><a href="#toc">Manually test the recode program with the Enigma program</a></h1>
|
||
</div>
|
||
<pre><code> $ cat input
|
||
IOCCC
|
||
|
||
$ ./recode -finput
|
||
Rotors:
|
||
(1) I: EKMFLGDQVZNTOWYHXUSPAIBRCJ
|
||
(2) II: AJDKSIRUXBLHWTMCQGZNPYFVOE
|
||
(3) III: BDFHJLCPRTXVZNYEIWGAKMUSQO
|
||
(4) IV: ESOVPZJAYQUIRHXLNFTGKDCMWB
|
||
(5) V: VZBRGITYUPSDNHLXAWMJQOFECK
|
||
Input rotor 1 (1 - 5): 1
|
||
Input rotor 2 (1 - 5): 2
|
||
Input rotor 3 (1 - 5): 3
|
||
Input setting 1 (A - Z): A
|
||
Input setting 2 (A - Z): A
|
||
Input setting 3 (A - Z): A
|
||
Input position 1 (A - Z): A
|
||
Input position 2 (A - Z): A
|
||
Input position 3 (A - Z): A
|
||
Reflector:
|
||
(1) (B) YRUHQSLDPXNGOKMIEBFZCWVJAT
|
||
(2) (C) FVPJIAOYEDRZXWGCTKUQSBNMHL
|
||
Input reflector (1 - 2): 2
|
||
Input plugboard pair 1: AB
|
||
Input plugboard pair 2: CD
|
||
Input plugboard pair 3: ..
|
||
Input plugboard pair 4: EF
|
||
Input plugboard pair 5: GH
|
||
Input plugboard pair 6: IJ
|
||
Input plugboard pair 7: KL
|
||
Input plugboard pair 8: MN
|
||
Input plugboard pair 9: OP
|
||
Input plugboard pair 10: QR
|
||
1AA2AA3AA2ABCD..EFGHIJKLMNOPQRIOCCC</code></pre>
|
||
<p>Notice that I skipped a <a href="https://www.cryptomuseum.com/crypto/enigma/i/sb.htm">plugboard
|
||
pair</a>; this can be done in
|
||
a number of ways but two dots is one. Notice also that it’s in a different order
|
||
than the simulator: because with the size restrictions on my entry I saved bytes
|
||
by using the same loop where I could. It just felt more natural to have them
|
||
grouped together in a configurator for the <a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2020/ferguson2/prog.c">simulator</a>.</p>
|
||
<pre><code> $ echo 1AA2AA3AA2ABCD..EFGHIJKLMNOPQRIOCCC | ./prog - 2>/dev/null
|
||
HQNVO
|
||
$ echo 1AA2AA3AA2ABCD..EFGHIJKLMNOPQRIOCCC | ./prog - 2>/dev/null | echo 1AA2AA3AA2ABCD..EFGHIJKLMNOPQRHQNVO | ./prog - 2>/dev/null
|
||
IOCCC</code></pre>
|
||
<p>As you can see the <code>recode</code> program prompts for the settings and outputs the
|
||
input for the Enigma program. I then copied/pasted that output to the program
|
||
and got the result <code>HQNVO</code>.</p>
|
||
<p>Following this I piped the original output (of <code>recode</code>) to the simulator and then
|
||
piped that to the echo of the input settings (replacing the IOCCC with the
|
||
Enigma enciphered output) and then got the result IOCCC: the original input!
|
||
(This was before I implemented the <code>-R</code> option to greatly simplify things.)</p>
|
||
<p>Of course the last command was redundant in that I didn’t need to show the first
|
||
part again; I could have just done the latter part but I wanted to show the way
|
||
the pipeline works with settings etc.</p>
|
||
<p>What happens if the plugboard pairs are the same but in a different order? It’s
|
||
the same output:</p>
|
||
<pre><code> $ echo 1AA2AA3AA2AB..CDEFGHIJKLMNOPQRIOCCC|./prog - 2>/dev/null
|
||
HQNVO</code></pre>
|
||
<p>Also if you flip the order of the letters in the pair e.g. the AB as BA instead:</p>
|
||
<pre><code> $ echo 1AA2AA3AA2BA..CDEFGHIJKLMNOPQRIOCCC|./prog - 2>/dev/null
|
||
HQNVO</code></pre>
|
||
<div id="onlyconfig">
|
||
<h1 id="only-write-config-file"><a href="#toc">Only write config file</a></h1>
|
||
</div>
|
||
<pre><code> $ ./recode -v -oconfig -finput >/dev/null
|
||
Rotors:
|
||
(1) I: EKMFLGDQVZNTOWYHXUSPAIBRCJ
|
||
(2) II: AJDKSIRUXBLHWTMCQGZNPYFVOE
|
||
(3) III: BDFHJLCPRTXVZNYEIWGAKMUSQO
|
||
(4) IV: ESOVPZJAYQUIRHXLNFTGKDCMWB
|
||
(5) V: VZBRGITYUPSDNHLXAWMJQOFECK
|
||
Input rotor 1 (1 - 5): 1
|
||
Input rotor 2 (1 - 5): 2
|
||
Input rotor 3 (1 - 5): 3
|
||
Input setting 1 (A - Z): A
|
||
Input setting 2 (A - Z): C
|
||
Input setting 3 (A - Z): E
|
||
Input position 1 (A - Z): B
|
||
Input position 2 (A - Z): D
|
||
Input position 3 (A - Z): F
|
||
Reflector:
|
||
(1) (B) YRUHQSLDPXNGOKMIEBFZCWVJAT
|
||
(2) (C) FVPJIAOYEDRZXWGCTKUQSBNMHL
|
||
Input reflector (1 - 2): 2
|
||
Input plugboard pair 1: AB
|
||
Input plugboard pair 2: CD
|
||
Input plugboard pair 3: EF
|
||
Input plugboard pair 4: GHIJ
|
||
Input plugboard pair 5: IJ
|
||
Input plugboard pair 6: KL
|
||
Input plugboard pair 7: MN
|
||
Input plugboard pair 8: OP
|
||
Input plugboard pair 9: QR
|
||
Input plugboard pair 10: ST
|
||
Ring 1: ( I) EKMFLGDQVZNTOWYHXUSPAIBRCJ
|
||
Ring 2: ( II) AJDKSIRUXBLHWTMCQGZNPYFVOE
|
||
Ring 3: (III) BDFHJLCPRTXVZNYEIWGAKMUSQO
|
||
Ring settings: ACE
|
||
Ring positions: BDF
|
||
Reflector: (C) FVPJIAOYEDRZXWGCTKUQSBNMHL
|
||
Plugboard pair #01: AB
|
||
Plugboard pair #02: CD
|
||
Plugboard pair #03: EF
|
||
Plugboard pair #04: GH
|
||
Plugboard pair #05: IJ
|
||
Plugboard pair #06: KL
|
||
Plugboard pair #07: MN
|
||
Plugboard pair #08: OP
|
||
Plugboard pair #09: QR
|
||
Plugboard pair #10: ST</code></pre>
|
||
<p>Notice that I redirect stdout to /dev/null so that the config is only written to
|
||
the file config. But also notice that for <a href="https://www.cryptomuseum.com/crypto/enigma/i/sb.htm">plugboard
|
||
pair</a> 4 I typed in <code>GHIJ</code>
|
||
and it didn’t report an error. Neither did it complain about <code>IJ</code> in the next
|
||
pair. This is because it consumes input overflow.</p>
|
||
<p>It shouldn’t be this way for the simulator though because that could cause
|
||
inconsistent number of characters expected before the text to encipher.</p>
|
||
<pre><code> $ cat config
|
||
1AB2CD3EF2ABCDEFGHIJKLMNOPQRST
|
||
|
||
$ ( cat config ; cat input ) | ./prog - 2>/dev/null
|
||
LRAVE
|
||
|
||
$ ( cat config ; cat input ) | ./prog - 2>/dev/null | ( cat config ; echo LRAVE ) | ./prog - 2>/dev/null
|
||
IOCCC</code></pre>
|
||
<p>What if you don’t want to worry about having to specify input but just have the
|
||
settings written? You can do that too by either sending a newline or else
|
||
directly type ctrl-d (or whatever you have EOF set to) or give it an empty file.</p>
|
||
<p>The following are all equivalent in that they will write to a settings file (the
|
||
first one will print a newline with the echo but that won’t matter):</p>
|
||
<pre><code> $ echo | ./recode -r -osettings
|
||
$ echo -n | ./recode -r -osettings
|
||
$ > empty
|
||
$ ./recode -r -osettings < empty
|
||
$ cat empty | ./recode -r -osettings
|
||
$ ./recode -r -osettings
|
||
^D</code></pre>
|
||
<p>(Above ^D was not shown but I typed it.) The way it works: if nothing is read
|
||
the buffer remains <code>NULL</code> and so I don’t print it but still do print the settings
|
||
file. (Actually even if <code>getdelim()</code> fails you’re supposed to free the buffer so I
|
||
set another variable to indicate if it should be printed.)</p>
|
||
<div id="reuseconfig">
|
||
<h1 id="reusing-a-configuration"><a href="#toc">Reusing a configuration</a></h1>
|
||
</div>
|
||
<pre><code> $ echo -n|./recode -r -oconfig
|
||
4UH5II1RJ1SPIFEJLYGZWRTBHVCAMN$
|
||
|
||
$ cat input.txt
|
||
IOCCC 2020 Enigma simulator example text file
|
||
|
||
This is a sentence.
|
||
|
||
This is another sentence.
|
||
|
||
$ ( cat config ; cat input.txt ) | ./prog - 2>/dev/null > output
|
||
$ cat output
|
||
AAPRT 2020 Dkemny tpgnjsjai xpovrgl jvgs wxra
|
||
|
||
Fytt ly m xyiilaqh.
|
||
|
||
Ybbp ox dmuzerm oscwgytb.
|
||
$ ( cat config ; cat output ) | ./prog - 2>/dev/null > io
|
||
$ diff io input.txt
|
||
$</code></pre>
|
||
<p>Alternatively you can just use the <code>-R</code> and <code>-f</code> options:</p>
|
||
<pre><code> $ ./recode -finput.txt -Rconfig | ./prog - 2>/dev/null > output2
|
||
$ diff output output2
|
||
$</code></pre>
|
||
<div id="passtoenigma">
|
||
<h1 id="write-config-file-read-data-file-and-pass-to-enigma-simulator"><a href="#toc">Write config file, read data file and pass to Enigma simulator</a></h1>
|
||
</div>
|
||
<pre><code> $ ./recode -finput.txt -oconfig | ./prog - 2>/dev/null > output
|
||
Rotors:
|
||
(1) I: EKMFLGDQVZNTOWYHXUSPAIBRCJ
|
||
(2) II: AJDKSIRUXBLHWTMCQGZNPYFVOE
|
||
(3) III: BDFHJLCPRTXVZNYEIWGAKMUSQO
|
||
(4) IV: ESOVPZJAYQUIRHXLNFTGKDCMWB
|
||
(5) V: VZBRGITYUPSDNHLXAWMJQOFECK
|
||
Input rotor 1 (1 - 5): 2
|
||
Input rotor 2 (1 - 5): 5
|
||
Input rotor 3 (1 - 5): 3
|
||
Input setting 1 (A - Z): C
|
||
Input setting 2 (A - Z): O
|
||
Input setting 3 (A - Z): D
|
||
Input position 1 (A - Z): E
|
||
Input position 2 (A - Z): L
|
||
Input position 3 (A - Z): O
|
||
Reflector:
|
||
(1) (B) YRUHQSLDPXNGOKMIEBFZCWVJAT
|
||
(2) (C) FVPJIAOYEDRZXWGCTKUQSBNMHL
|
||
Input reflector (1 - 2): 2
|
||
Input plugboard pair 1: TR
|
||
Input plugboard pair 2: SN
|
||
Input plugboard pair 3: OG
|
||
Input plugboard pair 4: ME
|
||
Input plugboard pair 5: XY
|
||
Input plugboard pair 6: WZ
|
||
Input plugboard pair 7: UV
|
||
Input plugboard pair 8: AB
|
||
Input plugboard pair 9: CD
|
||
Input plugboard pair 10: FI
|
||
|
||
$ cat config
|
||
2CE5OL3DO2TRSNOGMEXYWZUVABCDFI</code></pre>
|
||
<p>Besides a famous book that I happen to love (who doesn’t? Ah, but what is it
|
||
Cody?) there’s also a reference to code which I also love (just as all
|
||
participants of the IOCCC do). Other things there don’t mean anything but what
|
||
does is the output:</p>
|
||
<pre><code> $ cat output
|
||
DBFAF 2020 Ittejg ltblwriac uqdfqvr dhqh ghhf
|
||
|
||
Jsjy ce v pxdmullo.
|
||
|
||
Sara tj rtaayak uxfhjcti.
|
||
|
||
$ ./recode -Rconfig -foutput | ./prog - 2>/dev/null
|
||
IOCCC 2020 Enigma simulator example text file
|
||
|
||
This is a sentence.
|
||
|
||
This is another sentence.</code></pre>
|
||
<div id="directlytoenigma">
|
||
<h1 id="piping-directly-to-the-enigma-code-once-with-randomised-settings-saved"><a href="#toc">Piping directly to the Enigma code once (with randomised settings, saved)</a></h1>
|
||
</div>
|
||
<p>This is like the above only randomised:</p>
|
||
<pre><code> $ ./recode -r -oconfig|./prog - 2>/dev/null
|
||
IOCCC
|
||
UGEVP</code></pre>
|
||
<p>Note that I typed in <code>IOCCC</code> and sent <code>EOF</code> (ctrl-d); the settings were written to
|
||
the config file (for deciphering later) and then all of it was piped to the
|
||
Enigma entry resulting in the line below IOCCC. But let’s verify it worked out
|
||
okay:</p>
|
||
<pre><code> $ cat config
|
||
2BM4GJ3HK1LNCBXWRMGKSYIAZUTPVJ</code></pre>
|
||
<p>Without having to copy/paste intermediate results:</p>
|
||
<pre><code> $ echo IOCCC | ./recode -Rconfig | ./prog - 2>/dev/null | ./recode -Rconfig | ./prog - 2>/dev/null
|
||
IOCCC</code></pre>
|
||
<p>You can also use a string for the <code>-R</code> option. I’ll use command substitution and
|
||
actual pasting to demonstrate:</p>
|
||
<pre><code> $ echo IOCCC | ./recode -R$(cat config) | ./prog - 2>/dev/null | ./recode -R2BM4GJ3HK1LNCBXWRMGKSYIAZUTPVJ | ./prog - 2>/dev/null
|
||
IOCCC</code></pre>
|
||
<div id="conclusion">
|
||
<h1 id="usage-conclusion"><a href="#toc">Usage conclusion</a></h1>
|
||
</div>
|
||
<p>That should give you an idea of how to use the <code>recode</code> program. I leave it as
|
||
an exercise to the reader to implement additional features but here are some
|
||
ideas of what could be done and how this entry might be used (including that
|
||
delicious challenge).</p>
|
||
<div id="additions">
|
||
<h1 id="example-additions"><a href="#toc">Example additions</a></h1>
|
||
</div>
|
||
<ul>
|
||
<li>Add code, to <a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2020/ferguson2/prog.c">prog.c</a>, that tries to determine possible decipherments based on
|
||
a given crib (or set of cribs).</li>
|
||
</ul>
|
||
<div id="exampleuses">
|
||
<h1 id="example-uses"><a href="#toc">Example uses</a></h1>
|
||
</div>
|
||
<ul>
|
||
<li><p>Take an actual key sheet and message for that day and try and decipher the
|
||
message (might help if you know German!). I haven’t actually done this for
|
||
reasons I explained in the remarks (including that I cannot easily verify one
|
||
particular as well as the fact that there were different procedures, different
|
||
machines etc. - plus my vision is not good enough for the quality of the
|
||
pictures).</p></li>
|
||
<li><p>Try making sense of a politician’s speeches by putting them into the
|
||
simulator. It might not make much sense but can it honestly be that much worse ?
|
||
:) Actually yes it could be (and we don’t need the Enigma helping them either)
|
||
and I can think of a whole host of other things more entertaining including
|
||
watching dry paint stay dry on a wall but why not poke fun at politicians
|
||
anyway?</p></li>
|
||
<li><p>Best idea: try the below experiment!</p></li>
|
||
</ul>
|
||
<div id="fun">
|
||
<h1 id="a-fun-way-to-explore-my-enigma-machine-with-a-surprise"><a href="#toc">A fun way to explore my Enigma machine, with a surprise</a></h1>
|
||
</div>
|
||
<p>As I was making the above silly list something occurred to me. My <a href="https://www.ioccc.org/2020/ferguson1/index.html">other
|
||
entry</a> this year includes a
|
||
<a href="https://www.ioccc.org/2020/ferguson1/chocolate-cake.html">recipe for a wonderful double-layered chocolate fudge
|
||
cake</a> but then
|
||
shouldn’t this entry include something that is fun too? But if that’s the case
|
||
why on Earth should it be unscrambled? It would be more fun and a great way to
|
||
explore this entry if you have to use the Enigma machine to read the message!</p>
|
||
<p>So this is what I offer: if you take one of the settings below and run the
|
||
Enigma machine simulator on the file [enigma.html][enigma.html] you will
|
||
unlock a html file with something special in it. I recommend you decrypt it to
|
||
<code>decrypted.html</code> and open it in a web browser.</p>
|
||
<p>The correct settings is listed below but <em>you</em> must determine which one is the
|
||
right line. Before you do this here are some things to ask yourself:</p>
|
||
<ol start="0" type="1">
|
||
<li><p>Are any invalid input?</p></li>
|
||
<li><p>Is there some other kind of trickery involved here?</p></li>
|
||
</ol>
|
||
<p>I can think of the best way to answer these and I think I need not even mention
|
||
it. Have fun and enjoy!</p>
|
||
<h2 id="hints">Hints:</h2>
|
||
<ol start="0" type="1">
|
||
<li><p>It’s not the middle one.</p></li>
|
||
<li><p>Yes there are some things kind of spelt here. Some things spelt mean nothing
|
||
whatever and can be considered coincidences. Some were randomised.</p></li>
|
||
<li><p>There is an obscure thing about my entry that can help locate the proper key
|
||
of the 16 given below! The questions are what is it and is is it worth going
|
||
this way? (I think the second answer is ‘yes’ but that’s me.)</p></li>
|
||
</ol>
|
||
<p>Of course, the above points might or might not be relevant. Didst you really
|
||
think that I would give too much away? :)</p>
|
||
<pre><code> 142CHOCOLATESVCAKESTBJLKMUMVWX
|
||
0EZ4PC1CC0PGTAQSOXWNMDRYKFUZEI
|
||
3UY0XF4QG1GTJQLARPKHBEMCOFVUIN
|
||
0WE1HK4PL0RVSGXFDKENZYTPCMAHUW
|
||
2LV0KC1IE0HTFPCLWOJDBQIRVMEAGN
|
||
1SS4QX2RY1SRAQGKUYHCBLPFJDVTNZ
|
||
3IW1QR0TZ0GQEDWIYJUPMFZBRAONHS
|
||
3OP1KN4MO0HPFZCEAKYQIRXGVMOTUW
|
||
4OC2CC0AK1CODELUVRSNGKIZBJPTMY
|
||
4MU0MS1CA1KELUVRSXTABJNOCDMQFG
|
||
0MU4MC2HO1CLATEFBJMONPQRVWXYZD
|
||
125CHOCOLATESEXCAKESJADFNOPQRS
|
||
0CH3OC1OL1ATEMBJNOCDLSIFWHRVXY
|
||
4MU1MS3CA0KECHOLATBJSNPXVUFGZY
|
||
4VW0SL1YB0IYJSLBECKTNAXGPUVHRF
|
||
0MC4OH2CO1LATEUMBJCDFGHINOPRQS</code></pre>
|
||
<p>BTW: what’s the middle of a list with even numbered items anyway?</p>
|
||
<p>To help you out, though, this is how you might do the decrypting. Assuming that
|
||
the key you wish to select is</p>
|
||
<pre><code> 0EZ4PC1CC0PGTAQSOXWNMDRYKFUZEI</code></pre>
|
||
<p>you can do:</p>
|
||
<pre><code> ./recode -R0EZ4PC1CC0PGTAQSOXWNMDRYKFUZEI -fenigma.html | ./prog - 2>/dev/null > enigma.deciphered.html</code></pre>
|
||
<p>Then open <code>enigma.deciphered.html</code> in your browser. A command is provided in
|
||
<a href="testing-procedure.html">testing-procedure.html</a> that does this too but it
|
||
shows how you can use a file as input for the key instead as well as how I
|
||
tested the code.</p>
|
||
<hr style="width:10%;text-align:left;margin-left:0">
|
||
<p>Jump to: <a href="#">top</a></p>
|
||
<!--
|
||
|
||
Copyright © 1984-2024 by Landon Curt Noll. All Rights Reserved.
|
||
|
||
You are free to share and adapt this file under the terms of this license:
|
||
|
||
Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0)
|
||
|
||
For more information, see:
|
||
|
||
https://creativecommons.org/licenses/by-sa/4.0/
|
||
|
||
-->
|
||
<!-- AFTER: last line of markdown file: 2020/ferguson2/recode.md -->
|
||
|
||
<!-- END: this line ends content for HTML phase 21 by: bin/pandoc-wrapper.sh via bin/md2html.sh -->
|
||
<!-- START: this line starts content from: inc/after-content.default.html -->
|
||
|
||
</div>
|
||
|
||
<!-- END: this line ends content from: inc/after-content.default.html -->
|
||
<!-- START: this line starts content from: inc/footer.default.html -->
|
||
|
||
<!--
|
||
|
||
Copyright © 1984-2024 by Landon Curt Noll. All Rights Reserved.
|
||
|
||
You are free to share and adapt this file under the terms of this license:
|
||
|
||
Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0)
|
||
|
||
For more information, see:
|
||
|
||
https://creativecommons.org/licenses/by-sa/4.0/
|
||
|
||
-->
|
||
|
||
<div class="footer">
|
||
|
||
<div id="copyright"><h3>Copyright © 1984-2024 by Landon Curt Noll:
|
||
<a href="https://creativecommons.org/faq/#what-does-some-rights-reserved-mean"
|
||
target="_blank"
|
||
rel="license noopener noreferrer">Some Rights Reserved</a></h3>
|
||
<p>
|
||
This work is <b>licensed by Landon Curt Noll</b> under
|
||
<b><a href="https://creativecommons.org/licenses/by-sa/4.0/?ref=chooser-v1"
|
||
target="_blank"
|
||
rel="license noopener noreferrer"
|
||
style="display:inline-block;">CC BY-SA 4.0</a></b>.
|
||
<img style="height:22px!important;margin-left:3px;vertical-align:text-bottom;"
|
||
src="../../png/cc.png"
|
||
alt="cc inside circle symbol">
|
||
<img style="height:22px!important;margin-left:3px;vertical-align:text-bottom;"
|
||
src="../../png/by.png"
|
||
alt="person inside circle symbol">
|
||
<img style="height:22px!important;margin-left:3px;vertical-align:text-bottom;"
|
||
src="../../png/sa.png"
|
||
alt="arrow looping back on itself inside circle symbol"><br>
|
||
You should <b>carefully review</b> the
|
||
<b><a href="https://creativecommons.org/licenses/by-sa/4.0/legalcode.en"
|
||
target="_blank"
|
||
rel="license noopener noreferrer">CC BY-SA 4.0 LEGAL CODE</a></b>
|
||
before using the licensed material.<br>
|
||
You may wish to review the
|
||
<b><a href="../../license.html"
|
||
target="_blank"
|
||
rel="license noopener noreferrer">highlights of some of the key features and terms</a></b>
|
||
of <b>CC BY-SA 4.0</b>.<br>
|
||
</p>
|
||
</div>
|
||
|
||
<div id="coda"><h3>Coda</h3>
|
||
<p>
|
||
<a href="https://validator.w3.org/nu/?doc=https%3A%2F%2Fioccc-src.github.io%2Ftemp-test-ioccc%2F2020%2Fferguson2%2Frecode.html" rel="nofollow">Nu HTML check this web page</a><br>
|
||
<a href="#top">Jump to top</a> <a href="#content">Jump to Content</a>
|
||
</p>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<!-- END: this line ends content from: inc/footer.default.html -->
|
||
<!-- START: this line starts content from: inc/bottom.default.html -->
|
||
|
||
</body>
|
||
</html>
|
||
|
||
<!-- END: this line ends content from: inc/bottom.default.html -->
|