My junior college courses and first personal computer

At some time in the near future, I hope to retire from my career in computer operations and programming. I don’t know if there will be a retirement party, but if so, it wouldn’t hurt to have written down a little history. The second part of “How I got into computers” barely talks about this.

For a year at least, I still lived with my parents and went to junior college. I’d also gotten a part-time job with Truline Corporation, manufacturer of printed wiring boards. I was supposed to become an electronics engineer like my Uncle Dick, my mom’s oldest brother.

I was on the engineering track but made the mistake of taking on 18.5 units of courses. I’d been a super student in elementary, middle, and high school, so of course I could take on a heavy load of college work. Three problems took me down:

  1. All work and no play made me a weary boy.
  2. My favorite grandmother died.
  3. I was always a nerd and uncomfortable around girls.

But there was one thing I loved about my junior college days: computer programming. We had an HP 3000 mini-mainframe, and I knew where there were a couple of terminals hidden in one of the unused classrooms. I almost never had to wait to use the computer.

I took two FORTRAN classes and a COBOL class. My COBOL instructor, Ruth Harner, had met Rear Admiral Grace Hopper in person at a conference.

I really liked COBOL. I very much liked the idea that if I name my variables and subroutines carefully, then what the computer is actually doing is spelled out in plain English.

My two FORTRAN courses were superb too. The first one was directly useful in my engineering courses because we were learning about eigenvectors and reducing arrays of algebra statements to solvable problems. I remember reading a book about how to lay out physical spaces by creating rules of priority; in a hospital, having the bandage and dressing storage closer to the emergency room is more important than having the restroom nearby. By assigning numbers to relations and multiplying each item in relation to all the others, and then by sorting the results, one could (in theory) get the optimal layout. Better yet, adding detail improved optimality. But the downside (in the book) was that computers were still too primitive to do large calculations. The problems scaled at log(n) but the mainframes of the day simply didn’t have much memory. I could see that the microcomputer tsunami was soon going to grow the amount of RAM available to make this an easily solvable problem.

My other FORTRAN class was even better, even though the instructor didn’t know anything about programming. He was a mathematician, but the college needed a FORTRAN instructor, so he was voluntold. I don’t recall his name, unfortunately.1

His choice of course material could not have been better. He taught us Nassi-Shneiderman flowcharting. Nassi-Shneiderman flowcharting makes breaking problems into “Actions”2, “Loops”3, and “Branches”.

Ruth Harner spelled out that programming is a process of top-down, step-wise refinement. Just like the Scientific Method can absolutely nail any problem in Science, top-down, step-wise refinement can solve any computer programming problem.

The beautiful idea our professor walked us through was to write our FORTRAN with gobs of tab characters, pushing the text to the right where appropriate. When we printed the source code out on green-bar paper, we could then take a yardstick and pencil and literally draw the Nassi-Shneiderman flowchart around the source code. The code execution operated within the flowchart and the flowchart showed the visual flow of the code.

Combine the flowcharting and the top-down, step-wise refinement, and man computer programming is fun!

Of course, at that time the mini-mainframe still has only a text based interface and no software to help. I wouldn’t see Dave Winer‘s ThinkTank program for another five years.

A mildly amusing event was at the end of the semester: the line of kids to type in their programs was twelve kids deep on every terminal, with only two days left in the semester. My best friend, Paul S. (also my boss at Truline) was one of those students. Paul saw me in the computer room, and said he didn’t know what to do! He also needed to work at Truline, and wouldn’t be able to come back in the evening when the terminals weren’t so busy. I looked at the lines and saw that the keypunches were empty. No kid wanted to put their program on punched paper cards…. I was comfortable with them, so… I told Paul, “Hey let’s use these.” He was hesitant because he’d never used one before, but I showed him it wasn’t so bad. I told him about putting the rubber band around the deck and filling out the paper for his job to be run. It worked like a charm. Within a minute of putting his deck in the input basket, the operator grabbed it, dropped it into the card reader and put the printout on completed jobs basket. heh.

One other thing (that sucked) was that some kids stole my high school graduation gift. My dad had gotten me a Casio programmable calculator as my high school graduation gift. We didn’t really have any money (my dad had lost his job), but this was the best he could afford. I don’t recall whether it was the FX-702P or the FX-700 but it really was fully programmable. Those kids who stole my graduation gift were minorities. I’d gone to the student union before my Physics Final. There weren’t any other kids in the student union. I’d put the Casio in my backpack and decided to get an orange juice before taking the big test. I left the backpack on the table because I had never previously had a need to consider that thieves existed.4 When I got my orange juice and went back to the table, it was a little weird that my backpack was unzipped, but I didn’t really notice that because I had the biggest test of my life coming up – that Physics Final. I get to class, get the test, get to the point where I need my calculator… and it is gone. I’m utterly demoralized. I hadn’t really liked Physics and Engineering, but this was going to hurt. Yeah, I flunked that Physics Final, too.

