{"id":16,"date":"2026-02-06T16:37:28","date_gmt":"2026-02-06T16:37:28","guid":{"rendered":"https:\/\/whiteland.net\/jonathan\/?page_id=16"},"modified":"2026-03-27T14:35:52","modified_gmt":"2026-03-27T14:35:52","slug":"programming","status":"publish","type":"page","link":"https:\/\/whiteland.net\/jonathan\/programming\/","title":{"rendered":"Programming"},"content":{"rendered":"\n<h1 class=\"wp-block-heading\" style=\"margin-top:var(--wp--preset--spacing--40)\">Programming over the years<\/h1>\n\n\n\n<blockquote class=\"wp-block-quote is-style-default line-accent-5 is-layout-flow wp-block-quote-is-layout-flow\" style=\"border-top-color:var(--wp--preset--color--accent-5);border-right-color:var(--wp--preset--color--accent-5);border-bottom-color:var(--wp--preset--color--accent-5);border-left-color:var(--wp--preset--color--accent-5);border-left-width:10px\">\n<p>Programming has been my work and my hobby my whole life. I love the craft of making computers do my bidding.<\/p>\n<\/blockquote>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-8d88fe0f wp-block-columns-is-layout-flex\" style=\"padding-top:var(--wp--preset--spacing--20);padding-bottom:var(--wp--preset--spacing--20)\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"border-style:none;border-width:0px;padding-top:0;padding-right:0;padding-bottom:0;padding-left:0\">\n<figure class=\"wp-block-image size-large has-custom-border\" style=\"margin-top:0;margin-right:0;margin-bottom:0;margin-left:0\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"818\" src=\"https:\/\/whiteland.net\/jonathan\/wp-content\/uploads\/2026\/03\/Skewed-RBAC-screenshot-1024x818.png\" alt=\"Skewed screenshot of syntax highlighted PHP code (it's for the &quot;Role-based Access Control&quot; plugin).\" class=\"has-border-color has-accent-6-border-color wp-image-196\" style=\"border-width:1px;object-fit:cover\" srcset=\"https:\/\/whiteland.net\/jonathan\/wp-content\/uploads\/2026\/03\/Skewed-RBAC-screenshot-1024x818.png 1024w, https:\/\/whiteland.net\/jonathan\/wp-content\/uploads\/2026\/03\/Skewed-RBAC-screenshot-300x240.png 300w, https:\/\/whiteland.net\/jonathan\/wp-content\/uploads\/2026\/03\/Skewed-RBAC-screenshot-768x614.png 768w, https:\/\/whiteland.net\/jonathan\/wp-content\/uploads\/2026\/03\/Skewed-RBAC-screenshot.png 1214w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"padding-top:0;padding-bottom:0\">\n<h2 class=\"wp-block-heading\">PHP &amp; WordPress<\/h2>\n\n\n\n<p class=\"has-medium-font-size\" style=\"line-height:1.6\"><em>From the 2010s &#8217;til today,<\/em> I&#8217;ve been wrangling WordPress websites (for YTKO, myself, and others). I&#8217;ve written many custom plugins along the way to do things like event presentation, fragment re-use (before blocks existed), inter-site data transfer, and role-based access control.<\/p>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-8d88fe0f wp-block-columns-is-layout-flex\" style=\"padding-top:var(--wp--preset--spacing--20);padding-bottom:var(--wp--preset--spacing--20)\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"padding-top:0;padding-bottom:0\">\n<h2 class=\"wp-block-heading has-text-align-left\">PHP &amp; MySQL<\/h2>\n\n\n\n<p class=\"has-text-align-left has-medium-font-size\" style=\"line-height:1.6\"><em>In the early 2000s<\/em> \u2013 like many web engineers of the time \u2013 I used PHP to write a full-featured news, events, and membership website for YTKO&#8217;s <em>Enterprising Women<\/em> project. It won an award!<br>&nbsp;<br>&nbsp;<\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"padding-top:0;padding-right:0;padding-bottom:0;padding-left:0\">\n<figure class=\"wp-block-image aligncenter size-large has-custom-border\" style=\"margin-top:0;margin-right:0;margin-bottom:0;margin-left:0\"><img loading=\"lazy\" decoding=\"async\" width=\"762\" height=\"1024\" src=\"https:\/\/whiteland.net\/jonathan\/wp-content\/uploads\/2026\/02\/Proud-holder-of-22Highly-Commended-Best-Use-of-ICT22-762x1024.jpg\" alt=\"\" class=\"has-border-color has-accent-6-border-color wp-image-156\" style=\"border-width:1px\" srcset=\"https:\/\/whiteland.net\/jonathan\/wp-content\/uploads\/2026\/02\/Proud-holder-of-22Highly-Commended-Best-Use-of-ICT22-762x1024.jpg 762w, https:\/\/whiteland.net\/jonathan\/wp-content\/uploads\/2026\/02\/Proud-holder-of-22Highly-Commended-Best-Use-of-ICT22-223x300.jpg 223w, https:\/\/whiteland.net\/jonathan\/wp-content\/uploads\/2026\/02\/Proud-holder-of-22Highly-Commended-Best-Use-of-ICT22-768x1032.jpg 768w, https:\/\/whiteland.net\/jonathan\/wp-content\/uploads\/2026\/02\/Proud-holder-of-22Highly-Commended-Best-Use-of-ICT22-1143x1536.jpg 1143w, https:\/\/whiteland.net\/jonathan\/wp-content\/uploads\/2026\/02\/Proud-holder-of-22Highly-Commended-Best-Use-of-ICT22-1524x2048.jpg 1524w, https:\/\/whiteland.net\/jonathan\/wp-content\/uploads\/2026\/02\/Proud-holder-of-22Highly-Commended-Best-Use-of-ICT22-scaled.jpg 1905w\" sizes=\"auto, (max-width: 762px) 100vw, 762px\" \/><\/figure>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-8d88fe0f wp-block-columns-is-layout-flex\" style=\"padding-top:var(--wp--preset--spacing--20);padding-bottom:var(--wp--preset--spacing--20)\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"padding-top:0;padding-right:0;padding-bottom:0;padding-left:0\">\n<figure class=\"wp-block-image aligncenter size-large has-custom-border\" style=\"margin-top:0;margin-right:0;margin-bottom:0;margin-left:0\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"649\" src=\"https:\/\/whiteland.net\/jonathan\/wp-content\/uploads\/2026\/03\/8653949979_e1b3e03bcc_o-1024x649.jpg\" alt=\"\" class=\"has-border-color has-accent-6-border-color wp-image-180\" style=\"border-width:1px\" srcset=\"https:\/\/whiteland.net\/jonathan\/wp-content\/uploads\/2026\/03\/8653949979_e1b3e03bcc_o-1024x649.jpg 1024w, https:\/\/whiteland.net\/jonathan\/wp-content\/uploads\/2026\/03\/8653949979_e1b3e03bcc_o-300x190.jpg 300w, https:\/\/whiteland.net\/jonathan\/wp-content\/uploads\/2026\/03\/8653949979_e1b3e03bcc_o-768x487.jpg 768w, https:\/\/whiteland.net\/jonathan\/wp-content\/uploads\/2026\/03\/8653949979_e1b3e03bcc_o-1536x973.jpg 1536w, https:\/\/whiteland.net\/jonathan\/wp-content\/uploads\/2026\/03\/8653949979_e1b3e03bcc_o-2048x1298.jpg 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"padding-top:0;padding-bottom:0\">\n<h2 class=\"wp-block-heading\">Perl<\/h2>\n\n\n\n<p class=\"has-medium-font-size\" style=\"line-height:1.6\"><em>In the mid 90s<\/em>,  while working for  Chadwyck-Healey, I made their first website, include a Perl-driven search of their catalog. <em>In the early 2000s<\/em>, during my long strint working for YTKO, I wrote an email blasting system that by 2013 had sent out 10 million marketing emails: each one constructed  and sent by a Perl script (and tracked with PHP), all running off a big MySQL database.<\/p>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-8d88fe0f wp-block-columns-is-layout-flex\" style=\"padding-top:var(--wp--preset--spacing--20);padding-bottom:var(--wp--preset--spacing--20)\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"padding-top:0;padding-bottom:0\">\n<h2 class=\"wp-block-heading has-text-align-left\">C &amp; C++<\/h2>\n\n\n\n<p class=\"has-text-align-left has-medium-font-size\" style=\"line-height:1.6\"><em>In the mid 90s<\/em>, while working for a tiny CBT (computer based training) company, I was programming in C on DOS (our corporate training product called ExpertEase), and in C++ on Windows (creating an interface to review summaries extracted \u2013 using NLP \u2013 from technical abstracts for an EU-funded project).<\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"padding-top:0;padding-right:0;padding-bottom:0;padding-left:0\">\n<figure class=\"wp-block-image aligncenter size-large is-resized has-custom-border\" style=\"margin-top:0;margin-right:0;margin-bottom:0;margin-left:0\"><img loading=\"lazy\" decoding=\"async\" width=\"788\" height=\"1024\" src=\"https:\/\/whiteland.net\/jonathan\/wp-content\/uploads\/2026\/03\/Borland-C-User-Guide-cover-788x1024.png\" alt=\"\" class=\"has-border-color has-accent-6-border-color wp-image-198\" style=\"border-width:1px;aspect-ratio:0.7695640870092729;width:278px;height:auto\" srcset=\"https:\/\/whiteland.net\/jonathan\/wp-content\/uploads\/2026\/03\/Borland-C-User-Guide-cover-788x1024.png 788w, https:\/\/whiteland.net\/jonathan\/wp-content\/uploads\/2026\/03\/Borland-C-User-Guide-cover-231x300.png 231w, https:\/\/whiteland.net\/jonathan\/wp-content\/uploads\/2026\/03\/Borland-C-User-Guide-cover-768x998.png 768w, https:\/\/whiteland.net\/jonathan\/wp-content\/uploads\/2026\/03\/Borland-C-User-Guide-cover.png 910w\" sizes=\"auto, (max-width: 788px) 100vw, 788px\" \/><\/figure>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-8d88fe0f wp-block-columns-is-layout-flex\" style=\"padding-top:var(--wp--preset--spacing--20);padding-bottom:var(--wp--preset--spacing--20)\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"padding-top:0;padding-right:0;padding-bottom:0;padding-left:0\">\n<figure class=\"wp-block-image aligncenter size-large has-custom-border\" style=\"margin-top:0;margin-right:0;margin-bottom:0;margin-left:0\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"768\" src=\"https:\/\/whiteland.net\/jonathan\/wp-content\/uploads\/2026\/03\/MPDS-Ducting-1-1024x768.jpeg\" alt=\"\" class=\"has-border-color has-accent-6-border-color wp-image-182\" style=\"border-width:1px\" srcset=\"https:\/\/whiteland.net\/jonathan\/wp-content\/uploads\/2026\/03\/MPDS-Ducting-1-1024x768.jpeg 1024w, https:\/\/whiteland.net\/jonathan\/wp-content\/uploads\/2026\/03\/MPDS-Ducting-1-300x225.jpeg 300w, https:\/\/whiteland.net\/jonathan\/wp-content\/uploads\/2026\/03\/MPDS-Ducting-1-768x576.jpeg 768w, https:\/\/whiteland.net\/jonathan\/wp-content\/uploads\/2026\/03\/MPDS-Ducting-1-1536x1152.jpeg 1536w, https:\/\/whiteland.net\/jonathan\/wp-content\/uploads\/2026\/03\/MPDS-Ducting-1.jpeg 1800w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"padding-top:0;padding-bottom:0\">\n<h2 class=\"wp-block-heading\">Bacis2<\/h2>\n\n\n\n<p class=\"has-medium-font-size\" style=\"line-height:1.6\"><em>In the early 90s<\/em>, while working CIS\/Prime Computervision, I wrote the reference and tutorial guides for their in-house language Bacis2. Using that I first prototyped a hypertext implementation of their help system, then went on to extend the capabilities of their MEDUSA Plant Design System (MPDS) to support ducting.<\/p>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-8d88fe0f wp-block-columns-is-layout-flex\" style=\"padding-top:var(--wp--preset--spacing--20);padding-bottom:var(--wp--preset--spacing--20)\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"padding-top:0;padding-bottom:0\">\n<h2 class=\"wp-block-heading has-text-align-left\">PostScript &amp; VAX Basic<\/h2>\n\n\n\n<p class=\"has-text-align-left has-medium-font-size\" style=\"line-height:1.6\"><em>In the late 80s<\/em>, while at CCAT (now Anglia Ruskin University), I wrote a non-WYSIWYG text formatter called PROFF. The code to parse the marked up files was written in VAX Basic, but the majority of the work \u2013 and all the logic \u2013 was written in PostScript and executed on the then new laser printers.<\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"padding-top:0;padding-right:0;padding-bottom:0;padding-left:0\">\n<figure class=\"wp-block-image aligncenter size-medium has-custom-border\" style=\"margin-top:0;margin-right:0;margin-bottom:0;margin-left:0\"><img loading=\"lazy\" decoding=\"async\" width=\"285\" height=\"300\" src=\"https:\/\/whiteland.net\/jonathan\/wp-content\/uploads\/2026\/02\/CCLOGO.PS-from-1988-285x300.jpg\" alt=\"A picture of a computer screen showing a Postscript program listing, alongside its diagrammatic output. In front of the screen a listing of the same program on sprocket hole paper from 1988.\" class=\"has-border-color has-accent-6-border-color wp-image-155\" style=\"border-width:1px\" srcset=\"https:\/\/whiteland.net\/jonathan\/wp-content\/uploads\/2026\/02\/CCLOGO.PS-from-1988-285x300.jpg 285w, https:\/\/whiteland.net\/jonathan\/wp-content\/uploads\/2026\/02\/CCLOGO.PS-from-1988-972x1024.jpg 972w, https:\/\/whiteland.net\/jonathan\/wp-content\/uploads\/2026\/02\/CCLOGO.PS-from-1988-768x809.jpg 768w, https:\/\/whiteland.net\/jonathan\/wp-content\/uploads\/2026\/02\/CCLOGO.PS-from-1988-1458x1536.jpg 1458w, https:\/\/whiteland.net\/jonathan\/wp-content\/uploads\/2026\/02\/CCLOGO.PS-from-1988-1944x2048.jpg 1944w\" sizes=\"auto, (max-width: 285px) 100vw, 285px\" \/><\/figure>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-8d88fe0f wp-block-columns-is-layout-flex\" style=\"padding-top:var(--wp--preset--spacing--20);padding-bottom:var(--wp--preset--spacing--20)\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"padding-top:0;padding-right:0;padding-bottom:0;padding-left:0\">\n<figure class=\"wp-block-image aligncenter size-medium\" style=\"margin-top:0;margin-right:0;margin-bottom:0;margin-left:0\"><img loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"249\" src=\"https:\/\/whiteland.net\/jonathan\/wp-content\/uploads\/2026\/02\/22Position-control-of-a-pneumatic-actuator22-using-a-BBC-Micro-300x249.jpg\" alt=\"Picture of a university student siting beside a BBC Micro computer (and its small monitor) sitting on a concrete bench in front of a bit of equipment (a pneumatic cylinder, it's tubes and control lines)\" class=\"wp-image-154\" srcset=\"https:\/\/whiteland.net\/jonathan\/wp-content\/uploads\/2026\/02\/22Position-control-of-a-pneumatic-actuator22-using-a-BBC-Micro-300x249.jpg 300w, https:\/\/whiteland.net\/jonathan\/wp-content\/uploads\/2026\/02\/22Position-control-of-a-pneumatic-actuator22-using-a-BBC-Micro-1024x850.jpg 1024w, https:\/\/whiteland.net\/jonathan\/wp-content\/uploads\/2026\/02\/22Position-control-of-a-pneumatic-actuator22-using-a-BBC-Micro-768x637.jpg 768w, https:\/\/whiteland.net\/jonathan\/wp-content\/uploads\/2026\/02\/22Position-control-of-a-pneumatic-actuator22-using-a-BBC-Micro-1536x1274.jpg 1536w, https:\/\/whiteland.net\/jonathan\/wp-content\/uploads\/2026\/02\/22Position-control-of-a-pneumatic-actuator22-using-a-BBC-Micro.jpg 1580w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/figure>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"padding-top:0;padding-bottom:0\">\n<h2 class=\"wp-block-heading\">BBC Basic &amp; 6502 assembler<\/h2>\n\n\n\n<p class=\"has-medium-font-size\" style=\"line-height:1.6\"><em>In the mid 80s<\/em>, while at university, I used a BBC Micro in my final year project to control the position of a pneumatic cylinder. This was using a BBC Basic program with embedded 6502 assembler (to reprogram interrupts to create pulse-width-modulated signals to the solenoid valves).<\/p>\n<\/div>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Honorable mentions:<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li class=\"has-medium-font-size\"><strong>awk<\/strong> \u2013 extensions to fail2ban<\/li>\n\n\n\n<li class=\"has-medium-font-size\"><strong>sed<\/strong> \u2013 deploy scripts<\/li>\n\n\n\n<li class=\"has-medium-font-size\"><strong>Tcl<\/strong> \u2013 early static website generation<\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-e1fea541 wp-block-columns-is-layout-flex\" style=\"margin-top:var(--wp--preset--spacing--50)\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:33.33%\">\n<hr class=\"wp-block-separator has-text-color has-accent-5-color has-alpha-channel-opacity has-accent-5-background-color has-background eoc-line\"\/>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:70%\"><\/div>\n<\/div>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Programming over the years Programming has been my work and my hobby my whole life. I love the craft of making computers do my bidding. PHP &amp; WordPress From the 2010s &#8217;til today, I&#8217;ve been wrangling WordPress websites (for YTKO, myself, and others). I&#8217;ve written many custom plugins along the way to do things like [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"page-no-title","meta":{"footnotes":""},"class_list":["post-16","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/whiteland.net\/jonathan\/wp-json\/wp\/v2\/pages\/16","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/whiteland.net\/jonathan\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/whiteland.net\/jonathan\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/whiteland.net\/jonathan\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/whiteland.net\/jonathan\/wp-json\/wp\/v2\/comments?post=16"}],"version-history":[{"count":65,"href":"https:\/\/whiteland.net\/jonathan\/wp-json\/wp\/v2\/pages\/16\/revisions"}],"predecessor-version":[{"id":484,"href":"https:\/\/whiteland.net\/jonathan\/wp-json\/wp\/v2\/pages\/16\/revisions\/484"}],"wp:attachment":[{"href":"https:\/\/whiteland.net\/jonathan\/wp-json\/wp\/v2\/media?parent=16"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}