Curriculum Vitae (CV) - Mark Leighton Fisher

2003-present: President and Chief Consultant, Fisher's Creek Consulting

pmtools Perl Module Tools
Release pmtools-1.20 (Perl Module Tools), which includes fixes for pminst (display only unique package files and ignore non-existent directories in @INC and the new tool pmcheck to check that Perl is set up for Perl modules (currently checks that @INC contains only existing, readable directories).
Wrote and submitted a grant proposal to the Perl Foundation for porting pmtools (Perl Module Tools) to Perl 6.
Took over maintenance of pmtools, Tom Christiansen's Perl module tools suite – 3 enhanced releases so far. pmtools are a standard part of Fedora Linux.
pmtools-perl6 Perl Module Tools for Perl 6
Started pmtools-perl6, a port of pmtools to Perl 6. A generator for Pugs has already been released
DeepData, Inc. (2003-2004)
Sr. Perl Designer/Implementer, PostgreSQL Optimization Expert, and Automated Testing Expert for DeepData, a Yellow Pages strategic information solutions provider.
Wrote Test::MockDBI, a Perl module for testing database program by mocking-up the Perl database interface (DBI) API, then allowing developers to write rules for the mockup DBI's behavior.
Modified a Yellow Pages processing program to handle processing all U.S. medical Yellow Pages headings (3.7M records).
Enhanced DeepData's address standardization system by assigning ZIP codes to all possible addresses, adding latitude/longitude to all possible addresses, and standardizing all address components.
Learned Java - Sun Certified Java Programmer exam passed on 2005-05-12 with 70% (minimum passing score was 52%). Writing a YAML parser and a weblogging framework in Java as an aid to learning Java thoroughly.
Installed, configured, and fixed TUTOS (The Ultimate Team Organization Software) for project management. Fixes were for proper Gantt chart display when a task starts and ends on the same day, and for proper milestone task entry.
Installed and configured Nagios Open Source network monitoring software on DeepData and servers.
Web Scraper
Created Boston Building Permits web scraper for PropertyShark.
Published weblog essays picked up by Slashdot, Scripting News, and other news sites.

4/2018-present: Purdue University CERIS, Programmer/Analyst

Rewrote batch stamping of pesticide lable PDFs process for ALSTAR (Accepted Labels State Tracking and Repository).
Created single-label stamping for pesticide PDF labels running under Linux so labels can be stamped when they come in (realtime stamping). This included verifying that the PDF is not password-protected, that the PDF contains searchable text (is not an image-only PDF), that the PDF does not contain fillable forms, and that the PDF is not an Acrobat Reader Extended PDF - all of which prevent applying a stamp to that PDF.
Created an (internal) full parser of PDFs using the Marpa::R2 parser module (Marpa can parse any language that can be described in BNF notation). Note that PDF is context-free - except when it isn't, so extra steps have to be taken to properly parse PDFs. Next step is handling compressed streams (which are currently lexed but otherwise ignored).
Created the (internal) Perl module PerlIO::eol::Preserve, which reads lines containing a mix of CR, LF, and CRLF for end of line (EOL) markers as found in PDFs while preserving those EOLs.

10/2017-12/2017: Panamplify, Senior Full-Stack Developer

Social Media Automatic Marketing Report Generation
Started diagnosis of Java + Scala + Akka + Play2 + Rails AI-based report generation system caching problem with YouTube Analytics.
Installed and configured Nagios and CloudWatch for all company servers including local free + cached memory usage along with writing a custom Nagios plugin validating server output.
Create procedures for setting up new customers
Created and extensively tested detailed procedure for setting up newcustomer server AWS EC2 instances using Route 53, SNS, and CloudWatch among other AWS technologies using Capistrano for deployment with nginx + Rails + Apache for web serving that include OAuth endpoints for YouTube, LinkedIn, Instagram, Bing,, Google Analytics, and Google Search Console as well as configuring Nagios for the new customer server. Ansible was the IaC tool that simplified server setups.

9/2014-5/2017: Assurant Mortgage Solutions, Senior Perl Developer

Enhanced and fixed the appraisal (LenderX), inspection (InspectorX), and broker price opinion (VMS/PVAL) MVC SaaS / Web microservices systems using Perl, JavaScript, Moose, Moops, Catalyst, Dancer2, PostgreSQL, JIRA, Stash, Confluence, Graylog, OpenVPN, Tunnelblick, Junos Pulse, Slack, KRONOS, and HP PPM collaboration technologies.  Wrapped LenderX PostgreSQL + RabbitMQ transactions so that if either transaction failed, both transactions were rolled back.  Modified LenderX so Catalyst::Controller::REST could return HTML error messages when necessary.  Wrote a program that created SQL to automatically fix 50+ loans which had duplicate properties ¿ this included parsing a color-coded Excel spreadsheet, generating SQL with literal values using SQL::Abstract (a mostly-undocumented feature of SQL::Abstract), as well as applying fixed addresses from the spreadsheet along with from a separate, manually- generated list.  Fixed InspectorX to properly handle date overlap detection as a test of "dateA_start <= dateB_end AND dateB_start <= dateA_end (much simpler than BETWEEN and works everywhere).  Added download logging to VMS.

6/2012-6/2014: Purdue University, Digital Library Software Developer

PURR (Purdue University Research Repository)
Added the creation of an OAIS AIP (Archival Information Package) as part of the document publication process.
Added the creation of an OAIS SIP (Submission Information Package) as part of the document publication process.
Created PHP O-O modules for METS (Metadata Encoding and Transmission Standard) metadata creation.
Created PHP O-O modules for PREMIS (PREservation Metadata: Implementation Strategies) metadata creation.
Created PHP O-O modules for Dublin Core metadata creation.

4/2012-6/2015: Plain Black Corporation, Perl Developer

Worked towards enabling UTF-8 characters in WebGUI 7.10 passwords.
Added a "--delete userId [userId ...]" option to the WGDev 'user' command.
Found and fixed a bug in WebGUI for the Department of State Alumni customizations where the non-existent WebGUI::Storage->new() was called.
Found and fixed a bug in WebGUI core (7.10 branch) so unmatched character pairs (a '(' without a corresponding ')') do not break asset search.
Added a '-d' option to the WGDev 'ls' command so that 'ls' lists either the children of the specified asset or (using '-d') the asset itself.
Fixed WebGUI Spectre so startup and shutdown are logged at the INFO level even when everything is logged at the WARN level (Log::Log4perl config trick).
Forked WGDev on GitHub ( to add the Batchedit command, which lets you edit an asset or URL right in the shell script / batch file, like wgd Batchedit --string= ChcG6WcA6jLwSTbWFez2Qg where pattern is the pattern to match, string is the replacement string, and ChcG6WcA6jLwSTbWFez2Qg is the assetId or URL to edit.
Found and devised a workaround for a bug in the Twitter JavaScript search/list/faves/profile widget where https:// pages still contain some http:// Twitter links.
Found and fixed a MySQL deletion ordering issue with WebGUI.
Debugged various hosted WebGUI content issues.

8/2005-3/2012: Regenstrief Institute Inc., Systems Engineer II

RELMA (Regenstrief LOINC Mapping Assistant) programming team -- VB.NET, C#, VB6, SQL, Microsoft Access/Jet/VBA, Perl, Java
Ported RELMA from VB6 to VB.NET 2.0. Later ported RELMA from VB.NET 2.0 to VB.NET 4.0
Added foreign-language search to RELMA's SQL database-based search. This included writing a Perl self-extracting Windows GUI program for loading the foreign language indexes.
Wrote a program that generates databases of LOINC name Parts for the LOINC translators to load with their translations.
Switched RELMA's LOINC search and indexing to Lucene.NET. This required developing standalone programs to index LOINCs, LOINC Part names, and LOINC answer lists. Several languages were indexed, including English, French, Greek, and Chinese. This also required some reading of the Lucene Java and Lucene.NET C# code to answer detailed questions about Lucene's internal workings (including whether Lucene generates parse trees -- which it does not).
Developed IgnoreUnknownWordsQueryParser, a Lucene query parser that ignores unknown words (inherits from Lucene.Net.QueryParsers.QueryParser).
Under the direction of Dr. Clement J. McDonald, developed software (with both batch and interactive modes) to automatically find mappings from local terms to LOINCs (the RELMA AutoMapper) using a longest-name-first matching algorithm (which required developing an n-gram class for .NET). This AutoMapper standardizes timings and part names, finds specimens/systems, methods, and other parts of LOINC names in the HL7 OBR and OBX descriptions, guesses specimens/systems if none are present in the HL7 OBR and OBX descriptions, then searches the Lucene index of LOINCs for matching LOINCs. If units are available for the local term, the search is restricted to LOINCs that match the property corresponding to the units. Results are scored such that the best match in the fewest words wins. If the AutoMapper is run against laboratory local terms, scoring ties are settled by the LOINC that is more commonly used as a lab test.
Some experimentation was done using a Lucene index that contained only the unique words in the default Lucene field. The results were that using a non-unique-words index (i.e. allowing phrase searching) proved more effective in the current LOINC Lucene indexing scheme.
Added LOINC search restrictions for laboratory LOINCs, the Top 2000+ Lab Observations, and the Top 300+ Laboratory Order Codes. These changes were made in the Lucene LOINC index and the RELMA program.
Added dynamic (on-demand) loading of tree data to the Regenstrief .NET tree/grid control. This included separate loading/showing/hiding of LOINC leaf nodes.
Added a search mode to the .NET tree data code such that only the matching nodes and their ancestors are displayed.
Added a configuration dialog to the Regenstrief .NET tree/grid control that allowed for hidden columns and always-visible columns as well controlling column placement and width.
Added a custom export dialog to the Regenstrief .NET tree/grid control that allowed for the export (with or without header rows) of all rows or only the selected rows. Custom export actions include copying to the Clipboard, printing, exporting as a CSV file, exporting to Excel, and sending as an email (tested with Outlook, Outlook Express, and Thunderbird).
Added multi-column prioritized reversible sorting to the Regenstrief .NET tree/grid control.
Created HTML output formats for LOINCs, LOINC name parts, and LOINC answer lists. This required handling multi-megabyte HTML files that allow persistent configuring of whether each section of the HTML should be shown or hidden using JavaScript manipulation of CSS class styles. These HTML files could be loaded from the Internet, or built locally using an LRU file cache.
Updated the HTML formats for faster apparent rendering of tables by incrementally rendering the tables after applying the CSS style 'table-layout: fixed'.
Added a simple, Google-like search screen to RELMA.
Enhanced RELMA's HL7 importing mechanism to include importing code systems and importing OBR and OBX NTE segments (message note segments).
Added a command-line interface to the program for extracting the releasable LOINC database from the master LOINC database.
Added deletion of unreleasable reference information (descriptions etc.) to the program for extracting the releasable LOINC database from the master LOINC database.
Added verification of whether the specified releasable tables and fields actually exist in the master LOINC database to the program for extracting the releasable LOINC database from the master LOINC database.
Wrote and enhanced various .NET/VB6/Perl/SQL routines for dealing with hierarchical Access database tables in both linked parent-child and path enumeration ('Dewey Decimal') formats.
Maintained external and internal RELMA Citrix applications.
Wrote and upgraded Microsoft Access reports.
Developed internal VB.NET-compatible unit testing framework in VB6.
Started using the Microsoft Moles isolation/mocking framework for unit testing with MSTest.
Communicable Diseases reporting for the Indiana Network for Patient Care (INPC)
Communicable diseases county and state reporting for the INPC (Indiana Network For Patient Care) - Access & SQL & VBA.
Shared Pathology Information Network (SPIN)
Created first port of the SPIN client from VB6 to .NET 1.0.
XSLT transform reworked for SPIN client report -- tested using Java & JUnit. Note that i2B2 now handles most of what the SPIN client initially handled for Regenstrief.
Java Class
Implemented part of an X12-270 reader in Java.

1991-2003: Thomson Consumer Electronics, Systems Engineer III

I was a member of the IT group Electronic Design Automation, which provided computer software and hardware assistance to the engineering community. Unless otherwise mentioned, all projects below were my sole responsibility.

Corporate Technical Memory
The Thomson Corporate Technical Memory (CTM) was a knowledge management application before the phrase "knowledge management" was even coined (1994 — which made it hard to explain initially). CTM enabled users to write information down into a document once (rather than repeatedly explain the information to each questioner), which then enabled other users to find the information from their browser by full-text document searches, searches on document title or author, or by browsing the main subject area of a document, browsing by author name, or browsing by document title. CTM V2.0's code consisted of a main Perl module along with associated CGI programs and an external search engine (V1.0 used a Perl4 daemon program and simple Perl4 CGI programs with an external search engine). Document metadata was stored in an Oracle database while the documents were stored on the webserver's filesystem. I published a paper on CTM, "The TCE Corporate Technical Memory: groupware on the cheap", in the International Journal of Human-Computer Studies, Volume 46 , Issue 6 (June 1997) (Special issue: innovative applications of the World Wide Web). Writing CTM saved Thomson $180,000, as the only alternative was a Lotus Notes-based system.
Status Reporter
Status Reporter V6.0 enabled automatic assembling of text-based status reports by allowing users to enter status for each task of each project they had worked on recently. The status report assembler could then be invoked over a specified time period for that group of people, producing one unified status report for the whole group. Using Status Reporter saved around half a day of work for each group, as manual assembly took around 4 person-hours per group at Thomson. V6.0 was web-based, storing the reports in an Oracle database (previous versions were in 16-bit Microsoft Word's WordBasic with reports in Word .DOC files). Status Reporter's code consisted of a main Perl module along with associated CGI programs and a smattering of helper Perl utility programs. Status Reporter saved Thomson over 2000 person-hours by automating status report assembly.
Thomson Application Status (UpApp)
Thomson Application Status (UpApp) provided a concise view of the up/down/in-trouble status of major Thomson applications/systems for end users in their browsers. UpApp was co-developed with Mark Bender, where I developed the main Perl module and mod_perl CGI-like programs while Mark Bender developed the HTML user interface. UpApp status information was held in a MySQL database to provide easy multi-admin updating. UpApp also provided both XML-RPC and SOAP Web Service interfaces, including an all-application status — red if any applications were "red" (crashed), yellow if no applications were red but any applications were "yellow" (in-trouble), or otherwise "green".
Overview and Overdrive
Overview was a search engine I set up that covered the ten most-used webservers by Thomson Americas when there was no overall Thomson Americas search engine. Overview used the Verity SEARCH'97 search engine software. Overdrive was started as the successor to Overview, which would use an Open Source search engine on all 30+ Thomson Americas webservers. Overdrive was in beta-test using ht://Dig's December 2001 beta of V3.2.0 with very nice results — often the first search result was the term searched-for when the search result page had Dublin Core metadata (this was on a 200MHz RedHat V6.2 Linux box). I had started setting up ASPSeek V1.2.10 to compare against ht://Dig.
Nagios is an Open Source network monitoring tool using plugins for monitoring hosts and services, where the plugins cover monitoring everything from basic PING functionality to Oracle+MySQL databases and FlexLM license servers. I set up Nagios to monitor the 27 services on 19 servers that our group was either responsible for or were affected by. Nagios provided the back-end functionality for tracking applications/servers/hosts whose status would be displayed to end-users by UpApp. Setting up Nagios like saved Thomson more than $20,000 compared to commercial alternatives.
EDA/Weblog was an internal weblog for the engineering and IT communities at Thomson, powered by Slashcode (Slashcode powers Slashdot). Articles/stories were stored in a MySQL database. EDA/Weblog featured announcements of internal interest (new systems in production, policy changes, etc.) along with links to particularly interesting technical news articles. EDA/Weblog was Thomson's first weblog (March 2002).
EDA (Electronic Design Automation) Home Page
I started and maintained Thomson's first web server in 1993, which provided a home for EDA services to the engineering and IT communities. Except as noted, all web pages and applications mentioned were on that server. When I left, the server was a Sun SPARC Ultra 30 running Solaris 2.6. The webserver programs were Stronghold V2.4 (an early Apache V1.3.x with a licensed SSL implementation) and Apache V1.3.23 with mod_perl V1.26. (CERN httpd was used before we switched to Apache.) The server had ~3000 pages on it when I left Thomson.
ISO 9001 Web
Thomson Americas TV/Audio/Video Product Development received its ISO 9001 quality certification around 1995. I maintained the ISO 9001 Web as well as the Perl web gateway to the Thomson ISO 9001-compliant document management system, DMS9000. The DMS9000 web gateway provided URL-based document retrieval (with URLs almost identical to the native DMS9000 document paths) along with simple and advanced DMS9000 document searches and a CGI program that converted native DMS9000 document paths to their equivalent URLs.
PACO: Password-Checking Objects
PACO (Password-Checking Objects) was a Perl system that helped ensure the use of good passwords by running the password through Crack V5.0 by Alec Muffett. PACO provided a web form interface, although the intention was to provide other interfaces suitable for programs (like XML-RPC, SOAP, etc.) so that all Thomson programs could use PACO rather than their own password strength-checking code. PACO remembered a hash of the password so it could tell you whether you were reusing an old password without compromising the actual password.
CADWeb was a separate webserver (Perl CGIs with Apache on HP-UX V10.20) that drove the additional CAD utility programs written by Thomson employees for use with the Visula and P870 PCB CAD packages. These CAD utility programs originally ran on a text GUI under VAX/VMS, so this was a non-trivial migration task. My major accomplishment for CADWeb was writing the authentication code, which accepted a user's Oracle username and password, producing an HTTP cookie used for later re-authentication using methods based on HTTP Digest Authentication. This authentication code is similar in functionality to the Apache module mod_cookie, with the actual authentication deferred to a program specified in a configuration file — this code was later used for domain (SMB/NT/LanMAN/etc.) authentication by switching authentication programs. CADWeb users would upload CAD files to the server, request a run of a program, then download the resulting output files from the requested program.
In-Circuit Test
In-circuit testing is (basically) the process of testing that components are correctly placed and soldered into a printed-circuit board (PCB). Thomson's program for In-Circuit Test (ICT) testpoint generation/selection was created in 1987, which by the time I received it has grown to ~20 000 lines of C. I made numerous improvements to it, including most notably the ability to test topside components from the bottom side of the board and the addition of boundary-scan testing outputs. During the boundary-scan improvement I added a hash table implementation based on Perl's hash table implementation — before then all name searches were done as sequential scans of linked lists as in the original 1987 ICT code. I also used the Perl-Compatible Regular Expressions library. ICT ran as part of the CADWeb suite of tools. ICT migrated from HP-UX V9.05 to HP-UX V10.20 while I was maintaining it.
Incircuit Testpoint Analysis and Placement
Incircuit Testpoint Analysis and Placement (ITAP) was slated to replace ICT. Initial design and some code was done by Rick Lyndon, then I was brought on-board to speed development and create a detailed project management plan (I ended up doing around 30% of the coding). ITAP ended up as ~20 000 lines of Microsoft Visual C++, running on the user's Windows PC with vastly greater capabilities including avoiding testpoint placement under component bodies and built-in HP TestJet processing as well as much more table-driven operation so that ICT parameters could be tweaked without recompiling ITAP. ITAP included object-oriented wrappers around the Perl-Compatible Regular Expressions library and the Perl-like hash table used in ICT.
Full Circle Compare
Full Circle Compare (FCC) was a several-thousand-line C++ program that verified that identical components were present in the Bill of Materials (BOM), schematic CAD file, and PCB CAD file. FCC was obsoleted by a more-integrated design process that drove the BOM and the PCB CAD file from the schematic CAD file. I took over FCC from the original outside developer (David Sarnoff Research Center) in 1991, got it into production shape, and maintained it until was obsolete around 1999-2000. FCC went into production on VAX/VMS, then migrated to HP-UX V9.05, then finally to HP-UX V10.20.
Software Engineering and Project Management
I was the group resource on software engineering and project management. I was the project manager on three projects: which were all on-time and on-budget as far as they went (ITAP development was placed on hiatus before it was completed — we delivered two production versions before hiatus).
Perl (See also: Links -> Perl)
I started using Perl with V4.0.19 in 1992, which has greatly increased my productivity due to both the built-in features of Perl (so much of programming is parsing text which Perl excels at) and the advent of the Comprehensive Perl Archive Network (CPAN) which provides Open Source Perl modules for about any task you can think of. The Links -> Perl section below details my contributions to Perl.
World Wide Web (See also: Links -> World Wide Web)
I started using Web technology in 1993, two years before Thomson had an Internet connection (see Links -> Humor for my comments on FTP-by-mail). (For a long time I kept around my Sept. 21, 1993 email from Tim Berners-Lee about how commercial enterprises could also use CERN's httpd webserver without paying licensing fees.) I was a member of several Internet Engineering Task Force working groups, leading to enough participation in the WebDAV group to merit an acknowledge in the initial WebDAV RFC. Much of my work at Thomson leveraged Web technology, including theCorporate Technical Memory, Status Reporter, UpApp, CADWeb, ISO 9001 Web, Overview and Overdrive, PACO, EDA Home Page, EDA/Weblog, and Nagios. The Links -> World Wide Web section shows some of my involvement with Web technology.
Technical Library Applications
I installed and maintained the library automation software, EOLAS (initially named DataTrek). I setup and maintained WISE install programs for the Technical Library Applications, which were applications supplied by the Technical Library. Among these applications were the EOLAS online catalog search, Books in Print, Microsoft Bookshelf, and the CAPSXpert component library.
IBM Lotus Team Workplace (QuickPlace)
As part of the Thomson Global Knowledge Management initiative, I constructed QuickPlaces for ICT and ITAP. These QuickPlaces contained discussion areas, design documents, project management plans, and status reports for ICT and ITAP.
SlashWiki - a Wiki for Slashcode
As part of EDA/Weblog I set up SlashWiki, a WikiWiki for Slashcode-driven servers that adds the possibility of requiring authentication to edit certain pages. WikiWikis, Status Reporter, and Slashcode all use simplified text markup schemes to enable users to create HTML content without learning HTML.
To help track security issues I have lurked on (and occasionally contributed to) the cypherpunks mailing list. Cypherpunks explores the social implications of security/privacy/cryptography technology, occasionally delving deep into technical details when appropriate. It is unfortunately also the home to a lot of spam and some amount of knee-jerk anti-authoritarianism. It is my opinion that some amount of crypto anarchy is coming, so it is better to be prepared.
PGP and GNU Privacy Guard
Before Thomson switched to Entrust, I was the expert on PGP (Pretty Good Privacy), an encryption/decryption tool. I am now using GNU Privacy Guard, a mostly-compatible free software replacement for PGP. (Entrust is a better solution for large corporations due to Entrust's centralized automatic key handling.)
HCL-eXceed X Window System server
When Windows 3.0 came out, I spent months evaluating Windows-based X Window System servers, settling on the HCL-eXceed X Window System server. HCL-eXceed is what I like in commercial, closed-source software:
  1. It just works; and
  2. If it doesn't work, the defect is either minor or fixed quickly.
I don't have a problem working with closed-source software, but I don't like seeing many defects in it either. Using HCL-eXceed probably saved Thomson over $100,000 by allowing access of Unix workstation resources from Windows PCs.

1984-1991: Wintek, Inc., Software Engineer

I worked as part of a six-member software development team, mainly on electronic CAD products for MS-DOS.

smARTWORK Editor
smARTWORK is a 50-mil rule PCB CAD package for which I became the primary developer of the Editor program. smARTWORK was the first PCB CAD package available for DOS.
smARTWORK simulated annealing Automatic Component Placement
smARTWORK included an Automatic Component Placement program that used a simulated annealing algorithm, developed when the main information on simulated annealing was one book and a handful of research papers. I took over as developer late in the initial code-writing stage, bringing it to production status. This was probably the first commercial use of the simulated-annealing algorithm.
smARTWORK Video Drivers
I took over maintenance and enhancement of smARTWORK's video drivers, which including the development of smARTWORK's first 800x600 video driver.
smARTWORK Copy Protection
I took over maintenance of smARTWORK's copy-protection scheme, which involved manipulation of the DOS floppy filesystem.
Installation Program Generator
I wrote what was probably one of the first installation program generator programs, using it to generate the batch files necessary for installing smARTWORK and HiWIRE from either 5.25" or 3.5" floppies. Rick Strehlow's extremely clearly-written installation batch files for smARTWORK inspired me to write the installation program generator program.
HiWIRE II Main Menu Program
HiWIRE II uses a text GUI for its main menu. I wrote both the text GUI menu program (my first sizable C++ program) and the program overlay manager (my last sizable assembly program).
HiWIRE II Editor Memory Manager
The HiWIRE II Editor uses a memory manager that allows objects to be stored in conventional memory, in extended/expanded memory, or on disk.
smARTWORK and HiWIRE II Netlist Converter
On my own initiative I wrote a netlist converter for smARTWORK and HiWIRE II for inputting foreign netlist formats (including EDIF).
Serial Port Interface for Remote Debugger
I wrote the serial port interface for remote debugging of microcontroller boards, along with the user documentation for the remote debugger.

1981-1984: MDBS (Micro Data Base Systems), Software Engineer

I worked as part of a team of 20+ developers, although my projects (except as noted) were my sole responsibility. MDBS IV is a network CODASYL database management system (pre-relational database).

MDBS IV Page-Level Memory Manager
The MDBS IV page-level memory manager used a best-fit algorithm from Knuth's The Art of Programming.
MDBS IV Porting (CP/M, WICAT, Unix)
For 18 months I was responsible for part of the MDBS IV C code porting effort between CP/M, VAX Unix, and WICAT (a Unix look-similar for workstations).
Regular Expression Search
On my own I wrote both globbing and regular expression matching code in C. The regular expression code is was part of their GURU expert-system-enhanced database product for over 20 years.
Hash Tables (Associative Arrays)
I wrote hash table (associative array) code in C.
Fixed Hash Table Generator
I wrote a fixed hash table generator program, similar to GNU's mkperf.
MDBS IV User Query External Sort
The MDBS IV user query program allows users to arbitrarily sort their output queries (like ORDER BY in SQL only for a CODASYL database) using an external sorting function (sorting chunks into multiple files, then merging the files), co-written by Tim Stockman and me.
Unix Device Driver for Named Pipes
To provide client-server IPC on early Unix boxes, I wrote a device driver that provided a named pipe facility on Unix before "named pipes" were a standard part of Unix.
CP/M Filesystem Emulator for Unix Floppies
Tim Stockman and I wrote a CP/M filesystem emulator for Unix floppies to enable easy copying of files between CP/M and Unix systems.
C Compiler Selection
(A "how times have changed" entry.) I was part of the team that finally selected the BDS software C compiler (by Leor Zolman) for CP/M software development in C. This required a compiler that could have a new back-end written for it that generated a pseudo-assembly that assembled down into either 8080, 8086, or Z-80 instructions.
Unix Systems Administration
Part of my duties included system administration of their PDP-11, VAX 11/780, and WICAT computer systems.

1979-1981: Northrop Defense Systems Division, Software Engineer

My duties included radar countermeasures software (ECM). I held a SECRET clearance. I can't say more than that except that my project name was unclassified but that my participation in the project was classified.

1975-1979: Purdue (as B.S.E.E. student), Programmer

IEEE Dictionary Computerization (1978-1979)
Professor Benjamin Leon hired me as a research assistant to work on the first try to computerize the IEEE Dictionary of Electrical and Electronic Terms.
Unix Systems Administration (1978-1979)
I was one of two Unix System Administrators (V6 and V7 PDP-11 Unix) from what was still called the ARPA Lab, although by that point the focus of the Lab was (as I remember) on computer vision (this was in the pre-TCP/IP days).
8080 Cluster Schematic (1978)
I did an independent study project that designed an 8080 computer board to be used as part of an 8080 cluster computer.
APL Editor (1978)
I did an independent study project to create a standard APL editor.
I graduated with a bachelors of science in electrical engineering with concentration on computer engineering.

1971-1975: John Adams High School, South Bend, IN

National Merit Scholarship
I was one of the National Merit Scholarship winners for 1975. This was due to my 730 verbal and 700 math SAT (1430 total).
Graduated Cum Laude
I graduated Cum Laude (top 10% of my class).
Purdue President's Freshman Engineering Scholarship
I received a Purdue President's Freshman Engineering Scholarship for my freshman year at Purdue.


Unix/Linux   42 years
Unix/Linux System Administration   42 years
Databases   42 years
Searching and indexing   40 years
Regular Expressions   42 years
System Development Life Cycle (SDLC)   35 years
Software Engineering   35 years
Object-oriented programming   33 years
C       32 years
Relational Databases   31 years
TCP/IP   31 years
Microsoft Windows (Win7/Vista/XP/NT/3.x)   30 years
Perl   29 years
Serious unit testing   29 years
Test::More   19 years
Web   29 years
Electronic CAD   20 years
Cascading Style Sheets   19 years
Apache   18 years
C++   19 years
CGI   19 years
Assembly   12 years *
Project Management   10 years
MySQL   8 years
Git   8 years
Oracle   7 years
ISO 9001   6 years
Capability Maturity Model (CMM)   6 years
Scrum   4 years
Samba   4 years
Template Toolkit   4 years
Lucene   4 years
Perl libwww   4 years
Java   4 years
PHP   4 years
PostgreSQL   4 years
VirtualBox   4 years
Visual C++   3 years
WebGUI   3 years
Embedded software   2 years
Processing Large Datasets (1M+ recs)   2 years
JUnit   2 years
PHPUnit   2 years
Joomla!   2 years
HUBzero   2 years
Slashcode   1 year
Nagios   1 year
Network Monitoring   1 year
Data Warehouse   8 months
XML-RPC   6 months
Author of Test::MockDBI and Test2::MockDBI   6 months
Test::MockObject   6 months
Perl 6   6 months
Linux Software RAID   5 months
SOAP   4 months
TUTOS   4 months
FreeBSD   2 months
HTML::Template   2 months

* I worked in assembly language from 1979-1990. 80x86 assembly language was from 1981-1990. The only assembly language I've used since 1990 has been in a debugger.

Other Influences

Purdue's computer architecture class used APL as the design language, so I got quite familiar with APL. I even wrote an editor for APL as an independent research project for the computer architecture professor. APL opened my eyes to just how differently you can approach programming a computer. I have not used APL to any degree since Purdue, however.
I used FORTH on a Commodore 64 in the early 1980's before C++ came out, partially in an effort to help develop a saleable videotape library system for video rental stores with a group of friends. FORTH showed me how powerful language extensions could be, thereby preparing me for object-oriented programming with C++ and Perl. <namedrop>I even answered Brian Kernighan's question about what is FORTH during his second visit to Purdue ("a very-high-level extensible assembly for a stack-based virtual machine").</namedrop>.
Although I've only written less than a hundred or so lines of LISP in my life, because LISP is a favorite of academics due to its flexible nature (apart from the parentheses) I have followed LISP developments for many years now. Among other nuggets of knowledge, I can thank LISP for what I know about garbage collection.
Haskell is my first foray into functional programming. I am just beginning to learn Haskell, but it has already turned my attention to the occasions where a no-side-effects programming style is appropriate.
Expert Systems
Around 1992-1993 I took a class in Expert Systems while at Thomson. This inspired me get a copy of Translate Rules To C, a simple forward-chaining expert system that compiled the rules down to a C program. I was only able to use my Expert Systems knowledge indirectly, however, as part of my ICT and ITAP work at Thomson. IMHO, an Expert System is just part of what is required for intelligence — there are lots of other components.
Lucene and Lucy
Lucene is Apache's powerful (and popular) search engine technology. Products ranging from Netflix to RELMA use Lucene's technology. Apache Lucy is Lucene's lesser-known cousin, a "loose C" port (their words) of Lucene. I learned a lot about designing search indexes and search strategies by learning Lucene, Lucene.NET, and Lucy. Lucy is exciting to me because since Lucy is in C, languages like Perl, PHP, and Python will be eventually be able to make use of Lucene/Lucy's power (Lucy already has a Perl binding).
CYC and OpenCYC
OpenCYC is the Open Source version of CYC, an attempt to write down common sense in a form that computers can use (my paraphrase), basically repeating the learning process every child goes through. The end result should be a usable artificial intelligence that could be plugged into other programs.

Honors and Publications

Education and Training

Certified Scrum Master
Taught by Aaron Kopel of Project Brilliant.
Head First Statistics
Reading and working the exercises in the O'Reilly book, Head First Statistics (as of 2019-05-15 in normal distributions chapter, about 3/4 of the way through).
Head First Java
Read and worked the exercises in the O'Reilly book Head First Java.
Advanced Perl Programming
Taught by Nathan Torkington of the Tom Christiansen Perl Consultancy.
Real-World Requirements
Taught by Steve Tockey of Construx.
Real-World Software Testing
Taught by Steve Tockey of Construx.
Information Systems Project Management
Taught by Mark A. Reed for the American Management Association International.
Information Engineering - Analysis
Taught by the staff of Thomson Consumer Electronics Information Systems.
Expert Systems
Taught by the staff of Thomson Consumer Electronics Information Systems.
Micro-based Automated Library Systems
Taught by the staff of the Indiana Cooperative Library Services Authority (INCOLSA).
Objected-Oriented Concepts & Design: Advanced C++ Workshop
Taught by the staff of the Technology Exchange Company (the teacher was a colleague of Jim Coplien's whose name I can't find in my paperwork).


World Wide Web


Perl6 RFC349: Perl modules should be built with a Perl make program
My RFC that proposes that only Perl should be built with make(1) -- everything else should be built with a Perl make program. This appears to be implicitly accepted by the Parrot development team, at least.
Version 2.90: Documentation patch for the import_names() method transforming the parameter names into valid Perl names.
Version 2.36: Patch so that cookie and HTTP date formats now meet spec.
perlhack: External Tools Rational Purify documentation patch (perl5-porters email message)
hv.h: Documentation patch (perl5-porters email message)
hv.c: Patch to use Bob Jenkins One-at-a-Time key hashing function (perl5-porters email message)
My CPAN Modules
Apache::Authen::Program: (Apache authentication using an external program)
Date::LastModified: (Extract last-modified date from zero or more files, directories, and DBI database tables)
SQL::AnchoredWildcards: (Transparently use substrings and anchored wildcards in SQL)
Test::MockDBI enables testing of DBI programs by mocking up the entire DBI API, then allowing developers to create rules for the mockup's behavior
GitHub for WebGUI
Fork of the WebGUI WGDev command line tool that adds batchedit, a command for directly editing an asset or URL from a shell script / batch file rather than bringing up an editor program. Batchedit will eventually will be integrated into the main WGDev repository.
Patch to turn off warnings when used under -w.
Perl Power Tools
ls(1) Implementation: Complete V7 Unix with some GNU options.
Fancy grep(1) patch: I added the -E (extract data) option.
My contributions to the Perl5 development list.


Last updated May 17, 2019.