Kaweah Delta care (in general) has been good

Yes, my mom’s experience in the Kaweah Delta emergency waiting room was deplorable. But I recognize that if the only thing you, dear reader, had ever heard about Kaweah Delta District Hospital was that post – you might get the idea that Kaweah Delta was (in general) not good. I want to dispel that idea.

Once my mom did get into a hospital room, the care there has been good. Very good, I would say.

Her nurses and physicians and other staff have been attentive, timely, and professional.

Myself, I’ve had two experiences with KDDH in the last five years: both were of high quality.

I didn’t need emergency care in those situations, so I didn’t have to go through the emergency room waiting room process.

One mild snark though, about the emergency room waiting room. One has a lot of time to be observant over the course of sitting in the waiting room for seven hours (my experience, not my mom’s).

They have digital signage (big television sets) mounted on the wall, playing a loop of various public announcements, advertising of new clinics that have started up, a new doctor accepting patients, etc.

There’s a video interview of two of the hospital bigwigs by Stefani Booroojian1. Anyway, the video is captioned, but the transcriber missed a word. The doctor is talking about keeping healthy, and says it is very important to do smoking cessation. The transcriber wrote that it is very important to do smoking sensation. Not the same thing. 😉

Somebody probably ought to have caught that in the first week, so that the original content creator still had the file around and could re-do that little bit of the caption.

  1. Oh my goodness, she’s been with Channel 24 news for 40 years! She still looks great. Good on her. ↩︎

Terrible experience at Kaweah Health hospital

My mom went to Urgent Care, and they put her into an ambulance and sent her to Kaweah Health hospital. My mom spent 25.5 hours in the emergency room waiting room before getting a room / bed.

This is disgraceful.

Mom showed up at KDDH1 at 2024-04-19 1400

The urgent care people had told the ambulance people to give her some saline because of severe dehydration (because of three days of vomiting and diarrhea). That was the last liquid she got until 2024-04-20 1700.

The doctor who saw her during the initial contact said they needed to do a CAT scan to find out what was the source of intense pain in her abdomen. She finally got that CAT scan at 2024-04-20 0540.

My mom was concerned that she would need emergency surgery for gall bladder removal because her mom had had to go through that. I should probably mention that my mom is 86 years old, and although her mind is clear with no signs of dementia, her body is getting frail, and in the dehydrated state, she is pretty wobbly. The idea of being 86 years old and having to go under the knife scares her.

The night shift doctor finally did get to interview her at 2024-04-20 0715; the CAT scan revealed that it was an inflamed colon – not gall bladder. Thank goodness. Apparently, an antibiotic my mom took a month ago also affected her biome in her colon, and something in there took hold and created an infection.

The doctor was a nice young man, but he did mention that he was at the end of his shift. He said they would admit her, but there weren’t any rooms available: it might be a couple of hours. My mom then sat in the emergency room waiting room for another seven hours. Eventually, my mom got worried that they had lost track of her (she was on the third shift of administrative and nursing staff in the waiting room), so she hobbled up to the front, and when the nurse asked her what was wrong, she burst into tears. She’d been there more than 24 hours, and she was afraid they’d lost track of her. That was shortly after 3:15 PM. The nurse did promptly get her a room.

When I visited her a little before 1700 (5 PM), she still hadn’t slept since the morning of the day before, but finally a nurse did cover her feet with a blanket. My mom has poor blood circulation, so her feet felt cold, and it stressed her out so she couldn’t sleep. The other problem is that the diarrhea continues, so every few hours she needs to get help to climb out of bed to get to the toilet.

I had shown up a little before midnight on the 19th, and relieved Frank from sitting with my mom. About 2 AM, it dawned on me that the CAT scan wasn’t going to happen until the morning shift showed up to work. I don’t know why the CAT scan wasn’t done between 2 PM and end-of-shift on the 19th.

I also don’t know why, when the overnight doctor went off shift, that the emergency room staff don’t seem to have a process for hand-off or review of who needs care. When my mom screwed up enough courage to ask the nurse at 3:15 PM, they immediately found her a room. The room was available. Why isn’t there a process for informing the emergency room when rooms become available? Instead, little old ladies have to tell the nurse that there’s a problem, and then they act. That’s the opposite of the way I would expect medical care to work.