After I burned out on my massive load of schoolwork, I moved out of my parents house, and into a shared apartment. After failing most of my engineering related classes (although I did great with the programming ones), I told Truline I’d go to work full-time in the evenings. Maybe I’d still do some college, but of course, I did not.

There’s a whole story about my not going to college and my dad losing his job. Perhaps I’ll tell it another time.

I still visited my parents, and talked computers with my dad. He had heard about a computer, the Osborne 1, which was a real computer, and it came bundled with $1,500 of software – and for a limited time only: dBASE II (which was worth another $1,800).

My dad helped me buy my very first personal computer. It was $1,795 total. I think he was able to help out with $500.

It was fun, because there was a magazine where I could type in program code listings and then run games (on a ridiculously tiny screen). I learned CP/M and PIP (Peripheral Interchange Program). I played with WordStar, SuperCalc, CBASIC and MBASIC and dBASE II. I didn’t get the modem, although a co-worker of mine had, and he dialed in to the junior college and wrote his code from home. Fancy!

At Truline, I’m seen as a kid with potential, and I start to get moved around. Eventually, I get to do every production job and became the “engineer”. Really, it was my job to take the artwork and blueprints from the customers and turn them into Work Orders. That’s where having done every production job at least once was helpful. But I’m jumping ahead a little bit.

I’d started out as a driller. We’d take the artwork, tape it to a flatbed, and then guide a table riding on dual rails (an XY table) over the artwork. The table held four small electric drills, one on each corner. Where there was a pad on the artwork, I’d align the scope (an angled mirror) and tap the foot pedal. The foot pedal would engage pneumatic locks on the rails, and drop the spinning drills into the PCB material. We’d stack the copper-clad PCB fiberglass four stacks high. With one foot tap, I would drill sixteen circuit boards.

Later, I ran the “programmer” which still used a flatbed and taped artwork, but had finger spinners. As I spun them, the XY table moved, this time floating on air bearings and driven by dual leadscrews. Instead of physically drilling the holes, it put the X Y coordinates on a paper tape. This was G-Code, although I didn’t really do any language work (yet). Once in a great while, I tapped the foot pedal an extra time, and then had to go back and manually slice the errant code out of the paper tape (and then glue the tape back into a continuous strip). Man I don’t know why so much of my early (electronic) computer programming recorded the data on punched paper. The paper tapes were stored in clear plastic boxes that looked like movie canisters. When it came time to drill the panels, I (or someone else) would load the paper tape into an Excellon Automation drill and drill the panels complete with automated bit changes and robotic speed.

Later I was on the router / profiler machine, and with it I actually did write G-Code to move the router bit around to carve the circuit board out of the panel. It was very much like programming an ink pen-plotter – we had one in the engineering department at the junior college, which I’d gotten to put a plot on, using FORTRAN.

So I ended up as the “Engineer” at Truline and started composing Work Orders. All the W.O.s were a photocopied piece of paper, and I crossed out the parts that we didn’t need. I wrote in numbers or text where the build needed things specified. The first line, I think, was (for example) “2 x 8” for a panel two circuit boards wide and eight tall. Later, when IBM had standardized the physical dimensions for ISA add-in cards, we did a lot of “2 x 8” panels.

After a while, I got the idea to write a W.O. generator in dBASE II. I brought in my Osborne and my trusty Okidata dot-matrix printer and showed my creation to the president of the company.

He offered me a job as their in-house programmer – if I would learn to program their mini-mainframe.

I’m gonna be a professional programmer!!! Life is going to be fun!

Next I’ll write about night school and becoming a full-time RPG II programmer on an IBM System/36.

  1. He did harm us students, though. Almost every student (of 31) dropped his class in the first two weeks. Only five of us stuck it out. Because he was a mathematician, he graded on a curve. One student would get one grade, each: A .. F. Yes, the kid who stuck it out and was doing (arguably) B grade work was assigned an F because with five students and five grades, that was the natural map. I got a B, but I do think it was unfair that Brian was given an F for trying. ↩︎
  2. Output, Input, copying, and calculations. ↩︎
  3. Technically, every loop is a branching statement with actions; but, the loop flowchart block simplifies the complex to be easy to see and understand. It maps really well when the programming language we’re trying to get to includes operators like “foreach $item ( @list ) { … }” ↩︎
  4. Is a lack of awareness about thieves White Privilege? If you think the answer is yes, I’d have you look in the mirror to identify the real problem. The only people who excuse thieves are those who are thieves. ↩︎

My introduction to computers

At some time in the near future, I hope to retire from my career in computer operations and programming. It occurred to me that I haven’t written down my history, at least regarding computers and programming.

This post will be a longer version of what I wrote in the first part of “How I got into computers”.

