9 : 31 AM EDT


This website contains content that is not intended for a general audience. If you are under the age of consent in your jurisdiction and you do not have parental supervision while viewing these pages, do not proceed further.


I am a "full stack" software developer (front-end, back-end, back-office), database admin, and a Linux (POSIX) system administrator that also does graphic design (color, layout, etc for web pages) as needed specializing in custom information systems with 30+ years professional experience in IT (~1987), and 25+ years in the open source community (~1993)


  • custom information systems
  • intranets, extranets, websites
  • database integration

programming languages

  • tutor C# using "flowgorithm" and "visual studio"
  • php (~2002, advanced, 15+ years as of 2018)
  • python (~1996, advanced, first version used was 1.5 while employed at ANSNOC, 20+ years as of 2017)
  • C (rusty— last use, ~1996)
  • pascal - "turbo" (PC) as well as "VMS" dialects, early 1990s
  • fortran - consulted at goddard lab (emich) but acaedmic counselor waived the class in college, not touched since ~1991
  • BASIC - several dialects (Commodore PET, Apple, Timex/Sinclair 1000, C64, IBM (basica)
  • Assembly (6502 during high school (~1997) while shadowing Ray, VAX Assembly in college (~1991))
  • ECMA Script (aka "javascript")
  • a dash of perl and C# -- I can read it almost competently but I have never implemented anything from scratch using it.


  • cpp (c pre-processor)
  • m4 — built my first websites using it to substitute variables and rotate randomly through background images. the websites were awful, cindy knows it, and I learned a lot. at the time (and perhaps to this day), M4 is commonly used to configure sendmail.
  • SWiG — used it to build the first versions of the python remedy module and the python+perl version of the 'getdate' extension while employed full time for ANSNOC (~1997)
  • scss (web specific)

front-end (web browser)


backend tools

  • primary author of bbsengine4 (php)
  • python: django via wsgi (2017), cgi for emich (resnet) and global crossing (~2000)


  • for the PC version of Trimark's software, Ray wrote a database system in C. I used the same database lib with the answering service
  • first use of SQL was at ANSNOC (~1997) when I learned to write custom queries that were sent to the informix database which was the backend for the ticketing system.
  • wikipedia postgresql (intermediate+, since ~2000). first use was for the 'resnet' project while I was involved w emich, just before I jumped to global crossing
  • mysql (at best intermediate, 2 years experience in ~2008 and none for 10+ years (2018)

web APIs

  • ebay auto - the project involved submitting bulk ebay auto listings. during the development process I discovered a bug which needed to be fixed before my code would work properly. ebay charged us ("billy") $100 just to look at the ticket which turned out to be their problem. the money was eventually refunded. thank goodness.
  • amazon affiliate api
  • walmart affiliate api
  • paypal



  • TCP/IP (v4, basic knowledge of v6)
  • triage (stop the pain asap) dialup to T3+ (ANSNOC, 1995-1999)
  • WiFi (advanced, 10+ years) — including setting up a "hidden" network wherein the SSID is not broadcast, using available crypto. I have set up wireless networks for individuals and my local VFW post.

operating systems

  • Commodore PET
  • apple ][e, apple ][c ("laptop")
  • Commodore 64
  • Altos v3 ("m-net") -- no TCP/IP. I remember going with Ray to the umich undergrad library to do research into TCP/IP and planning to implement it on ALTOS System III. He didn't get very far thanks to the proprietary software license and the tremendous amount of work building a TCP/IPv4 stack would be.
  • BSD ("grex")
  • MudOS
  • Commodore Amiga - used for graphics by the radio and tv classes that I took and contributed to the video yearbook senior year and after graduation for 1 year
  • DEC VAX/VMS and ultrix (emich)
  • OS/2 — ~1991, while student employed by career services at emich.
  • Linux (SLS, slackware, red hat, fedora, debian, centos, etc) full-time user since ~1996
  • Novell (early 1990s, career services at emich)
  • Banyan Vines (early to mid 1990s, randy and james at emich)
  • HP-UX (id card and dining services system at emich)
  • AIX (used at ANSNOC, fondly known as "aches and pains")
  • DOS
  • Windows, starting from 3.11, some customers currently running 10.x. very limited experience with windows as a server.


  • trimark publishers of michigan, inc and traver table pad (1987-1991)

    This was my first part-time job writing programs. Trimark published coupons and did bulk mailings ethically. The programs I helped to write and maintain managed printing costs, mailing areas, etc. It started on a Commodore 128 in C64 mode and eventually moved to a DOS-based PC with a lot of help from Ray.

  • professional answering services

    I was employed to write a custom invoicing system using a library that Ray had written for use by Trimark. The problem was that I was only going to be paid once the software went on the market. This was another project that was well intentioned, but "100% commission" was no way for me to pay rent. The commercial software project failed, but they did use our software in production for a while.

  • eastern michigan university (1990-2002, intermittently student, dorm resident, student-employee, contractor, full-time)

    My first student employee job at emich was with Career Services. I started in data entry, and was quickly (1 month) promoted to a developer position, where I wrote some programs that used the C API of "The Bigmouth Board" to create a dial-in Job Postings Board. Whoever was doing the voice over work would dial into the system and record their changes after a PIN was entered on the keypad (DTMF Tones). The system ran in production using OS/2 for at least one school year if not several. As much as I wanted to run that system on a Linux machine, the time developing the drivers needed would have taken too long, and my boss (Jim L) knew it.

    My next job was with the Goddard Computer Lab assisting students with syntax errors and general software usage on monochrome terminals connecting to a VAX/VMS cluster via serial lines. While employed there I learned about the value of helping only with syntax errors instead of logic errors. I helped some students with Fortran, a language I have never written code in to this day.

    After Goddard, I went to work for James who was the assistant director of the Housing & Dining services IT department and we also supported some other departments like university publishing. I supported windows-based PCs and a couple of Macs, and wrote code in C to help with integrating the ID card system (which handled meal plans and eventually security access to dorms) with the university's student/staff databases

    I helped decide the platform (HP-UX vs. Microsoft) for the next generation ID card system for the campus. When Blackboard was the candidate, I knew that their POSIX-based offering (HP's HP-UX) was the way to go.

    I wound up writing the same program several times between the time the id system was selected while I was a student until my eventual move out of state. The goal was to write something that would take an export of the university student and staff list and import it into the id card system. At first, I wrote this program in C, and eventually graduated to something Python based years later.

    when my constract expired, I got word that they had upgraded to an sql-baed system at H&D instead of using a difficult fixed-width file format.

    While employed as a contractor by emich, I wrote some software called "emuecobbei" which is an obtuse acronym for "emu eagle card office black board equipment inventory". It tracked modules distributed by black board including card readers, registers, security, etc. The point of this project was to see how quickly I could implement a custom information system and it wound up taking about 2 weeks. I do not recall if it was ever put into production. mike (eagle card office) was very helpful in the development of this project.

    After ANS was sold out to what eventually became Verizon (fka "worldcom"), I went back to work at emich for Housing & Dining Services via Divisional Technology Services at first as a contractor and later as a full-time staff member. I wrote a captive portal in Python for the residence hall network that handled user registrations. The system worked by routing all web requests from an unregistered MAC address to the resnet signup web page. It worked very well as long as the student could handle first finding the MAC address within windows settings and then copy-pasting it into a web form. The primary complaint was that it took up to 10 minutes for the registration to be processed. If I recall, we changed the cronjob so it ran every 5 minutes. I am not sure if my software is still in production.

    I remember showing up late, not dressed the part, and completely unprepared for a meeting with the "new hires" into the University specifically those that reported to VP Vick (Randy's boss). I raised my hand to make a comment and when given permission I stood up and said, "considering how much software I plan to write while I am working here, would you be ok with an open source license?". VP Vick said, "I don't think that will be a problem". Randy was rightfully upset that I had gone over his head, tho in the end I did not do that much damage.

  • - sales, support, programming

    after a process involving proving I can play pool and hold my liquor, I earned a part time job with Ivars at selling dialup and supporting services. things ended poorly due to my .. uhm.. immature actions.. but I learned a lot from the experience. this job helped me get hired by

    one of my projects for Ivars involved writing some code that would install "winsock" and various utilities to a system that needed it.

    another project I had involved writing a program that would automate credit card payments.

  • ANSNOC (August 1995 to ~June 1999)

    during spring semester in 1995, a friend (tom) encouraged me to apply for a netop position at ANS. I was initially very reluctant because I wanted to finish an undergrad degree at emich in computer science. as it turns out, he knew me not only from some CS classes at emich, but also socially (I am a star trek fan). I eventually relented, applied, and was hired in august of 1995 as a "netop", which marked my first "real job".

    I went through at least three official interviews to earn my netop position, one of which was a group of 4-5 hotdogs (shift leads) and me sitting at a conference room table opposite each other. the final interview was with the head of network operations at the time (John). in that interview I told him that I wanted to write tools for the NOC and I was willing to be a netop for a year or two so I could learn what was required. while my title never included the words "developer" or "programmer", I was encouraged to write tools to make me more efficient at my job.

    I had just started in the NOC as a nightdog (3rd shift). One of the hotdogs ("lam") wanted me to run reports by hand on a few of our dialup nodes in order to find problems. This would have been a very time consuming task if I had to do it manually, I did not look forward to it, and I was quite vocal about that. I remember asking permission to automate the task and lam said (paraphrased) "go for it". I then set about automating the task as much as possible using C which was the only available language I knew at the time. What I came up with was some code that used kerberos to log in to an AIX machine at the POP, parse each line of a node report and compare it to the port above and the port below. If there was a significant difference in call attempts, it drew an ASCII arrow next to the problem port. Sanity checking was required, but it saved me a lot of time and the hotdogs were pleased.

    I wrote a read-only Python extension in C that interfaced with the Remedy Action Request System v2.0 using their developer library. To update a ticket, my program would shell out to a seperate in-house tool. One of the tools I wrote using the extension would go through the tickets in the system and pick out items that had a tracking number in a specific field. It would submit the tracking numbers via email to the shipping carrier, and as it got the responses into the trouble mailbox I would paste them into the right tickets. Previously this task was a tedious manual process.

    I helped to develop and eventually maintain the next generation of the "trouble mailbox handling system". There were custom shell commands (tscan, tshow, tclaim, etc) and it was client-server based using at first a plain-text protocol and changed to use a tokenized protocol for performance, and even later shelling out to mh commands cutting out the server entirely. The primary author (kevin) designed and implemented a system where the back-end work (getting mails from the server, claiming messages, etc) for the client was decoupled from the actual display of the messages, easily allowing ncurses and Tcl/Tk user interfaces.

    ANS was in the process of being merged with UUNET which was being merged with Worldcom which was in the process of changing it's name to MCI and finally settled on Verizon. Looking back, ANS changed my life and I have no regrets. I learned a lot about being a stock holder in a publiclly traded company.

    it is considered especially rare that 20+ years (as of 2017) after my employment at ANSNOC that I am in active contact with several ANS people. we are facebook friends with each other and there is also a (mostly dead) mailing list.

    one thing that I value from my time at the NOC was that after a while, I was assigned "shadows" that I would help with the practical application of their training. normally this involved showing them various tools, hints about how to word emails so customers would be less likely to get offended (aka "the you asshole test"), etc. I cannot claim that everyone assigned to me as a shadow worked out, but for the most part they did.

    I was eventually promoted to "senior netop" along with a few select coworkers. It did not include any more responsibility than I was already given, but I did get a pay raise.

    ANS was "assimilated" by WORLDCOM, and during that process I resigned from my position (~july 1999).

  • global crossing (2000-2002)

    When I was at ANSNOC, I gave my word to one of the network engineers (paula) that if she needed me I would work for her writing noc tools. Shortly after I was full time with emich I got word from one of my fellow former netops (andrew) that paula needed my help. I apologized to my boss at emich when I got the offer letter and said that I had given my word and I could not pass up the job. the mistake was that I did not tell Randy or James that I had given my word ahead of actually hearing from her with a job offer. I honestly believed it would never happen.

    I was asked to design and implement an intranet site called "hanta". I used python, postgresql, "print" statements, and CGI. We had various pages on that site, one of which was an app called "workflow" which was built around NOC Internal Integrated Trouble Ticket System Functional Specification Wishlist and our experiences at the ANSNOC.

    Once the intranet was working well, I set up a squid (http proxy) instance such that a group member could access other intranet sites using their Hanta username and password.

    Another project was to set up an IRC chat server that would connect to another internal machine as a peer. We were expected to join certain channels in order to keep up with outages.

    global crossing was 100% telecomute. I loved it, and I work that way to this day.

    I worked on a tool called 'putrid' which built upon another tool called 'rancid'

  • dataslab

    I had a need for website hosting that would give me a root shell. I talked the idea over with Ray, and we started shortly thereafter. Ray engineered the host machines and did backoffice (billing), and systems engineering (building new hosts). I did sales and customer support. We did well until he got a new job and could no longer be involved with the project. We decided not to renew the domains after a catastrophic hardware failure (literally a meltdown) on the only remaining host machine after a few years in successful operation. One of my biggest mistakes was not letting customers know about drastic changes like a partner divesting and catastrophic hardware failures. notification would have been easier if the host was up so I could send out "omg" emails.

  • zoid technologies (2002-present)

    I founded Zoid Technologies, LLC in 2002 with the help of a michigan based attorney very shortly after I was laid off from Global Crossing. I build custom information systems using Python, PHP, Postgresql, Smarty3, and several packages in PEAR. I also do some Linux System Administration and Microsoft® Windows™/Internet Tutoring for local customers.

    when I moved to the southeast, I did not have the money to re-establish the LLC, but I kept my internet site.

    founded in 2008 when it was clear I had something worth while.

    Teos -- "card catalog" containing various categories based on and dmoz. At first, Teos was using a simple database structure that formed a directed graph. The list needed to be traversed using depth first recursion, so when it came to making "you are here" or "breadcrumbs", I had to reverse the list so it would display correctly. I later rewrote the code and changed the database so it used the 'ltree' contributed Postgresql data type. This offloaded the work of searching for nodes to the database and I no longer needed recursion in the PHP. I also wrote a small function in pl/pythonu that converts an ltree path to a url path. it changes "_" chars to "-", lowercases, strips leading and trailing whitespace, and compresses more than one "-" down to one.

    Vulcan was started as a way to get access to my bookmarks regardless of which computer I was using at the time. Due to recent (2016) changes, a link is allowed to be in more than one sig on Teos

    In September, 2014 I created the 'moneyday' page which calculates the number of days between a recurring day of the month such as the "2nd wednesday". I applied this technology on the vfw10058 website to calculate meeting dates.

    In June, 2014 I used css and javascript to make a "sticky topbar", which is a div tag that sticks to the top of the page if it would have scrolled off of the top of the viewport. This effect is done using css and some javascript which hooks into the "scroll" event.

    Around July 4th, 2014, I wrote a "digital clock with flashing colon" (notice the name similar to a typical firework) that uses a combination of css and javascript to present a clock in the local timezone of the browser. This feature also uses a custom font by adding a couple of lines to the CSS. It works well, but some clients have seen a quite verbose timezone name which takes up extra space on the page.

    After the clock was working well, I found some code that would allow javascript to run when the window was hidden which I modified to stop the digital clock. This frees up the CPU for other things and is helpful on mobile devices.

    In August, 2014 I wrote an "enhanced form system" that uses jQuery to animate page transitions for forms. It gracefully degrades if javascript has been turned off or blocked to a normal html form. If "enhanced forms" are being used, the php code sends the markup as JSONP, otherwise it builds a normal html document currently using HTML_Page2. Initially I was trying to replace the entire DOM so that I could do a page redirect easily. This didn't work very well using Firefox, however Chrome handled it just fine. I wound up changing displayredirectpage() in bbsengine so it would work if coming from an enhanced form by setting some properties on the page object. The next phase will add page transitions for internal pages for example clicking on the link to Achilles from the side bar menu will fade down the old page and then fade up the new page.

    In January, 2015 I started porting a notification system I wrote for another project into bbsengine3 with explicit permission from the customer. The major issue with this feature was that I needed to configure the webserver to allow "cross origin" requests. The normal way to do this is with CORS, but I could not get it working properly. I found success with JSONP instead. Another aspect of this feature was some javascript that updates a "flag" icon in the topbar. Whenever the count changes, the old one is faded out and the new count is faded up using css3/jquery animations. This attracts a little attention to the change without being intrusive. If there are no notifies, the flag is colored black and changed to an outline, otherwise the flag is colored white and filled.

    Around July 1st, 2015 I started writing code for sophia2 after months (years? decades?) of planning. A few days later I had a mostly working system, and used it for 'site news' on the main website by writing a simple sql query that would request any posts assigned to the 'site news ' sig. Posts can be frozen (which means no replies are allowed), and can be in multiple sigs (like usenet and m-net and grex). Sigs are specified via a "postfix style" input box which allows listing sigs separated by whitespace and/or commas. One detail I am rather proud of is that the post template shows the list of sigs properly comma separated including the oxford comma. This required zero PHP and instead uses some CSS selectors to put commas in the right place.

    ~2015, I replaced the custom js I was using that did an animation when forms were submitted to the use of jquery.smoothstate, which is a bit more flexible.

    starting in the spring of 2016, I started a project that automates craigslist searches. the code is in python and currently uses a postgresql database to store various search parameters. at this point (summer, 2017) the bot runs twice per day.

    january, 2017: seriously started on project atlas (thanks, chris)

    spring, 2017: started tutoring chuck

    • C#
    • linux
    • flowgorithm
    • sql database 1
    • web programming (html, css)

    2018-Mar-12: I have been working on zoidweb3/bbsengine4. the biggest change so far is using "blocks" in smarty3 and removing use of PEAR's HTML_Page2 package


    • zoidweb.agora, a Worthy Marketplace℠ which has Amazon items for sale
    • falcon now uses mod_fcgid rather than mod_php
    • zoidweb4.agora has 140+ items
    • zoidweb4.agora uses the node table
    • bbsengine4/zoidweb4 has a node table that is used by agora. the node table allows for software defined databases through use of a 'jsonb' column.
    • bbsengine5 is coming along nicely. latest feature is using the node table for sessions


  • part of the "talented and gifted" program in 6th grade (age ~12) which taught me how to program in BASIC on a Commodore PET. The display was monochrome and the only storage available was a cassette drive. No mouse. No WiFi. no copy-paste. we only had magazines to get the job done. at that age, I was OK with it. ;)
  • in grade school, I wrote a program called 'factor finder' which used a nested loop (brute force) to find factors of numbers between 1 and 100 (or any other range I wanted). I do not remember if I got the idea from a magazine or if I wrote it from scratch. bottom line is that I understood what the code did and I was able to explain it coherently as a 6th grader. The librarian submitted it to a programming contest. I do not recall the result.
  • My parents got me a Timex Sinclair 1000 to use at home. Like the PET, the only storage available was a cassette drive. My dad worked at a hospital where they had EKG machines which used cassette tapes to store data. When there was no longer a need for the cassettes, my dad would degauss (erase) them and give them to me to use to save my programs.
  • I had various games for the Timex including "frogger"
  • I would spend hours typing in and using programs that I got from magazines. back then there was no such thing as "copy paste", so when a program was in BASIC I got to know it very well. Assembly programs were a different story since they consisted of data statements which meant lots and lots of hex numbers.
  • My parents told me that if I could exceed the capabilities of my Timex that they would get me a Commdore 64 for my birthday in January. My Timex had 16 kilobytes of RAM which was expanded from 2 kilobytes in the base machine. I typed in and then modified a drawing program so that it could store several images in RAM at a time (a three dimensional array). I increased the number of images stored in RAM until I ran out. I showed the program to my dad who had to conceed that I had indeed exceeded the capabilities of my computer. For my next birthday (January), I got a Commodore 64 as promised which featured color and a whopping 64 kilobytes of RAM.
  • high school - graduated in 1990
    • freshman year
      • computer programming class which caused me grief
      • a hidden directory for games
      • "it's neat, isn't it?" while taking a remedial math class and helping a fellow student. the look in his eye was priceless, and I hope to meet him again some day. the instructor got it. it is one of the best things that happened to me in high school.
      • admin access to a computer lab thanks to my connection to a Senior
    • sophomore year
      • refused to take any computer classes after traumamatic experience freshman year
      • speech class.
    • junior and senior year
      • took radio & tv 1 and 2. in the advanced class, we worked on the Huron Video Year Book; taped sporting events, theatre shows, and a bit of "color"
      • theatre: crew for a couple of shows as a stage hand
      • drafting for two semesters. in the 2nd class, I was enrolled into a class at WCC which taught AutoCad. the project I remember most strongly in drafting was doing "3D" by hand with a pencil, especially shading/shadowing. at the time, autocad could handle this but only with an expensive set of plugins which the high school had not purchased
      • I ran a dialup BBS at first at 300 BPS (bits per second), then 1200 BPS, then upgraded to 2400 BPS with financial help from Trimark. at first I used a pirated copy of C-Net 10.x and 11.x, then I purchased C-Net 12.x, and upgraded again to Image BBS 1.x. pretty much the situation was similar to pump up the volume (affiliate) in that I was a HS student, but I had this "second life" when I got back to the house during the week and on weekends. I earned beta-tester status for Image 1.2 and 2.x thanks to my connection to Ray. I heavily customised my BBS even when I was a beta-tester which made debugging more difficult.
  • college


Charter member and elected Secretary of Men's Auxiliary at VFW Post #10058.

  • in late 2014 I wrote a tool in python which uses a CSV file of the roster and generates a phone list as a PDF which can be posted on the website or printed.
  • In February 2015 I wrote a program to build the "member change transmittal form" as a PDF.

IRC - Volunteer on several channels and networks (freenode and oftc) helping where I can with python, php, postfix, postgresql, fedora, and jquery (javascript library)



  • family, for buying hardware and sofware starting when I was in 6th grade, and for helping and supporting me to this day.
  • ray, whom I was privileged to shadow for a number of years
  • pat, for being my first part-time job writing programs (~1987)
  • ivars, for being my first part-time job helping to run a dialup ISP
  • jim l, for giving me my first student employee job at emich (~1990)
  • goddard lab (emich), for teaching me how to help with programs without doing the work for the student, and for special access to the lab so I could play MUD until all hours even during finals week
  • james (and randy), for hiring me into their department several times
  • tom, for encouraging me to apply for a job at ANS (~1995)
  • lam, my first third shift hotdog at ANSNOC, for encouraging me to automate what I considered menial tasks and for the weekly 45 minute pre-maintenance-window combination smoke break and planning sessions.
  • jwelch for being the best hotdog ever despite my initial "wtf?" (which he heard) when he was being fast tracked to hotdog.
  • phil, for being a helpful ear during times of difficult customer situations to this day.
  • ken, for giving me the freedom I needed on a huge project and treating me right.
  • billy, for ripping me off and teaching me a few lessons in the process. gained exp with bootstrap, the ebay api, two factor auth, etc. he also got me a VM for a good price which I use to this day.
  • chris, for deciding that django was the best way to go for his project (atlas)
  • not-tck-tom, a dorm floor-mate from emich (4th floor phelps), for finding tickets to a pink floyd concert when we were in college and had not yet found full time jobs and broke af. I got hired by ANSNOC, he got a job at a shop (white collar vs. blue collar). sadly, he left this world way too early apparently because DUI. I heard the news while I was on shift and was so distraught that the hotdog (lam) sent me home early. I still miss him all these years later.