I know that doctors hate it when their patients try to self-diagnose and then direct the doctor on how to provide care. Yet, here was a situation where a little old lady had to force the situation, twenty-five and a half hours after being delivered in an ambulance.

It’s just terrible.

  1. KDDH was the original name: Kaweah Delta District Hospital. Everyone around here still calls it that. They even had that coveted four character domain name: kddh.org – I will rant about the idiocy of changing the company name later ↩︎

Bulk change MP3 file genre

I reset my playlists in Nextcloud. During the rescan, as it imported them, the Music app sorted them into their genre. This might be useful. But one author’s genre was Folk, and really, I’d prefer if it were Instrumental.

I tried changing them from the command line, but id3tools trashed the tags. Really, it was a problem with UTF-8 versus something else. All I really know is that when Nextcloud scanned the files, it got Chinese characters instead of anything useful.

Turns out, I used kid3 and EasyTAG to solve the bulk search and replace problem. Why both? Because kid3 let me see what I wanted to change, but EasyTAG would let me (bulk) change them.

kid3 let me change tags just fine. The problem is: only one file at a time.

The kid3 interface is rather nice, otherwise. If I hit Ctrl-A, it selects all and reads all the files and all the tags. I had added Genre to this list of columns at the top, so then I could sort on that.

EasyTAG wouldn’t let me change the main page displayed columns, so that was less-than-ideal. But, it does have a Find feature, and everything I selected in the Find window remained selected in the main window.

What EasyTAG has (which is great) is in the genre field for any song, there are two buttons: a drop-down to select which genre, and an Apply All button for everything selected. Excellent! Apply All is precisely what I wanted.

Also, it turns out that if the predefined list of genres doesn’t match what I want, I can just type in my choice. The Apply All button still works for something I typed. EasyTAG didn’t have a Flamenco genre, but I have 85 Flamenco guitar files. That I can type my own genre makes this a trivial problem.

So after doing an Apply All in EasyTAG, I’d go back to kid3 and do a reload, followed by another Ctrl-A. Then I sorted by (whatever). I’d find something that matched all the songs I wanted to alter, and copy that to the clipboard. Then I’d switch to EasyTAG, unselect all, and go into the Find screen, and paste in the identifier and search I’d select all in the find window, and close the find window. Then I changed the genre and hit Apply All in the EasyTAG main window.

I think I re-tagged close to 800 songs in about fifteen minutes. Woo! Now, the bulk of my music files are in eleven genres, which becomes a playlist without the manual playlist editing. There are 331 songs in the Instrumental genre list. I would have so hated having to manually make a change 331 times.

Quarterly Inventory 2024 – Q1

Dear FutureMe,

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

Question: How is your personal life going?

Question: How is your work life going?

Question: How is your volunteer service life going?

Personal Life

There hasn’t really been much change this quarter in my personal life.

I went to the Southern California Linux Expo (SCaLE 21X), but regret it because it was so much money. Previous SCaLE events were at the LAX Hilton, which is half the price of the Pasadena Hilton. The trade-off is that the LAX Hilton has only about five restaurants nearby, so if 400 people break for lunch, those five restaurants are absolutely swamped. If 400 people break for lunch at the convention center in Pasadena, there are probably 30 restaurants within a ten-minute walk nearby. But $400 per night for this show really isn’t worth it to me. If I had stayed three nights for the full four-day show, that would have been $1,200. ACK! For that kind of money, I could pay down my mortgage one month and retire a whole month early. Really, SCaLE is a wonderful show if you already live in Los Angeles and don’t have to spend money at the Pasadena Hilton.

Had my ten-year colonoscopy. Zero polyps found; I get to come back in five years because of my age.

I went to a Jack-In-The-Box restaurant a couple of months ago. Lunch was $20. I suspect this was my last visit to a fast food restaurant ever 1 (well, in California, at least). Sacramento decreed that fast-food workers should get, beginning today, a minimum wage of $20 per hour (as if fast-food workers would make it a career). The result is that Sacramento has completely priced these stores out of business due to inflation (unless they replace the workers with robots).

2024 New Year’s Resolution: go to the gym more often. Resolution failed: I suspended my gym membership. $60 a month is too much (yes, inflation).

