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)
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.
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.
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.
after a process involving proving I can play pool and hold my liquor, I earned a part time job with Ivars at ic.net 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 ans.net.
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.
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).
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'
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 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.
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 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. 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
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
2020-Apr-17
Charter member and elected Secretary of Men's Auxiliary at VFW Post #10058.
IRC - Volunteer on several channels and networks (freenode and oftc) helping where I can with python, php, postfix, postgresql, fedora, and jquery (javascript library)