At this point, I’d watched the Wall $treet Week with Louis Rukeyser episode with my grandfather and had seen Mr. Rukeyser say, “In the movie The Graduate Mr. Maguire tells Benjamin: “I want to say one word to you, Benjamin. Plastics, young man: Plastics””, (Louis Rukeyser continues:) “If Mr. Maguire were talking to Benjamin today, he’d say, “Computers, young man: Computers”, and I thought to myself, “I’m a young man….””

So my very first introduction to programming was a calculator. I had previously been exposed to a Texas Instruments calculator with a red LED display – probably the TI-30. It was inexpensive, and the timing was about right: my junior high school math teacher warned us that we ought to learn to do math by hand because we wouldn’t always have a calculator with us1. The TI-30 came out in 1976, which is about the right time. My parents did not have much money, and this particular calculator was in the $30 range. My uncle, who did have money, had bought a different (earlier) calculator (also Texas Instruments), which cost quite a bit more, so I think my dad bought the TI-30 to prove that we could afford one. I liked that calculator, although I didn’t do a lot of math on it. It could do square roots, though, so it was a miracle machine as far as I was concerned.

I later got a TI-58 all on my own. I was employed part-time as a janitor at Sears in the early mornings. The TI-58 was a programmable calculator, and I wanted something I could program. Indeed, it had registers and op-codes for various commands. I remember that book, Personal Programming, shown in the flyer.

It had an op-code, JNZ = Jump if Not Zero, which is an “if” statement that allows loops. If the register is not down to zero, jump (goto) an earlier LBL (label) instruction and do the loop again. Presumably we remembered to decrement the register, so that eventually it did equal zero, and we dropped out of the loop.

So I did have an inkling of what computer programming was like.

My best friend at the time, Greg L., had taken a computer programming course at our high school – in 1978. That course would make him swear off programming forever2: he was taught the language RPG II. RPG sucks. Well, it does if you aren’t super detail-oriented, which many people are not. I’m not saying one has to be autistic to enjoy RPG, but it certainly wouldn’t hurt.3

Greg took a programming course in 1978. I didn’t realize that my high school even had computer programming as an elective course. But for 1979, I signed up. And that class taught FORTRAN. Doctor Larry Ray was our instructor, and he knew his stuff.

FORTRAN was the perfect language for me to learn as my first Third Generation language. If you’ve seen BASIC, you’ve seen FORTRAN.

Let me digress on Third Generation languages. The First Generation was op-codes like I’d seen in the TI-58. The Second Generation was in-between, and RPG and RPG II fit that definition. Third Generation was for languages like COBOL and FORTRAN. You could essentially write your programs in English, and someone who was not a programmer could read the source code and understand what the program was doing.

FORTRAN was fun!

One of the kids even tried programming a text adventure, “pandemic” where we fed in a punched card with a yes/no choice. Unfortunately, the programming wasn’t right, and there was never a way to avoid using nuclear weapons to destroy the infected city. But we had gobs of fun printing up stuff on green-bar paper, and learning to program.

Mind you, this mini-mainframe was primitive. The school district had purchased an IBM System/3 with 4 KB RAM and punched cards, although it did have a disk pack. It was both to run the bookkeeping and accounting for the school district and to be a vocational education training tool.

One day, a student, Mike P., iirc, brought in a new computer he (his dad) had bought. It was a TRS-80 (Tandy Radio Shack 80). Oh my goodness, Wikipedia tells me it was $600 back then, which is about $3,000 today. Anyway, Mike brought it in, and Dr. Ray asked how much memory it had. His $600 microcomputer had 16 KB of RAM, which was four times the memory of our $50,000 mini-mainframe with 4 KB of RAM.

Yes, my first real computer programming was on punched cards, in 4 KB of RAM.

Later, I would learn RPG II, and the lack of memory didn’t matter. RPG II came from the environment of wiring boards, which had zero memory. But in FORTRAN, one of our programming problems was to do a 30-year mortgage amortization report. Dr. Ray warned us that we would be tempted to use an array for this problem. A 30-year mortgage amortization looks like a grid (array) of numbers, and FORTRAN does math on arrays, so of course it looks like a natural fit. The problem, he explained, was that with 4 KB of RAM, we’d only be able to store about four columns and twenty rows of cells in the array before running out of memory. A 30-year mortgage amortization has 360 monthly payment lines….

Yes, we kids tried it with arrays. Yes, I got to see the out-of-memory error code on the front panel of the computer.

As an aside, deep from my heart I want to thank Dr. Ray for adding an extra credit problem: run the amortization report with a single extra principal payment at the top of the loan. That one additional payment multiplied into three times the amount saved. He showed us the power of compounding interest with that little task. Later, when interest rates were higher, the savings were vastly greater. Later also, we got to use spreadsheets, and this sort of calculation is almost trivial to perform. But I wouldn’t have known the math and formulas if we hadn’t gone through the exercise.