One really fun thing for me is that I bought another Tiny PC and put 32 GB of RAM in it, and I am running Proxmox on it. This lets duplicate all the steps I will go through to migrate the website (item (5) in the volunteer service list below) from Amazon to Linode. If I bungle a step, I revert the snapshot and try again. Even better, I can document about how I did the migration to my blog. I did have DNS pointing to this home device, which (via pfSense) did actually route the public Internet to this little host. I’ve since turned this off, but will turn it on again when it comes time to demo the new website.

Work Life

If $44,000 dropped into my lap today, I would retire tomorrow.

I have little to do except e-discovery and email retention policy work. We had a good system where clients would work through legal counsel before opening an email investigation; but, our new(er) management wants to bend over backwards to be helpful. That is a nice sentiment, but the previous practice protected us from liability – only the people with legal training made judgement calls. Now, I have people asking me to find “inappropriate” email, as if I know what the hell that means in a legal context. Sometimes I hate my job.

I did take on printers and the print server. I did build the replacement server and migrated over; that went really well.

The other big project is to check 5 million email that are about to be deleted: are they supposed to be deleted? There’s no way that my direct report and I can read all five million email and verify them all. So, we’re spot-checking. I probably will read about 12,000 email before we can confidently pull the trigger on the deletion process.

Volunteer Service Life

I counted up all the current service commitments I have, and it numbers sixteen at the moment.

  1. Sundays: treasurer of a weekly meeting.
  2. Sundays: Technology captain of a weekly meeting (I run the Zoom camera, speakerphone, and laptop).
  3. Second Sunday: audio recording and posting the recording to our .org website of the second Sunday speaker breakfast monthly meeting.
  4. Tuesdays: Secretary of a weekly meeting.
  5. Second Tuesday: web servant for our little 501(c)(3) central office.
  6. Second Tuesday: liaison to our district (complement of item (10) below).
  7. Second Tuesday: president of the board of our little 501(c)(3) central office.
  8. Last Tuesday: member of a monthly technology sharing session (I presented last month). Nicely enough, this is on Zoom, and happens from 16:00–17:30 which allows me enough time to be secretary at 19:00 (item (4) above).
  9. First Wednesday: Recording secretary, monthly district meeting.
  10. First Wednesday: liaison to our little central office monthly meeting (complement of item (6) above).
  11. Every other Wednesday: co-chair of the Founder’s Day Picnic; as such, I am on the planning committee. I set up the laptop, camera, and speakerphone for Zoom participants. Created two documents, but have a third pending. The other chair has been in Europe, so as far as I can tell, I’m the only one who has done anything.
  12. Thursdays: meet with my sponsee weekly.
  13. Thursdays: treasurer of a weekly meeting. Also, supplies.
  14. Fridays: literature captain of a weekly meeting.
  15. First Saturday: member of a temporary contact committee (meets monthly), and have begun outreach to a local institution.
  16. First Wednesdays (until this weekend): stage manager for our twice yearly dinner and a speaker event.

  1. Edit: this is almost certainly an overstatement. I still like Panda Express, and it hasn’t raised prices ridiculously, but it does qualify as a fast food restaurant. ↩︎

WordPress migration notes, part 2

One problem is that I need to install WP-CLI on the new server, and dealing with it is not easy.

The installation instructions don’t say one way or another, but WP-CLI should not be installed as root. Later, if you go to run it as root, it will bark at you that you’re doing a bad thing. Okay, nice to know.

But we do now have the problem that the user who runs WordPress (well, Apache, which runs the PHP code that is WordPress) is the www-data user. I cannot log in as the www-data user, by design (it is a good design). So, how to run this WP-CLI stuff?

sudo -u www-data wp <command>

Okay, this says to switch to user www-data (sudo = switch user and do) (the -u option specifies which user, in this case www-data), and run the wp binary and any command line options you want it (wp) to do.

Cool, but the user I’m logged in as has no idea of where the WordPress installation is. So now, every freaking command I have to type, sudo -u www-data wp <command>, also needs --path=/var/www/html/wordpress in there too.

This sucks.

There is supposed to be a file, wp-cli.local.yml, that I can put the path into. But that file is in my directory, and the sudo command switches away from that.

This sucks, still.

