aka Jim Winstead Jr.
Hire me! (click for details)
I am a software developer. After teaching myself to code on Apple II computers in junior high school and building software for our family-owned telecom business, my degree in Computer Science from Harvey Mudd College gave me the grounding for a career in software development where I was able to let my programming freak flag fly: I worked for Knowledge Adventure, an educational/games software company (where I first started leading teams of developers), HomePage.com, an internet startup (where we developed a white-label free web hosting platform), and MySQL Ab (where I led the web development team and then transitioned over to the server development team).
Through this time I was also involved in the open source community. In college, I was involved in the very early days of Linux, and I took over maintenance from Linus of the “root” disk used to install Linux before distributions. While working on websites for Knowledge Adventure, I got involved with the the PHP project, and became a founding member of the PHP Group. I helped set up and maintain some of the collaborative development infrastructure, including the mailing lists and online documentation feedback system. Then at HomePage.com, I contributed work we did related to `mod_perl`, and became a member of the Apache Software Foundation.
After MySQL Ab was acquired by Sun Microsystems (and then further by Oracle), I co-founded Raw Materials Art Supplies, a retail store in downtown Los Angeles which I have been operating as general manager for the last 15 years. I built Scat POS, a point of sale and ecommerce system using PHP and MySQL that we are using to run the business. It has involved a lot of integration work (payment processors, product feeds, shipping), and I automated as much as I could to focus on our artists' needs. This enabled us to build our business from scratch into one of the top independent art supply stores in the country.
I’m primarily looking for individual contributor roles. PHP/MySQL is the core of what I do best, but I'm comfortable with full-stack web development, Linux system administration, C/C++, Docker, and confident in my abilities to jump into any tech stack and get up to speed quickly.
View my LinkedIn profile for some dates and details, and my GitHub profile for some of my open source contributions. Contact me to discuss opportunities.
Embrace the dark
I finally took some time to implement a “dark mode” style for this site. It will default to whatever you have your system set to, but there is also a set of radio buttons that you can use to force it to a particular mode. (It doesn’t save the setting, so you will have to do it on every page if you are browsing around.)
This talk by Sara Joy about light mode and dark mode was part of the inspiration for getting around to this, and this article about light-dark
from Bramus is where I stole borrowed the idea for handling the mode switching.
Because I am using the relatively new CSS light-dark()
function to implement this, it is possible (likely?) it will degrade less than gracefully on older browsers.
Acomplish accomplished
I was perusing some old messages in the archives of the PHP mailing lists, and I stumbled across an email from me where I shared a sample of code as an example of a “natural” language I had used. That’s some real Acomplish code!
[ Declaration of a function to add an item to a list, keeping the list sorted. ]
To insert an item 'the_item' sorted into an item 'the_container':
For each item 'the_place' in the_container,
If the_item < the_place,
Add the_item before the_place.
Return.
Append the_item to the_container.
Make a list named myList of { 2, 3, 7, 14}.
Insert 10 sorted into myList.
Print myList.
[ Prints 2, 3, 7, 10, 14, more or less. ]
And another historical bit of trivia in that email: I proposed a for ... in
syntax for PHP, although that eventually became foreach ... as
.
Exadelic
Exadelic by Jon Evans is a science fiction book of the sort that I consume all too frequently. The characters and dialogue are clunky, the ideas are heavily recycled, and it still gave me things to think about. I am going to spoil it here, so don’t keep reading if you don’t want that.
Adrian Ross, our protagonist, is an obvious author stand-in and basically a “Gary Sue” as needed. He’s the boring one from what turns out to be one of those really important friend groups that define certain eras. It’s a diverse cast of characters in Silicon Valley, of course, where the men are whatever and the women are all Asian. (Kind of? I forget. It felt like a thing.)
The punchline is that his reality is just part of a multiverse of simulations, “magick” is a way to exploit bugs in the simulation to jump between them, and most of the book is a race to develop just enough “AI” to start exploiting those bugs but not enough to trigger the end of each simulation which apparently happens when a weekly cronjob notices that one of the simulations got too smart.
Things happen, Adrian gets tortured and forced to participate in rituals where techbros have orgies and he goes into trances and teaches them magick, but then escapes and starts to learn that things are all crazy and the simulation he is in is going to end but the AI (called “Coherence,” so look forward to that release from OpenAI) opens a portal to... another simulation.
That is one where Africa has dominated world development. This happens in one chapter that is about 18 pages long in a 908 page book, at least in Libby form. This concept could probably be a whole book on its own, but instead it boils down to him spending three years (!) living in poverty while shacked up with a woman. As it turns out later, the mere fact that he spent this time in a simulation so different from the others is what makes him the only one who can find their way out of the simulations. I’m just thankful that the author seemed to realize he wasn’t really up to the task of doing much with the world he lays out and just bounces back to settings more comfortable for him.
Which turns out to be mid-century Los Angeles, where Adrian runs into L. Ron Hubbard, Jack Parsons, and Marjorie Cameron, all exciting if you’re really into that era of weird Hollywood history, the occult, and probably won’t shut up about it. Jack and Marjorie ending up joining Adrian on his next jump to another simulation, along with an appropriately generic and boring love interest he picks up along the way.
When we finally get “outside” the simulation it turns out that it’s because some bored post-Earth humans wanted to meet one of the characters that it is in fashion to watch in simulations. All of these simulations are running in a Dyson sphere that has replaced all of the planets of our solar system, and the remaining humans live in mostly underpopulated habitats floating around inside the sphere. They are underpopulated because before the limiting systems were put in place to prevent simulations developing super intelligent AI that could break out of system into the real world, they would do that periodically and take along a bunch of humans to ascend with them. So what’s left when Adrian ascends is basically a bunch of nepo babies who fetishize being actually human (although they are backed up nightly and can be restored to cloned bodies at any time). Oh yeah, it runs on bitcoin. (There are also some weird/gross racial aspects to it that are lamp-shaded before being swept under the rug.)
This made me think of Elon Musk’s fascination with The Battle of Polytopia, a cartoony, limited version of the classic Sid Meier’s Civilization games. Dave Karpf wrote a great analysis about what that says about Musk. I imagine that in the world of this book, Musk would be one of these post-Earth humans playing in simulations of the past because it’s not challenging.
For some reason, Elizabeth Smart (better known as the Black Dahlia) is a character in the final chapter. Why? No particular reason, it seems that the author just wanted to drop the name and be able to point out in the afterword that there is a tenuous real-life connection between her and Jack Parsons and Marjorie Cameron. In fact, the afterword is stuffed with name-checks for all the ideas he has cobbled together into this Frankenstein’s monster of a story.
It’s worth quoting the beginning of the afterword:
Science fiction is sometimes called “the literature of ideas.” This sells it short—more precisely, it is literature plus ideas, which is why it is harder to write—but its ideas do matter.
The ideas are weak, the literature is not there, but I’d say this still solidly qualifies as science fiction. It’s a pretty low bar.
Using a Raspberry Pi as a WiFi Hotspot
The wireless router/gateway from our internet provider (Verizon 5G Home) works okay for most things, but it only supports “band steering” aka using the same SSID (wireless network name) for the 2.4 GHz and 5 GHz bands. I’m still using some older Wyze smart plugs that only support 2.4 GHz and for whatever reason they seem to be flaky in such a setup.
I’m running HomeBridge on a Raspberry Pi 4 to bridge between these Wyze devices and HomeKit because we’re an Apple-heavy household. The Pi is connected via ethernet to our internet gateway, so that leaves its WiFi capabilities free to create another bridge. It doesn’t have a keyboard or monitor, so I did all the setup via ssh
.
The first thing to do is to make sure that the WiFi is configured to the correct country so it uses the appropriate channels. You can do this with the raspi-config
program by setting the appropriate value in “Localisation Options” → “WLAN Country.”
$ sudo raspi-config
For the rest, we’re going to use the nmcli
utility which is the command-line interface for the NetworkManager system. I haven’t poked around under the hood much, but the configuration ultimately lives in files under /etc/NetworkManager
.
The first thing we do is create what NetworkManager calls a connection which we’ll use with the WiFi interface, wlan0
.
$ sudo nmcli con add con-name hotspot ifname wlan0 type wifi ssid "Idiot"
This creates a WiFi network named “Idiot,” which is short in my case for “Imperial Dog Internet of Things.” You can name yours whatever you want. That name hotspot
in there could be something else, too, you’ll just need to make sure to change further references to hotspot
below.
You’ll want to secure your WiFi network with a password, so there’s a couple of commands for that:
$ sudo nmcli con modify hotspot wifi-sec.key-mgmt wpa-psk
$ sudo nmcli con modify hotspot wifi-sec.psk 'This is where the password goes'
The first command says we’re going to use a key, and the second configures the password. Substitute your own.
Finally, we need to set the mode on the connection and tell it that we just want to share the Pi’s connection.
$ sudo nmcli con modify hotspot 802-11-wireless.mode ap 802-11-wireless.band bg ipv4.method shared
By only enabling the “bg” band we’re restricting this network to the 2.4 GHz range, which is what I hopes makes the plug(s) happier.
After this, I was just able to reset the smart plug to use the new “Idiot” network and it seems to have been stable for a couple of days.
It is kind of a Rube Goldberg situation where I say “Hey Siri, turn on my desk lamp” and it is sending out that speech to be processed by Apple, deciding what to do, the device that heard it telling the Pi what I wanted, the Pi going out to the Wyze server to tell it what to do, and somehow my smart plug getting notified what to do. It does take a second or two.
(These steps are just a distillation of what is in this article but without a browser-choking number of ads and popups.)
Looking for photos
I realized the other day that I hadn’t actually wired up the search box in my photo library.
I don’t like how it is a separate search from the rest of search on this site, but that’s a hill to climb another day.
A Living Remedy
A Living Remedy by Nicole Chung is a follow-up to her first memoir, All You Can Never Know, which I posted briefly about before. Where that was book was about her early life and connecting with her birth family, this one circles back to cover more with her adopted parents and their passing.
It is a beautiful book, and I found tremendously sad but ultimately hopeful. While I don’t have anything comparable in my life to being adopted and those aspects of family dynamics, I certainly connected with her story of losing her mom at long-distance in the first year of the pandemic.
Being agile and extreme sounds tiring
Because I was off on my small business side quest for the last 15-ish years, I have been working on coming back up to speed on what’s considered the state of the art when it comes to software development. I touched on some of that when writing about my memories of HomePage.com, but that still pre-dates when most people were talking about the development methodologies that have come to be known as “agile” so that is a topic I have been diving into.
I did come across this old blog post of mine with a reference to “extreme programming” and the then-new (to me, at least) concept of continuous integration which is a practice we had started rolling out at MySQL. A project idea I was kicking around recently was related to the “continuous peer review” concept. I still like firehoses of information like diff
commit messages.
This talk on “Not So Extreme Programming” by Amitai Schleier was a great catch-up for me, and I also went through a LinkedIn Learning course on “Agile Foundations” that was a good survey.
But where it all comes back to for me is the concept that was popularized by the quote attributed to Steve Jobs: “Real artists ship.” To me, that is the very essence of what agile methodologies are trying to achieve. I started my career doing software projects that were released in physical form, but even thinking back to those projects the times when they were going the best was when we focused on making incremental progress and developing iteratively. I love that there’s a whole framework of systems and language around it now.
I should dig a little more into the criticism, because I am sure there are organizations that have found endless ways of doing it all badly.
Second verse, same as the first
A disheartening thing about the job market right now is that it feels very stagnant, and I find myself coming across job listings that I skipped over earlier because it fell outside of the parameters I really need or want, but decide it’s time to just go ahead and apply to it and see what happens.
And then I notice that I actually did apply to it some weeks or months ago, and just never heard anything back.
I interviewed with a company recently that ended up deciding to not hire anyone right now. I am grateful to have gone through the process at least, just getting to flex that muscle of talking to interviewers and doing some technical exercises.
I continue to apply for other positions, riding that rollercoaster, and still somehow retaining some sense of optimism that the right opportunity is around the next bend.
Hits, Flops, and Other Illusions
Hits, Flops, and Other Illusions by Ed Zwick is a Hollywood memoir from one of the creators of thirtysomething and director of films including Glory, The Last Samurai, and Blood Diamond. It’s full of good stories well told, as you might expect, and also liberally sprinkled with writing and directing advice in the form of humorous lists, like “Ten Tips from Long Lunches with Sydney (Lumet).”
More than anything, it left me wanting to watch and re-watch some his films and those of the people he talks about a lot in the book like Denzel Washington. We did watch Glory before I started this and reading Zwick’s behind-the-scenes take on it really helped crystallize for me what I had liked about the film and how those performances came to be. We have The Last Samurai queued up to watch soon.
I also enjoyed how Russell Crowe kept popping up in strange and unexpected ways, which is funnier now that I look at their respective filmographies and see that they haven’t ever actually worked together. That doesn’t seem entirely accidental on Zwick’s part.
I double-checked whether they had worked together using The Oracle of Bacon and I love that it is still around. The list of the “centers of the Hollywood universe” (defined here) is incredible.
So many photos
There are about 1,900 photos in the photo library on this site, but I have almost 25,000 pictures in my iCloud photo library. I need to figure out how to close that gap.
I think mostly what I want to integrate will be many, many more pictures of Wonton.
Until then, enjoy this old picture of a squirrel.
(I also made it so entries with images will use those in the link previews elsewhere. It is another thing that could use refinement, but I am trying to not let the perfect be the enemy of the good when it comes to pushing things along here.)
Dr. Brain Thinking Games: IQ Adventure
Dr. Brain Thinking Games: IQ Adventure was one of first two games produced by Knowledge Adventure based on the earlier Dr. Brain games from Sierra Entertainment. KA and Sierra had wound up under the same corporate umbrella, and the “games group” at Knowledge Adventure that I was part of developed them. Our group handled three projects at the time: IQ Adventure, codename “Dime,” Dr. Brain Thinking Games: Puzzle Madness, codename “Nickel,” and the corporate website, codename “Penny.”
IQ Adventure is a third-person isometric puzzle/adventure game which was written in C++, and we used the networking and graphics library from Blizzard Entertainment (another corporate sibling). I was the lead programmer. We did some strangely ambitious things, one of which is that the game levels weren’t just laid out by hand, but we had a map specification language that was used to generate variations of the levels. Here is an example map that I was able to extract from the files on the CD. I couldn’t tell you how it works, really.
During our early prototyping, we did have a way of building environments by hand to test out artwork and the interface. It was just a mode in the game engine that let you “draw” with terrain tiles or place others into the environment. I remember before the team doing the artwork had created our main character, I prototyped with just a little whirling tornado that moved around so I could work on things like the path-finding algorithm.
The whole game was very data-driven. There was a text dialog system that let you interact with the NPC characters that was HTML-inspired. The animations of Dr. Brain giving you instructions were lip-synced using a tool that Knowledge Adventure had developed for their whole line of titles, which meant it was just audio files and frame timings that drove an eight-frame animation set. All of the puzzles and in-game quizzes were rule-based so they would be different on every playthrough. (Sorry to our QA team!)
Here’s a video I found someone playing through one of the levels (or more, I didn’t watch the whole thing).
The multiplayer was pretty simple but I also don’t remember much of the specifics. You could chat with other players, and because this was aimed at younger users there was a basic attempt at filtering out bad words, and I believe all of the chat was logged and someone from the customer service team was assigned to review it regularly, or maybe only when someone complained.
I wish that I still had the source code for the game and even the original media asset sources. In the released game, they were all rendered down to a 256 color palette because that was how things were at the time. I think it would be fairly straightforward to bring the game up on current platforms. You could probably even do it on WebAssembly or something else cross-platform. Unfortunately all of the filenames get lost when extracting the assets from the CD, so even just sorting them out to build something else with them would be pretty tedious. (Then again, the original game may still just work on a more current version of Windows that can run 32-bit apps, since I don’t think there was anything particularly fancy about it.)
I believe that Puzzle Madness was developed in Acomplish, the in-house proprietary multimedia scripting language that I blogged about earlier.
The third game in the series (from KA) , Dr. Brain Thinking Games: Action Reaction, was a first-person puzzle/shooter, and that was partly funded by Intel in their effort to drive adoption of the Pentium processor. It was developed using the Unreal Engine. The bad guys in that game worked for S.P.O.R.E.: Sinister People Organized Really Efficiently, which still makes me laugh. (I am pretty sure the codename for this one was “Quarter” but I didn’t work on it and left the company while it was being developed.)
Kill It with Fire
Kill It with Fire: Manage Aging Computer Systems (and Future Proof Modern Ones) by Marianne Bellotti was recommended to me by a college classmate on a post I made on LinkedIn a while back. (Part of a series of observations about how terrible ZipRecruiter is.)
This book is great, and I would highly recommend it to any software engineer. It’s not only about modernizing software applications, but has a lot of insight into how being a long-lived project is a reasonably likely outcome for any project, and you can save someone in the future from a lot of trouble by making some better decisions up front.
It also leans into the human factors and business realities of how software is developed, something I feel like I have been complaining about here and elsewhere.