So that’s a short history of my use and programming of computing devices, 1980 and prior. We didn’t have modems yet. We barely had screens. The magnetic disk packs were for the accounting data files; students got punched paper cardboard. And if you dropped your card deck, you had a long session of sorting ahead of you, to figure out how the program algorithm needed to be reconstructed.

Next I’ll write about my junior college days.

  1. This statement aged like unrefrigerated milk. Still, that particular teacher was one of my favorite teachers, and I am thankful I got to have Mr. Eitzen as a math teacher in 1976. The class was Introduction to Algebra (if I recall correctly). Yes, I was in the Gifted program, so in junior high we were being taught Intro to Algebra. Every week, Mr. Eitzen posted an extra-credit problem, and we kids were eager to figure it out. Mind you, 1976 was pre-Internet, so when he introduced a problem with the ! operator, all us kids were completely in the dark that there even was a mathematical operation called factorial, much less how to compute it. ↩︎
  2. Well, later Greg would dabble in Macromedia Flash, which was also a programming language, and that programming language didn’t suck. ↩︎
  3. I would later program in RPG II for two-and-a-half years at Truline Corporation. I knew it wasn’t a great language, but I loved being a programmer, building things. ↩︎

Amazon (Audible) stole from me

Another instance of Make Orwell Fiction Again.

The New Confessions of an Economic Hit Man was a purchase I made in 2020 or 2021. It was purchased with gift card money; my mom’s boyfriend bought me 12 credits worth of an Audible subscription for Christmas. I registered the code, and used the gift card / subscription to purchase this book.

I listened to the book in 2021:

It’s there in the middle:

That 12 hours left text is an artifact of hitting the Start button again, after having listened to it once.

John Perkins wrote this autobiography. He says his job was to convince leaders of underdeveloped countries to partner with USAID (an alleged CIA front) to take on huge loans for development. And if the leaders (or newly elected leaders) don’t go along, they might happen to die in airplane accidents….

This book is particularly annoying to certain really corrupt people in government. It is not surprising that it would end up on Big Brother’s to-be-memoryholed list.

So, I’d paid for it, downloaded it, and listened to it. But many months ago, I noticed that in my Audible app, it switched to “Unavailable.”

Today, I reached out to Audible support, and their story is that the book was moved to Plus Catalog. By moving it to Plus Catalog, they also got to remove it from my library.

If I want to listen to it, I’m going to have to buy it again.

Thieves.

That’s how I reconcile their web page saying:

Can I keep titles marked as “Buy for $0.00”?

Yes. When you select Buy for $0.00, the title is yours to keep forever.

versus their customer support rep telling me that they have moved the title to another category, and I’ll have to purchase it again if I want to listen to it again.

And now, what is particularly Orwellian, is that within the the Audible web page of my list of titles I own, The New Confessions of an Economic Hit Man has disappeared. I foolishly didn’t take a screenshot of it in there before reaching out to Audible support. But when I did the chat session with the Audible customer support rep, he went ahead and updated my account to make it align with Big Brother’s view. I asked him about that, and he blamed it on automated systems.

Either way, I cancelled my membership. Why would I continue to do business with a company that abuses me by taking my money and then deciding they can change the deal?

pfSense 24.11 is not good

I had purchased the Netgate 3100 from the company because I thought that would get me the best compatibility and support. Well, an update was made available: 24.11-RELEASE (arm) and I made the mistake of applying it six days ago. My whole router/firewall has crashed thrice since then.

I’ve been pretty unhappy with Netgate for a while now, so a couple of days ago I pulled the trigger on purchasing a Protectli Vault V1210 Mini PC. I’ll install OPNsense on it and duplicate what I have in the Netgate. Then the Netgate 3100 will go to the landfill.

When I bought the Netgate appliance, I didn’t know about the shenanigans the Netgate owners were doing with their staff. I wish I had known that; I would have started with something other than Netgate.

In the Make Orwell Fiction Again category, I remember reading several articles about how the Netgate owners screwed a former employee, and it ended up in lawsuits. Those stories have now been memory holed. Sigh.

Later, I found a definite bug in their SMTP over TLS implementation, in the initialization routine. Mind you, I’ve been doing SMTP for more than twenty years. I know how to do SMTP via telnet, and can do really low-level commands with it. Everyone with that particular version of pfSense would be affected by not being able to do SMTP over TLS to an outside mail server because of this initialization bug.

I wrote up the bug with the steps to duplicate it, and I tried to submit it to Netgate technical support.

Their answer was “You don’t have a current support contract. Buy a support contract, and we’ll work on it.”