The www-data user does have a home directory; but, it won’t ever be used because the account runs /usr/sbin/nologin on every access. That is secure, but it doesn’t help me from having to type sudo -u www-data wp --path=/var/www/html/wordpress<command> every freaking time I need to do something.

Also, I am a fan of using the page-up key to search my bash history. That works great when I type a few letters, say gre and hit PgUp to search through my last few grep commands. Do I need to reassign ownership of files I’ve added to /var/www/html/wordpress/ ? chow and PgUp, and in a keystroke or two, I’ve got chown -R www-data:www-data /var/www/html/wordpress/ ready to run. Ditto the Apache2 enable and disable site commands. There are a ton of examples where just a few keystrokes and the PgUp key are great.

But having to type su and hitting PgUp presents me with a wall of noise, to finally find the command at the end that I actually want to repeat.

This sucks.

So, there is a solution. It seems kludgy, but it works, as long as you are willing to put up with its kludginess.

  1. cd to /var/www/html/wordpress/
  2. create a file, wp-cli.local.yml, in the location where WordPress is installed (where you just did the cd to), and inside it, put:
    • path: /var/www/html/wordpress

So, as long as you are already in the “right” place, and you have this file which points to your “right place”, you don’t have to specify the “right place” on the command-line of WP-CLI.

The other option is to be in my home directory, and do everything via bash scripts. I wanted to use the command-line, but I may need to put one more level of indirection in the process to get things to work easily. Like I said: kludge.

However, since the bash script has WPPATH="/var/www/html/wordpress" in it, all that sudo -u www-data nonsense goes away. Sure, I’m running it as some random user from some random location, but (I assume) that the WP-CLI people are just fine with that because if a random hacker gets into an ssh session on my box, I’m done for, anyway. Why not just assume whoever is running these commands is authorized?

This sucks quite a bit less, although it doesn’t make me warm and fuzzy about security.

WordPress migration notes

I have a production WordPress site on Amazon Lightsail that I need to migrate away from. These are notes on how to migrate over only the stuff I want to keep.

Backstory: Amazon Lightsail was very inexpensive, at under $5 per month for hosting on their smallest machine, and it did fine. Two things became problems, however:

  • Bitnami WordPress is super easy to spin up, and everything just works. But upgrading to a newer version of something (say PHP or MySQL or something) is a non-starter. The only way to upgrade is to spin up a new machine and do a migration to a new machine.
  • Amazon recently did a price increase. Now, I can get a Linode machine with double the RAM for only 27% more, and that will include backups.

Okay, so I need to migrate, but over the years, I’ve tried different plugins, and even though many of them were uninstalled, the installation routine left crap in the database. How to migrate to a new server, but leave behind the crap? This will be the topic of this post.

First, I installed WP-CLI, instructions can be found here.

Then, on the new machine, I installed only those Plugins which I know I need.

I took a snapshot backup at this point, simply because it seems prudent.

On the new machine, I logged in with ssh and ran this:

wp --path='/var/www/html/wordpress' db query "SHOW TABLES" --skip-column-names --allow-root

This gives me a list of the tables in the new machine that I want from the old machine.

+-----------------------+
| wp_commentmeta        |
| wp_comments           |
| wp_links              |
| wp_options            |
| wp_postmeta           |
| wp_posts              |
| wp_term_relationships |
| wp_term_taxonomy      |
| wp_termmeta           |
| wp_terms              |
| wp_usermeta           |
| wp_users              |
+-----------------------+

This is a pretty minimal list; the old machine has a list 362 tables long! Matomo was a particularly egregious offender here.

With this information, I can use a script written by Mike Andreasen over on the WP Bullet website to dump the databases on the old machine:

# set WP-CLI flags
WPFLAGS="--allow-root"

# define path to the database dumps without trailing slash
DBSTORE="/tmp"
# get the name of the database
DBNAME=$(wp config get DB_NAME ${WPFLAGS})

# list all of the tables regardless of database prefix
TABLELIST=(wp_posts wp_postmeta)

# create the temporary directory for storing the dumps
mkdir -p ${DBSTORE}/${DBNAME}

