Software Engineer, freelance, 2010 - present; projects below
law office digital assistant web application, 2016 - present
(10 hours a week from 2016 - 2018; 5 hours a week from 2019 - present)
- My web application has made a human assistant unnecessary.
- Stack: originally LAMP (Linux Apache MySQL (MariaDB) PHP, SQL). I am moving to MongoDB. Hosted on Amazon Web Services (AWS) EC2, Ubuntu Linux.
- Wrote an API and bot to transfer billed hours from the client's system to a 3rd party billing system. I used cURL HTTP POST commands to
simulate a browser, and used DOM / XML processing on the HTTP responses.
- Credit card forms and interaction with the processor's API
- Wrote one form to coordinate court dates with a calendar and client notifications via email and SMS. Used AWS SES and SNS.
- Wrote a sophisticated mail merge-like feature to quickly generate client (snail) letters.
- Wrote an audio processing feature to assist analysis of 911 calls and calls from jail (WAV and MP3 files), in part using ffmpeg.
- Daily scripted backups to AWS S3
- Code in git / (private) GitHub
NFT contract, 2022, March - May
- Wrote a Solidity NFT (ERC-721) minting contract with a whitelist, free-mint list, and sales date limitations
- Metamask web connection and interaction (buttons) to mint
- Metadata processing script in PHP
- Created OpenSea account to display images and allow resales
- Deployment with Hardhat and Alchemy; validated code on the Rinkeby Ethereum blockchain with Etherscan (There is a marketing delay.
Deployment to mainnet is planned for July, 2022)
- Code in git / public GitHub (see repo link above)
- Other keywords: Ethereum, Ether, ETH, Web3, ERC-721, crypto, cryptocurrency
Bible quiz, web application, 2022, March - April
- Wrote 80 - 90% of the features from scratch--from the admin feature to enter the quiz questions to a live, simultaneous contestant
- PHP, MongoDB, Linux VPS / VM - I build up the system from a basic Ubuntu image
- Moved contact form email from sendmail to the PHPMailer SMTP class
- Python Selenium library to use a third party login API
project codename Numbers, sporadic work over many years; dates for these sub-projects below
- Made DNS A record changes to comply with web host changes (2022, April)
- Changes to make code compliant with PHP 8.0 (2021, December)
MariaDB error fix - 2021, October
- diagnosed a MariaDB insertion error while proverbially looking over the client's shoulder on a screen share. MariaDB
was enforcing SQL NOT NULL for HTML form fields that were not present.
"bulletin board" install - 2021, September
For this entry I am avoiding several keywords and using much older
terms because I do not
want to use the technologies again. Also, this is the same client as the flight API project (starting April, 2020). I get repeat business sometimes.
- built up an AWS EC2 Ubuntu Linux system and installed a "bulletin board" system
- used AWS SES (Simple Email Service) SMTP for account activation emails and such
Cardano Ada cryptocurrency public stake pool creation / administration, 2021, August - September
- Ubuntu Linux and AWS EC2 system administration to run the stake pool / node and connect it to the blockchain. A stake pool is a
proof of stake equivalent to a m i n i n g node (intentionally "blurred" because I would rather stick with proof of stake)
- Used extra AWS EBS blocks to store copies of the blockchain.
Asterisk VOIP / SIP / voicemail system, 2021, July - August
- The requirement was a voicemail system that could record a message of arbitrary length--much longer than the 10 minutes that many providers
- I compiled and configured Asterisk VOIP / SIP software on an Ubuntu Linux AWS EC2 instance.
- Used Amazon / AWS Chime to connect a phone number with my recording server.
LAMP (Linux Apache MySQL (MariaDB) PHP) development - project codename Felina; 2021, June
- Solved a PHP / MySQL / MariaDB bug while proverbially looking over the client's shoulder on a screen share
- Made roughly 20 changes to the PHP code to bring it from PHP 5.x to 7.4 compliance, especially the mysql versus mysqli
deprecation and removal.
- Created git / GitHub repositories for the code. This was made slightly more complicated by having to step around cache files.
Debian Linux sysadmin, 2021, February and May (2 separate, short sub-projects)
- Analyzed port usage and built firewall rules (ufw) to better secure the server. This included limiting incoming traffic to an IP range / subnet.
- Also some Apache web server admin to improve security
- Updated the system to Debian 10 (Buster)
political activism website mockup, 2020, June
- Some of the most picky CSS I've ever done. I list this to demonstrate that I can get paid (a bit, at least) to do some artistic
airfare search APIs, 2020, April - May
This is the same client as the "bulletin board" project in Sept., 2021. I get repeat business sometimes.
- A proof of concept PHP web application to interact with the Kiwi.com / Skypicker API, Skyscanner API, and the TripAdvisor API
8-channel television broadcast recording, 2019, December - 2020, February
This is the same client as the phone privacy project (a few months earlier) and codename "Jump" (occasional work going back to 2013).
- Built an Ubuntu Linux server recording 8 channels at once. I researched the video capture cards, antennas, and software needed to
make it all work.
- Used ffmpeg to convert video from ts (video transport stream) format to mp4
Android privacy project, 2019, January - September (intermittent work over that period)
- Unlocked bootloader and installed LineageOS on Android phones with no Big Evil Goo apps and no Goo account needed.
- That involved a lot of research into which phones would allow that.
- Used ADB / Android Debug Bridge to install apps without Goo P l a y (intentionally "blurred")
- Overall, I proved the concept that phones without a Goo account can be fully functional.
- Installed and ran MITMProxy in Ubuntu Linux, researching whether LineageOS "ran home to mama Goo"; researching "gotchas" on whether
indeed an improvement
- Used tcpdump, WireShark, and PHP scripts I wrote to analyze packet traffic, as above
re-mention of the law office digital assistant web application project, 2016, February - present
- This is my first entry way above (as of 2022, May), but it is worth a reminder that it was paying the bills until the budget went down (due to
no fault of mine)
web host end user panel development, 2016, August
- Created an interaction to auto-populate country, city, state (region), area code, and country-phone prefix from ZIP code (postal code).
The interaction used
- Used Sass / CSS to make a number of changes--making sure HTML elements appear and disappear appropriately, moving elements around, etc.
- Found and removed a previous developer's back-door password
- Identified and removed Bootstrap and Bootstrap CSS code that was conflicting with preexsiting code
- Dealt with preexisting apostrophe / MySQL escape-character issues
project codename Taxi, 2016, January
Repairs, upgrades, and administration of a Goo Python site ("Goo" is my avoiding a company whose services I'd rather not use anymore)
- Fixed email notification of reservations: added an authorized sender in the App Console. Put the sender in one piece of Python code (factored)
- Fixed the web-to-email / customer contact form, an HTML change
- Moved the site to a different Goo user and project ID. In the domain name registrar's DNS zone file, changed the necessary CNAME, A, and
- Upgraded code to Python 2.7. Fixed resulting HTML UTF-8 errors by eliminating unnecessary characters
- Created a local Ubuntu Linux dev environment to run the application / site, including Eclipse debugging
codname Creative, 2015, November - 2016, January
The following were 3 different sub-projects
- Diagnosed a problem with an e-commerce system's modules for featured and new products. Made a local copy of the site, used MySQL Workbench and
followed the MySQL general (SQL query) log until I found that both modules needed the product to be in the "Featured" category.
(The system is LAMP - Linux Apache MySQL PHP)
wrong. (The Apache web server did not have access to the files.)
- Fixed 15+ issues on a 3rd LAMP system, including some below
- Significant repairs to payment processing until it worked. (Stripe payment gateway)
- Fixed the rest of the signup process
- Implemented coupons / discounts
- Implemented part of admin access versus standard user
- Developed on a local copy of the system--some Linux sysadmin and MySQL dba
codename Jump, 2013, Sep - 2016, Jan (occasional consulting)
This is the same client as the television recording and phone privacy projects in 2019.
- Fixed a virtual host error in Apache on an AWS EC2 CentOS Linux instance. Gave advice on AWS.
- Feasibility mini-study of a video upload site:
- Used ffmpeg to convert 3gp (Android) video format to Flash (flv)
- Demonstrated Apache-level user login security and HTML-to-PHP video file upload and post.
- Feasibility mini-study of using a specific LAMP system for a new site: installed the system on my Ubuntu Linux server, opened it to the internet,
created a second admin user, and helped research plugins for login management and video upload.
codename Early Bird, 2015, March - April
- e-commerce LAMP project - Fixed a client's live site: web response time went from minutes to a few seconds or less. I copied the site and
database from the shared host to a laptop to get root access and use the MySQL general log.
The laptop was Ubuntu Linux. (LAMP - Linux Apache MySQL PHP)
- another open source language project:
- Copied a live shared-hosted inventory reporting site, including the PostgreSQL database, to a Linode VM. (Linux sysadmin, PostgreSQL
- Did the Linode Ubuntu Linux install from scratch--installed and configured Apache, the language, PostgreSQL, etc. (Linux sysadmin)
- Wrote cron jobs and Bash scripts (including boot scripts) to reproduce a 3rd party scheduler. (Linux sysadmin)
- Identified and thoroughly described a bug involving automatic purchase order generation and presented a solution
- Described in SQL a bug involving duplicate Amazon order ids
- Figured out the scheduling / timing interaction between the Amazon-order-fetching script and the backorder reporting script; thus, I could explain the
discrepancy between the live backorder report and the to-be-live report
- Installed phpMyAdmin and created a MySQL backup script and cron job
project Numbers (another repeat client, always under Numbers) 2015, February
- LAMP system hack recovery: identified and repaired affected PHP files
- Copied live site (MySQL and PHP) to my development Ubuntu Linux machine (running Apache) so that I could turn the system's features on and off until I tracked
down the hacked files
codename Kitchen Drain, 2015, January
- Gathered requirements for a system involving CRM, appointment handling, and Quickbooks integration
- Got customer data going into and coming out of a Quickbooks sandbox, in preparation for customer and receipt integration. This uses PHP, OAUTH, and the
- Wrote an article on
getting the QuickBooks PHP API working. This became fairly popular for several years.
codename Laborious, 2014, December
Wrote a prototype / demo web application to connect general building contractors with
subcontractors. Technologies / Features:
- login / user / session management
- maps to set and show user's location, CSS to overlay instructions on the map
- calculated latitude and longitude lines for a "square" to find subcontractors within x miles of the contractor, then used the Haversine formula to calculate
exact distance; also calculated direction
project Numbers yet again, 2014, June - October
- Found a workaround to a critical LAMP-system bug (a large, popular LAMP system that I do not want to work with anymore). Installed the system on my own
Ubuntu Linux server and exported and imported a copy of the site for a test
breaking regular expressions (regex).)
Trained site author to use the <pre> HTML5 / HTML tag to align the letter-number numerology grid.
After many years of frustration, this made the alignment much easier.
- Determined that the xmlrpc.php file was not needed and deleted it because it was being called thousands of times for a hack attempt.
- Determined that hits to xy-load.php are legitimate. This involved analysis of web server access logs, IP whois, etc.
- Analyzed web server access logs for hit patterns, timestamps, and IP whois to tentatively determine that many hits from China are from human viewers and
(The site owner eventually had a couple of Chinese literally show up at his doorstep, so someone was human.)
codename Minefield, 2014, June
- Identified an inadequate 256MB Ubuntu Linux swap space as the performance issue with a Minecraft server; increased to 2GB (equal to RAM).
Python project, 2013, August - 2014, June
This was a repeat client from the Chrome extension earlier / just below.
Below, I'm going to call the 3rd party system we used OpenE. Once again, I am avoiding technologies I don't want to be pestered about.
- Created a sales commission feature: the user assigns a commission percentage to each sales line item, and this carries over to the invoice.
- Created 10 other addons / modules:
- Accounting workaround - If accounting isn't completely set up, this allows the user to use the customer database and sales orders without encountering required accounting fields.
- Mailing list opt-in / opt-out: generates and processes (un)subscribe links, records IP address and date of this action.
- Mail send later - set an email to send later rather than now.
- Several tasks can be summed up as: New forms, new fields, UI property changes, UI filters.
- OpenE is an MVC architecture.
- Database administration:
- Installed and configured PostgreSQL and restored the production database in Ubuntu Linux 14.04. Performed both full and incremental / binary log / WAL restores.
- Backed up PostgreSQL--both full backups and incremental (binary logs / WAL).
- Documented full and incremental backup processes.
- Installed OpenE in Ubuntu Linux 14.04
- Support / Training
- End User support
- Solved the "blank invoice issue" after detailed analysis of data (SQL), workflows (XML), and code (Python)
- Helped explain and document the marketing email process
- Explained folder security process
- Developer support / Training
- Took 3 other developers through the Eclipse - PyDev debugging process
- Helped train 2 other developers
- Wrote several technical bulletins on OpenE issues / best practices
- Sales - Created and demoed an analytic account scenario that was crucial to selling the OpenE installation
- OpenE admin - imported contacts from common applications into OpenE.
pre-Python mini-projects; 2013, April
This is the same client as the Python project a few months later.
- I wrote a Goo Chrome extension involving traversal and parsing of an HTML5 DOM tree, HTML5 local storage, OAUTH, XML / JSON I/O to / from Goo Data REST APIs,
I still won't reveal the details.)
- I wrote a second application involving OAUTH and other Goo APIs.
GameSkunk project; 2011, Feb - May
GameSkunk was the name of the product. I have no idea if the small company exists anymore, so I once again won't list it.
- Wrote a USB device driver, API, GUI, and slide show for the
GameSkunk scent generator
- Slide show with music and the Skunk's scent as a demo, used an XML config file
- GUI to turn scents on and off
- Multi-threaded with resource locking
- My software was demonstrated at the Consumer Electronics Show (CES) in 2011
- Documented the GameSkunk bytecodes, API, and hardware specifications
- Consulted on the driver with developers for a second platform--one of if not the best selling game platform (In this case I'm avoiding the name
because it's something I
touched once years ago, so it's not relevant for anyone to contact me about it.)
- The driver was partially in Linux but mostly on a platform that I don't want on my resume anymore.
codename Wizard, 2012, Dec – 2013, Feb
- Created a zip code database based on open / crowdsourced data
- Wrote REST interactions / integrations between the e-commerce system and the client's custom system--prices, inventory, and shipping from the custom system,
customer data and payment info to the custom system
- Wrote two e-commerce extensions, for the zip code pricing and custom-system interactions
- Guided client through e-commerce front-end problems and consulted with them on setup; helped them work through product data problems
- Moved e-commerce installation and data from test site to permanent site
- Changed database to get rid of fields from inactive extensions
- Set up another LAMP system
- Upgraded PHP from 5.2 to 5.3 on CentOS Linux server. Made changes to php.ini file. Adjusted Linux file permissions for the e-commerce system. Removed
unnecessary MySQL users
- Created a custom shipping method in the e-commerce system
- Created a lightbox / modal dialog from scratch--no libraries
codename Schooled, 2011 - May - November
- Moved a LAMP-based online course product from procedural to OO
- Numerous bug fixes and enhancements.
- A bit of web admin (.htaccess) to prevent password files from being exposed
- LAMP = Linux Apache MySQL PHP
codename Fashion, 2011, July - Sep
- Coded fifteen easy to difficult enhancements / bug fixes on a LAMP application.
- Moved the LAMP app from shared hosting to a VM, configured Apache httpd.conf from scratch,
sent a second domain to a different home page.
- Eight easy to very involved enhancements / bug fixes on a Java /
J2EE / JSP / Tomcat application (SVN code storage)
- Coded an HTML-to-other-document-type feature--installed Debian packages for supporting software
- Created a local Tomcat environment for testing.
- Used jQuery for Lightboxes and AJAX calls
- LAMP = Linux Apache MySQL PHP
WebsiteBaker project; 2011, July - Aug
- Wrote an Intuit QBMS credit card payment module for the WebsiteBaker CMS in PHP, using Intuit's API calls (URL / GET calls, e-commerce keyword)
Firefox Add-on (extension); 2011, March - April
- Wrote a Firefox Add-on (extension) to count characters of a major social media site's post while typing, so one doesn't exceed the 420 / 500 character limit
project Numbers; 2010, June - intermittent work through 2022 and probably beyond
real estate project, intermittently from 2007 - 2010
This is the same client as the earlier codename Professor project.
- Systems analysis, coding, and support of a LAMP / WAMP / AJAX application to keep track of sales calls
- Multi-user login, passwords hashed with secret salt and public salt
- Search screen that previews result counts in each category and grand total
- One-button backup that emailed a compressed .SQL file to user
- 15 tables, 75 fields--kept track of phone numbers to call, result of call, cumulative status of lead, dollars-to-call ratio, source of lead, etc.
- LAMP = Linux Apache MySQL PHP
codename Doctor; 2009, December - January 2010
Rescued customer data from a system that was at its end of life. I had to reverse several fields of an RDBMS (SQL), and then I extracted the data
to desktop-searchable files and file names. The script was in PHP.
codename Professor project; 2010, maybe 10 - 20 hours of work
- Configured an off-the-shelf LAMP application for online children's classes: Configured databases for forums and chat, installed and customized the
php-BB forum system and a chat program;
set up password protection (LAMP). Trained teachers to create new classes from the template I built.
- LAMP = Linux Apache MySQL PHP
project Numbers, 2004
- I wrote a Java applet to do nine numerology calculations based on name and birth date. (Anyone else remember Java applets?)