I am not paying you to fix your shit. You should be paying me for so clearly identifying where your software fell down.1 The pfSense user interface under System > Advanced > Notifications has a checkbox to Enable SMTP over SSL/TLS. This should work, and it did not. I went through the steps at the command line level, and everything was there and workable. The certificates validated, and email flowed like it should – if I did it manually.

That they wanted me to pay them to fix their broken software is galling.

I do miss the days of Novell, where their published policy was “Yes, you need to pay to open a support ticket, but if this turns out to be our bug and not something you could have fixed on your own by RTFM2, then we will refund you your money.” I think in the twenty years I was a GroupWise admin, almost every support ticket I opened with them ended up being zero cost for us. Once, the support technician said that yes, they had already known about the bug, but the Technical Information Document (TID) was only a day away from being published. Heh. If I’d waited a day, I could have RTFM’d the TID and not bothered with opening a ticket. Yes, he refunded us the support ticket cost. Sure enough, the next day the TID was published, with exactly the same steps the support technician walked me through to solve the problem.

  1. I’m pretty sure it was an extra carriage-return character when calling OpenSSL. ↩︎
  2. The Novell folk were always nice and polite, so in this case it is Friendly manual ↩︎

Jay Leno joke, today not funny

One of my favorite Jay Leno jokes revolves around Congress taking its annual recess. After they would do so, Jay would say “Congress has just begun its summer recess; the realm is safe, once again.”

It is quite funny, because it says Congress does more harm by being in session than not.

Today, however, with Speaker Johnson calling for a recess to avoid a vote on H.R. 581, tweaks the joke in a horrific way:

“Congress has just begun its 2025 summer recess; the pedophiles are safe, once again.”

I’ll note that my Congressman Vince Fong did not vote in favor of H.R. 185, nor has his office replied to my email and request for response.

I just sent a letter to my Congressman

Honorable Vince Fong,

I request that you support House Resolution 185 to advance responsible policies. This bill may also be known as the “Epstein Files Transparency Act”.

I am certain that you understand that the damage done to children who are raped is profound and lasts a lifetime. You seem to be someone of good character, so I think that you might agree that no amount of “the ends justify the means” can excuse away the horrific acts by Jeffrey Epstein, his clients, and collaborators. As someone who believes in the rule of law and the fundamental advantage that the USA has because our judicial system is not easily bought off, these perpetrators need to be brought to justice as proof that the system still works. I request that you publicly support this bill, that you vote in favor of this bill, and support your other members of Congress who also support this bill.

Thank you for your time and attention to this.

David Gerisch


That’s the letter I sent, via https://fong.house.gov/contact

One of the interesting things I’ve read was a question put to people who had experience in both the USA and in other countries. The question was “What is the biggest difference between your home country and the USA?” The answer was that the USA follows the rule of law more than other countries do. Here in the USA, we simply assume that the judiciary cannot be bought, and that is mostly true. In many other countries, it is far less true than what we have here in the USA. Someone cannot cheat their neighbor out of property or money and simply expect that a large bribe will make the judicial problem disappear. That doesn’t happen here (mostly), and if someone tried it, the newspapers, radio, and television would have a grand old time running the story. This is the primary reason I never want to see government subsidies for mass media: once the newspapers / radio / television got hooked on that government subsidy money, they’d be thrall.

Quarterly inventory – 2025 Q2

Dear FutureMe,

Today would be a good day to do a quarterly inventory.

How is your personal life going?

How is your work life going?

How is your Volunteer Service life going?

Future Me

Personal Life

I’m in a little bit better mood this quarter, mostly due to taking on another Volunteer Service position, and listening to a book. I did have a lot of fun with MPD (Music Player Demon), although that went pear-shaped more recently.

Home Air Conditioning

When I was in my 20’s, I lived in a place that had only a swamp cooler. Augusts, here in the Central San Joaquin Valley desert, will often get to 110 °F (43 °C). With only a swamp cooler, that was not fun. Now that I’m in my 60’s, I want refrigeration. Seriously.

Although I have the pieces for a sun shade for my western facing glass door, I haven’t made any progress on building it. My air conditioning unit is doing poorly, too, so that is a bummer. Back in December, Grant’s Air Conditioning replaced the control board (computer). This new one appears to have a setting where if the desired temperature cannot be met after some period of time, it goes into failure mode. It will kick the refrigeration compressor on for ten seconds, and then stop. It tries that every five minutes. Meanwhile, inside the home, the internal temperature keeps rising. Eventually, the outside cools off enough to where the differential is back within range, and full cooling begins again.

Okay: a backstory. Back in February, Grant’s Air Conditioning replaced a huge capacitor. I think its job is to jump-start the blower. The thing is almost the size of my fist. Also, a while ago before, I started having weird electrical problems in the house. My UPS (uninterruptible power supply / battery backup) in my master bedroom started kicking on, and reporting out-of-bounds power levels from street power.