# loop through tables and export, log details to /tmp/mysqlexport-<database>.txt
for TABLE in ${TABLELIST[@]}
do
    # export the table
    wp db export ${DBSTORE}/${DBNAME}/${TABLE}.sql --tables=${TABLE} ${WPFLAGS} | tee /dev/stderr
done > /tmp/mysqlexport-${DBNAME}.txt

With this done, I scp the files from the old machine to my local machine. Then I scp them up to the new machine. The next script assumes they are in the sql directory in the wordpress folder.

I tried it, but I should have taken a snapshot, first. 😉

I need to search-and-replace all instances of the old domain name in the MySQL dump files, and put in the new domain name. Technically, once the actual switch happens, the new machine will be found at the old name, so this shouldn’t be necessary. But, the whole reason for migrating to a development machine is to test out this migration process. And the new machine does have a different domain name.

The script to upload the MySQL dumps looks like this:

# define WordPress path
WPPATH="/var/www/html/wordpress"

# loop through all of the 
for DUMP in /var/www/html/wordpress/sql/*.sql;
do
    wp db import ${DUMP} --allow-root --path=${WPPATH}
done

But, until the data is cleaned up, the new WordPress website gets the dreaded white-screen-of-death.

Abandoned OpenSuSE Tumbleweed for Leap 15.6 beta: much better

In a previous post, I said how I made a huge mistake by “upgrading” to a fresh installation of OpenSuSE Tumbleweed, which came with KDE 6 and Wayland. This broke the KDE window tiling, and every interaction I had with KDE reminded me of what a huge mistake I had made. I’ve re-installed a fresh OS install from Leap 15.6 beta, and everything is good, back to the way it was before.

Firefox did bark at me that my profile was newer than previous; I had to start it with firefox --allow-downgrade

Also, I lost all my Firefox multi-account containers I had set. Thankfully, I had a previous containers.json file lying around.

But yes, now, everything is working excellently. Well, I haven’t tried Factorio or YouTube videos yet: but the important stuff is working.

Previously, I’d moved off Leap to Tumbleweed because tesseract-ocr was too old. It looks like in Leap 15.6 beta that it is a pretty new version.

Reddit + Google partnership seems like a bad idea to me

Exclusive: Reddit in AI content licensing deal with Google

The problem is that (if you live in the USA) your and my tax dollars are spent by national security agencies polluting Reddit with content from sock-puppet accounts to promote certain agendas.

This means, that by design, Google will be training its AI on untrustworthy sources.

Nothing about this plan is wise.

I know that Google does plenty of stupid things accidentally, but this seems willfully stupid.

New OpenSuSE install – whoops, that was a mistake (no KDE tiling window manager) – HUGE mistake

OpenSuSE Tumbleweed was acting squirrelly, so I downloaded an ISO and installed the latest OS from scratch. That was a huge mistake. Now, sometimes my machine spontaneously reboots, and other times windows get blocked for keyboard input.

On the good side, getting back to a working production system was never easier: delete the HDMI sound card and sound works again, add the external repos and codecs, and YouTube works again, add tesseract-ocr and The GIMP, and I can do my web work again. Install my Epson printer, and I can print a document for an upcoming event I’m a volunteer for.

On the bad side, that brand-spanking-new install came with Wayland and KDE 6, which is so new that it doesn’t have automatic window tiling. I hate it.

Whining about a problem isn’t the same as proposing a fix, so here’s what I wish I could fix:

When a new window opens (and it is not a dialog box), re-tile everything on that screen so that everything that showed before, still shows, but the new thing too, takes half the screen. I use “focus follows mouse”, so it is infuriating that as I move my mouse toward the newly opened window, the window underneath activates focus and hides the new screen behind it because the window underneath is full screen. I wouldn’t mind so bad if my old keystrokes worked, and I could shove the full-screen to half-screen: but that doesn’t work either. The previous behavior, which is what I want, is that the previous full-screen window would automatically resize to the other half of the screen when a new window opens.

This weekend I went to the Southern California Linux Expo, and had thought someone might be able to guide me to a solution. Nope, the KDE guy was anti-helpful, pointing me to a non- KDE solution. Checking it out, it is not what I want. I just want the old KWin tiling script to work.

Self-will got me a brand-new OS installation that frustrates me. Yay. I should have just lived with the squirrelly behavior until I heard the “all-clear” signal from the OpenSuSE forums.