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.
- Implemented a very complex, very customized, JavaScript-heavy user-interface (UI) for the timecard / billing hours screen
- 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
quiz
- 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
impose.
- 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
CSS
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
LineageOS was
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
Developer - PHP, JavaScript, jQuery / AJAX, MySQL (LAMP)
- Created an interaction to auto-populate country, city, state (region), area code, and country-phone prefix from ZIP code (postal code).
The interaction used
JavaScript, jQuery, HTML5, CSS, PHP, and MySQL. (UI and some degree of UX)
- Enforced password-strength requirements in PHP and JavaScript / jQuery
- Implemented and modified a JavaScript wait-time spinner (hourglass)
- 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
AAAA settings
- 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)
- Fixed a web / e-commerce payment process, a LAMP system. I tracked the problem to several JavaScript files whose Linux permissions were
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
dba)
- 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
- Studied the Base CRM API and found sample code for creating a web "contact us" form that goes beyond the BaseCRM one-line JavaScript form
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
Quickbooks API.
- 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:
- LAMP (Linux Apache MySQL PHP) plus a JavaScript library.
- 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
environment.
-
Got my preexisting JavaScript numerology calculator working in the new system. (Moved the JavaScript to a .js file because the system was escaping backslashes
and thus
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
not bots.
(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.
- OpenE development in object oriented (OO) Python 2.7, OO JavaScript, JQuery 1.8.3, XML, PostgreSQL 9.2, and Ubuntu Linux 14.04:
- 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.
- Several of these modules involved very detailed extension of / inheritance from existing OpenE objects, both in Python and JavaScript.
- Extensive use of Eclipse / PyDev Python debugger / IDE and Goo Chrome Developer Tools JavaScript debugger.
- Used JavaScript / JQuery to solve problems that the OpenE standard model did not account for (such as invisible table headers versus visible table data).
- 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.
- Sysadmin
- 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,
generating and handling events and inter-module messages. Written in Object Oriented JavaScript. (The boilerplate NDA can be interpreted as forever, so
I still won't reveal the details.)
- I wrote a second application involving OAUTH and other Goo APIs.
- I wrote a simple Goo cloud spreadsheet macro in JavaScript
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
- Wrote HTML/CSS/JavaScript/AJAX/PHP/e-commerce/MySQL customization to show the customer different prices and store views based on their zip code
- 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
(Object Oriented JavaScript)
project Numbers; 2010, June - intermittent work through 2022 and probably beyond
- Wrote a JavaScript application to do ten numerology calculations based on name and birth date
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?)