My theory is that something in the blower has changed, and this jump-start capacitor is draining to zero as it jump-starts the blower. It uses so much power in this process that my UPS detects the out-of-bound condition, and kicks in to protect my gear. Or in the other direction, it pulls so much power to recharge, that there’s a spike when it finally fills up. Either power overload or underload happens, and the UPS kicks in. I hear it clicking and the front-panel displays an error condition.

The first time I started seeing this UPS behavior was during the winter. Then in February, the air conditioning / heating unit failed, and Grant’s came out and fixed the capacitor.

About two months ago, the UPS started acting funny again. The air conditioning also started the failure mode where it only runs the refrigeration for ten seconds and quits. I had to run off to a meeting, so in desperation I forced the blower into always on mode, and left. By the time I got back, the refrigeration was back on. I left the blower in always on mode.

Days later, I notice that the UPS events have stopped. The blower has been running for a couple of months now. If the blower doesn’t need to be jump-started, the capacitor doesn’t get energized (it seems to me).

That was a long story about my fear that my air conditioning unit is going to need major service to repair / replace the blower. If not that, another $240 for another capacitor that won’t last very long.

Food and food costs

Inflation is always bad, and this time is no different. I very much need to avoid eating out at fast-food or restaurants; my financial advisor would like me to have $25,000 in the bank when I retire. I’m at around half that, and I hope to retire in twelve and a half months. There for a while, I was cooking / heating frozen pizzas, but I was clearly gaining weight. So then I switched to breaded chicken fillets from the delicatessen portion of Winco (the best grocery store we have). But the price of those has been going up too, and, they seem to make me really drowsy on my lunch break. I suspect there is too much deep-fat fried breading on them. I wasn’t gaining weight with them, but I wasn’t losing any either.

Now I’m trying frozen burritos, although they don’t digest as well as the breaded chicken fillets. My preference would be to buy steak. But I remember when New York Strips were $6 per pound, and at $15 per pound now, I’m out.

I’ve had to add more fast-food stores to my boycott list due to inflation. There is no way I can justify going to them anymore. I was bummed that the one place (which has high-quality tacos) has been losing customers, and last night when I drove by to check on their Sunday Taco Special, they’d raised the price a dollar. Long term, I expect they will go out of business.

Other personal life items

I still need to redo my personal mail server. This is yet-another task that would be fun if I had a week to do it. For the Juneteenth holiday and the use-it-or-lose-it-Personal-Holiday-Allowance Friday, I did have four days in a row available. However, I was working on my MPD project, and it didn’t go well.

MPD project (Music Player Demon)

One thing that was super fun was buying a Raspberry Pi Zero and adding a HiFi Berry DAC Zero, and configuring it. It went about as beautiful as it could. Now, in my Work-From-Home office, I don’t need a laptop running Snapcast client; I’ve got this hooked into my receiver instead:

Pictured here is a disassembled Raspberry Pi Zero and a HiFi Berry DAC Zero, in addition to the powered on unit in production. The Raspberry Pi Zero is about two keys wide and four keys long if laid on the numeric keypad of your full-size keyboard. I was happy enough with the streaming audio sink that I bought two more kits; the unassembled pieces shown are from those kits.

I tried writing Perl code to manage MPD using AI. On the one hand, it didn’t take very long at all to crank out 7,000 lines of Perl, which mostly did do what I wanted. But it wasn’t fully what I wanted. Looking at the code, I got the idea that it was putting too much into one branch of one loop, and that trying to break it into more logical pieces was the right thing to do. I went back to manual mode, and have made a mess of it. Sure, my various functions are in more logical places, but the differences between what I think I want versus what I write make it slow-going. I also managed to clobber previously set alarms, so I’m actually worse off now than before. Oof.

Listening to a book: Catch-22

I subscribe to a couple of journalists who do a weekly show with an hour and a half of current events and half an hour on a book they are reading. They’ll propose a book to each other, and if the other hasn’t read it, that will become the book. A couple of weeks ago, one of them said that Catch-22 by Joseph Heller was the funniest book written in the last 80 years. Maybe he said “one of the …” but either way it was high praise.

I went ahead and paid Audible.com for a copy. Yes, this book is terribly funny.

I remembered a moment from 45 years ago, when my best friend Craig had told me he’d just read the funniest book ever, Catch-22, and that I should read it. I wasn’t fond of the idea because what I knew about the term Catch-22 was that it is always a “lose-lose” situation. Looking back, I suppose my thinking was that was the book would inure me, and that I’d become more accepting of Catch-22 situations. For whatever reason, I took a pass, and didn’t read the book. Here, 45 years later, this book does make me smirk a lot. I don’t regret not reading it 45 years ago, but I think I would have enjoyed it back then too. I don’t know, though: back then I was in high-school, and hadn’t experienced a lot of bureaucracy. Today I have 35 years of that in my history, so maybe I can laugh easier about it now.

Work Life

