• greetings, a. nonymous

summary

I am a 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.

specialities

  • many programming languages and dialects (BASIC, 6502 Assembly, C, Pascal, Fortran, C++, Python2, PHP5+)
  • web front-end and back-end development and engineering (HTML, CSS3, AJAX, Python, PHP, Django)
  • Linux/POSIX System Administrator (started ~1992, 20+ years) and user (~1988, 25+ years)
  • database design and administration (informix, postgresql, mysql)
  • apache httpd (webserver) configuration (virtualdocumentroot, mod_php, mod_wsgi running django)
  • incidental css3 animation (page header animations, full page transitions)

programming languages

  • php (~2002, advanced, 10+ years)
  • python (~1996, advanced, first version used was 1.5 while employed at ANSNOC, 15+ years)
  • C (rusty— last use, ~1996)
  • pascal - "turbo" (PC) as well as "VMS" dialects
  • 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 in college (~1990))
  • ECMA Script (aka "javascript")
  • a dash of perl -- I can read it almost competently but I have never implemented anything from scratch using it.

preprocessors

  • cpp
  • 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
  • scss (web specific)

front-end

back-end

  • php
  • python: django via wsgi, cgi (emich and global crossing)

database

  • 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.
  • postgresql (advanced, ~2000, since just before global crossing)
  • mysql (at best intermediate, 2 years experience in ~2008)

frameworks

networking

  • TCP/IP (v4)
  • 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 (college)
  • 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)
  • HP-UX (id card and dining services system at emich)
  • AIX (used at ANSNOC, fondly known as "aches and pains")
  • Banyan Vines (early to mid 1990s, randy and james at emich)
  • DOS
  • Windows, starting from 3.11, some customers currently running 10.x. very limited experience with windows as a server.

work

  • 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 legally. The programs I helped to write and maintain managed printing costs, mailing areas, etc. It started on a Commodore 64 and eventually moved to a DOS-based PC with a lot of help from Ray. Once I graduated High School, my work for Mrs. Duerr slowed and eventually stopped in a way that was not fair to her at all. Thank you, Mrs. Duerr, for putting up with me. Rest in Peace.

  • 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 project failed.

  • Eastern Michigan University (1990-1995, intermittently)

    My first student employee job at emich was with Career Services. I started in data entry, and was quickly (1 month) moved 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, developing the drivers and API would have taken too long. My boss (Jim) knew enough to stick with OS/2 which at the time could run more than one instance of MSDOS at a time given the right hardware.

    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. 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 Randy who was 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) 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.

  • 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 huge star trek fan). I eventually relented, applied, and was hired in august of 1995.

    I went through at least three official interviews to earn my netop position, one of which was a group of 4-5 hotdogs and me sitting at a conference room table opposite each other. the final interview was with the head of network operations at the time ("jcl"). 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, and I did not look forward to it, and I was quite vocal about that. I remember asking permission to automate the task and the 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 calls, it drew an ASCII arrow next to the problem port. Sanity checking was required, but it saved me a lot of time and the hotdog was pleased.

    I wrote a read-only Python extension in C that would interface 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 carrier, and as I 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. 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 long before "MVC" was popular. This project might have benefited from something like "multicast" because every client needed to get the same data.

    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. I was not interested in being assimilated, and so I resigned my position at the ANSNOC in June of 1999. Looking back, ANS changed my life and I have no unresolved regrets.

    it is considered especially rare that 20 years (as of 2016) after my employment at ANSNOC that I am in active contact with yummy, chris, jeffrey, etc. we are facebook friends with each other and there is also a 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 a*hole test"), etc. I cannot claim that everyone assigned to me as a shadow worked out, but for the most part they did.

  • Eastern Michigan University (1999-2000)

    After ANS was sold out to what eventually became Verizon (aka "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"

  • Global Crossing (2000-2002)

    When I was at ANS, I gave my word to one of the network engineers at the time (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 was asked to design and implement an intranet site called "hanta". I used python, postgresql, and "print" statements. 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.

  • Eastern Michigan University - Contractor then full time staff (2002)

    While employed as a contractor by emich, I wrote some software called "emuecobbei" which was 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.

  • 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 dataslab.com shortly thereafter. Ray designed 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 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.

  • 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.

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

    Teos -- "card catalog" containing various categories based on dir.yahoo.com 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.

    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 folder 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() 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 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 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 'sitenews' sig. Posts can be frozen (which means no replies are allowed), and can be in multiple sigs. 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 punctuation in the right place.

    July 30th, 2016: started on project atlas (thanks, chris)

    starting sometime in 2016 I started a project that automates craigslist searches. the code is in python and currently uses a postgresql database to store various searches.

school

  • 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.
  • in grade school, I wrote a program called 'factor finder' which used a nested for loop 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, a hidden directory for games, and "it's neat, isn't it?" while taking a remedial math class and helping a fellow student.
    • junior and senior year - involved with radio & tv as well as theatre club, refused to take any computer classes after a trauma freshman year.
  • college

volunteering

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)