If $18,000 fell out of the sky and into my lap, I would retire tomorrow.

I’m counting down: twelve months (plus a few weeks) to go.

One of my co-workers died. I’d been working with him for more than twenty years. I had tried to let him know that my life got vastly better when I stopped drinking alcohol; but, he didn’t want to hear it. I know that if someone doesn’t want to stop, there is no way to convince him or her otherwise – and attempting to do so anyway causes the alcoholic to dig their heels in deeper. Rest in peace, Joe.

Volunteer Service Life

I did add one more service commitment this quarter: two times a month, I’m with other members in a meeting in our newest homeless shelter. It’s an interesting place: they have a dog kennel. Many people who have been long-term homeless have only one companion: their dog. So if they have to choose between a shelter that doesn’t allow pets, versus remaining homeless, they’ll stay homeless. This newest homeless shelter solves that problem by building in a dog kennel and a bicycle lockup, so that people who do get a bicycle don’t get it stolen.

Streaming audio server with a Raspberry Pi 5 and Mopidy – Never Mind

Well, this is a bummer. The Iris interface on Mopidy is nice, and when I’m doing everything manually, it works fine. BUT, I wanted to do things with scripting. I can somewhat get things to work, but not reliably. So I’m going to give up on Mopidy and go back to MPD (Music Player Demon).

I’d managed to build a little routine that, once an hour, generates a sound file with the current time in it. I copied it to the right place, updated the file cache so that the new file is the current one, and then threw (using CURL) the command to add the file to the Mopidy queue. For testing, I had cron run it every two minutes.

# Add the current_time.mp3 file to the queue

/usr/bin/curl -s -X POST "$MOPIDY_URL" \
-H "Content-Type: application/json" \
-d '{
"method": "core.tracklist.add",
"params": {
"uris": ["'"$FILE_URI"'"],
"at_position": 1
},
"id": 1,
"jsonrpc": "2.0"
}'

But, if the queue is empty, Mopidy isn’t going to play anything. So then I had to add:

# Start playback

/usr/bin/curl -s -X POST "$MOPIDY_URL" \
-H "Content-Type: application/json" \
-d '{
"method": "core.playback.play",
"id": 2,
"jsonrpc": "2.0"
}'

And now I’ve three problems.

The first is that there is a weird loop problem where once: the file plays correctly. I’ll hear “The current time is 16:40.” The next time the cron job runs the bash script, I’ll hear “The current time is 16:42. The current time is 16:42.” The third time it runs, I’ll hear “The current time is 16:44. The current time is 16:44. The curren” and the playback is interrupted.

It is always in triples; 16:46 would play fine, 16:48 would play twice, and 16:50 would attempt to play three times but get cut off.

So that is one problem. The next is that I prefer to do my scripting in Perl, and I know that Perl has been doing JSON-RPC for a really long time now. But the Perl script I wrote doesn’t seem to be connecting to the Mopidy server. It tells me that it connected, and shows me a result (instead of a refusal to connect), but the Mopidy debug log does not acknowledge that a connection was made.

The third is that even when I add a song manually using the Iris interface, that “core.playback.play” method would break the playback of the currently playing song. The idea was that if I only create a current_time.mp3 file at the top of the hour, and add it to the queue, then within a few minutes, I’ll hear was hour it is. But now I’ve got the worst of both worlds: if the queue was empty, no playback of the current_time.mp3, but if I trigger the playback, the current song gets clobbered. Sigh.

I really liked that Mopidy has the nice Iris web client; but, if the only way to interact with the server is via mouse and keyboard, well then I’m out.

Streaming audio server with a Raspberry Pi 5 and Mopidy

My first attempt at an MPD streaming box was a tough config, because I was learning along the way, hitting every stumbling block there is. Getting the Music Player Demon running wasn’t terrible, but getting my various client machines to listen to the streaming server was tough. Okay, I am going to try again, and hopefully, it actually works with Mopidy this time.

The Iris plugin to Mopidy is nice. Previously I used Cantata, which was fine, but it was a local install on each machine. Iris is good because it runs on the server, and I don’t need to do a local install on each machine just to control the music stream.

On to the build!


I used the Raspberry Pi Imager program to put the Raspberry Pi OS Lite (64-bit) on the SD card. Then I booted the device, ssh’d in and ran

sudo apt update

followed by

sudo apt upgrade -y

followed by a sudo reboot now

sudo raspi-config

I’m changing the hostname. Also, because I prefer vim to nano:

sudo apt install vim -y
sudo update-alternatives --config editor

And of course, now I get to install my favorite aliases and history search keystrokes. These are detailed here.

Next, I’m going to follow the instructions at Mopidy Installation

I am following the section Install from apt.mopidy.com:

sudo mkdir -p /etc/apt/keyrings
sudo wget -q -O /etc/apt/keyrings/mopidy-archive-keyring.gpg https://apt.mopidy.com/mopidy.gpg
sudo wget -q -O /etc/apt/sources.list.d/mopidy.list https://apt.mopidy.com/bookworm.list

So one difference is that the instructions say to wget from https://apt.mopidy.com/bullseye.list but this version of Debian on the Raspberry Pi is bookworm (Debian 12 instead of 11). We’ll find out if I just shot myself in the foot. 😉

sudo apt update
sudo apt install mopidy -y
sudo apt install mopidy-mpd -y
sudo apt install mopidy-local -y
sudo apt install snapserver snapclient -y
sudo apt install python3-pip -y
sudo python3 -m pip install Mopidy-Iris --break-system-packages

The instructions I found say to simply do sudo python3 -m pip install Mopidy-Iris but Debian (or perhaps it is Python) barks at me with “error: externally-managed-environment – This environment is externally managed” and some potential way around the problem. That’s a nope: I want to run as a systemd service, and isolating stuff into unreachable environments is not the battle I wish to fight today.

And another thing: the Snapcast instructions assume that Snapweb is installed, but it never is. First, I downloaded it from https://github.com/badaix/snapweb/releases and picked the file snapweb.zip

As of 2025-07-19 one could use this curl command:

wget https://github.com/badaix/snapweb/releases/download/v0.9.0/snapweb.zip

Then I copied it to the Mopidy server, and did this:

sudo mkdir -p /usr/share/snapweb
sudo unzip snapweb.zip -d /usr/share/snapweb

Okay, I’m almost ready to start configuring things.

Later on down the line, the mopidy.conf file will consider that the files to serve up are at a certain location. What location? Here’s how to find out:

sudo mopidyctl config

and look in the [local] section for media_dir = /var/lib/mopidy/media

Now would be a great time to mount my music files via a CIFS / SMB share:

sudo apt install cifs-utils -y
touch /root/credentials.smb
vim /root/credentials.smb
username=epstein_did_not_kill_himself
password=Apparently-Child-Rape-Is-Okay-If-The-Deep-State-Does-It,-Because-With-The-Deep-State,-The-Ends-(Blackmail)-Justify-The-Means-(Child-Rape).--Everyone-Who-Is-Human-Recognizes-The-Evil,-But-The-People-Who-Make-Up-The-Deep-State-Are-Sociopaths.--Unfortunately,-The-People-In-The-Current-Administration-Who-Promised-To-Drain-The-Swamp-Have-Been-Broken,-Most-Likely-With-Threats-To-Their-Family.--What-A-World,-Amirite?
sudo chmod 600 /root/credentials.smb

Then we can edit /etc/fstab

//hostname/smbsharename/data /var/lib/mopidy/media cifs vers=3.0,credentials=/root/credentials.smb,_netdev,iocharset=utf8 0 0

I’m also going to try to keep from wearing out the SD card so quickly, so I’ll try this:

tmpfs   /var/cache/mopidy   tmpfs   size=1G,mode=1777   0 0

I rebooted, because I wanted the fstab to be read and /var/lib/mopidy/media to be mounted.

Okay, things I’ve added in /etc/mopidy/mopidy.conf :

[http]
hostname = ::

[mpd]
hostname = ::

This was previously hostname = 127.0.0.1

I changed to listen on all interfaces (that’s what :: does) because I do want any of my machines on my local network to be able to interact with the Mopidy server. Note that I am planning on never putting this box on the public Internet.

There is another change I made in /etc/mopidy/mopidy.conf :


output = audioresample ! audioconvert ! audio/x-raw,rate=48000,channels=2,format=S16LE ! wavenc ! filesink location=/tmp/snapfifo

Then I get to edit /etc/snapserver.conf:

sudo vim /etc/snapserver.conf
source = pipe:///tmp/snapfifo?name=Mopidy

I’m going to try to make sure Snapcast loads first, before Mopidy, because Snapcast needs to be writing into /tmp/snapfifo before Mopidy starts reading it.

sudo systemctl edit mopidy.service
[Unit]
After=snapserver.service
Requires=snapserver.service

To configure the Snapweb server:

sudo vim /etc/snapserver.conf

Find the line #doc_root = /usr/share/snapserver/snapweb and change it to:

doc_root = /usr/share/snapweb

And I think I am at the moment of truth:

sudo systemctl enable snapserver.service
sudo systemctl enable mopidy.service

sudo systemctl restart snapserver.service
sudo systemctl restart mopidy.service

If things are looking correctly, my next step is….

sudo mopidyctl local scan

Well, it almost worked right on the first try. I also needed to do this:

echo "fs.protected_fifos = 0" | sudo tee /etc/sysctl.d/snapcast-unprotect-fifo.conf
sudo sysctl --system

Hooray! My streaming music server is up and running within my local network. This was fun. 🙂