Archive for category PC Tweakage

Epson R380 Continuous Ink Supply: Tubing Failure

After 4.5 years, one of the silicone tubes on the Epson R380’s continuous ink supply system broke:

Epson R380 - broken CISS tube

Epson R380 – broken CISS tube

The yellow smudges in front of the tubing clamp and across the top suggest the total mess lying in wait between the cartridges. Donning my shop apron and wielding damp paper towels cleaned things up well enough.

I cut through all the tubes a few inches back from the clamp, pulled the stubs off the elbow connectors, reinstalled the fresh ends, and re-repaired the clamp with a new cable tie:

Epson R38 - CISS tubes

Epson R38 – CISS tubes

Although the failing yellow supply surely contributed to the problem, the printhead seems to be on its last legs after nearly nine years. IIRC, I got the printer for $15 after rebate, spent maybe four times that on CISS tanks, and perhaps $200 on good-quality ink in pint bottles, it doesn’t owe me much.

Maybe I shouldn’t buy ink in pint bottles any more.



Google Pixel XL: Google Play Services Phone Number Update

This notification appeared every day after I got my shiny-new / soon-to-be-obsolete Google Pixel XL:

Screenshot_20170906-085931 - Update Your Phone Number - detail

Screenshot_20170906-085931 – Update Your Phone Number – detail

Fast-forward through nearly a month of doing the obvious things to no avail:

  • Tap the notification to update my phone number
  • Update my phone number from Firefox on the Pixel
  • Update my phone number from Firefox on my desktop
  • Ditto, from Chromium
  • Just dismiss the notification, repeatedly
  • Change my phone number in various Google places
  • Ditto, in various ways

Searching on the obvious keywords provided very few hits and none with a resolution. I followed one suggestion to flush the Google Play and Google Play Services caches, to no visible effect.

So I started a chat with Google Support by coredumping the entire list of Things Already Tried. After ten minutes of pleasantries, mostly spent idling while Holmes (great name for a tech support guy) read my coredump (and, most likely, timeshared a dozen other support chats), this transpired:

11:36:01​ ​ Holmes:​ ​ I ​ ​ see​ ​ that​ ​ you’ve​ ​ tried​ ​ almost​ ​ all​ ​ the​ ​ things​ ​ to​ ​ get​ ​ rid​ ​ of​ ​ the​ ​ notification​ ​ for​ ​ Google​ ​ play services.
11:36:05​ ​ Holmes:​ ​ Is​ ​ that​ ​ right?
11:36:57​ ​ Ed​ ​ Nisley:​ ​ It’s​ ​ everything​ ​ I ​ ​ could​ ​ think​ ​ of,​ ​ plus​ ​ a ​ ​ bit​ ​ of​ ​ searching​ ​ the​ ​ usual​ ​ forums.​ ​ A ​ ​ few​ ​ other folks​ ​ have​ ​ the​ ​ same​ ​ problem,​ ​ but​ ​ none​ ​ have​ ​ a ​ ​ resolution.
11:38:04​ ​ Holmes:​ ​ Sure,​ ​ I ​ ​ understand​ ​ that.​ ​ Please​ ​ don’t​ ​ worry​ ​ at​ ​ all,​ ​ we’ve​ ​ a ​ ​ dedicated​ ​ team​ ​ of​ ​ experts​ ​ for Play​ ​ related​ ​ concern.​ ​ I’m​ ​ from​ ​ hardware​ ​ nexus​ ​ Support​ ​ team.
11:38:15​ ​ Holmes:​ ​ I’d​ ​ connect​ ​ you​ ​ directly​ ​ with​ ​ them.

I’ve never gotten to Level 2 that fast in my entire life!

Fifteen minutes later (again, mostly his reading & timesharing):

11:54:37​ ​ Calvin​ ​ S:​ ​ The​ ​ issue​ ​ might​ ​ be​ ​ due​ ​ to​ ​ some​ ​ residual​ ​ files​ ​ that​ ​ might​ ​ hinder​ ​ the​ ​ download​ ​ process.
Lets​ ​ try​ ​ to​ ​ clear​ ​ cache​ ​ of​ ​ Google​ ​ Play​ ​ Store,​ ​ to​ ​ see​ ​ if​ ​ the​ ​ issue​ ​ can​ ​ be​ ​ resolved.
11:55:06​ ​ Calvin​ ​ S:​ ​ I ​ ​ can​ ​ help​ ​ you​ ​ with​ ​ the​ ​ steps,​ ​ if​ ​ you​ ​ want​ ​ to.
11:55:10​ ​ Ed​ ​ Nisley:​ ​ As​ ​ I ​ ​ said​ ​ in​ ​ the​ ​ initial​ ​ description,​ ​ I’ve​ ​ already​ ​ done​ ​ that.
11:55:39​ ​ Calvin​ ​ S:​ ​ I ​ ​ appreciate​ ​ your​ ​ efforts​ ​ to​ ​ fix​ ​ this​ ​ issue.
11:56:08​ ​ Ed​ ​ Nisley:​ ​ Blew​ ​ away​ ​ all​ ​ the​ ​ caches​ ​ for​ ​ anything​ ​ to​ ​ do​ ​ with​ ​ Google​ ​ Play​ ​ anything!
11:56:20​ ​ Calvin​ ​ S:​ ​ Could​ ​ you​ ​ please​ ​ let​ ​ me​ ​ know,​ ​ what​ ​ all​ ​ troubleshooting​ ​ steps​ ​ you​ ​ have​ ​ tried?
11:57:05​ ​ Ed​ ​ Nisley:​ ​ Did​ ​ you​ ​ read​ ​ the​ ​ initial​ ​ description​ ​ I ​ ​ sent​ ​ to​ ​ start​ ​ this​ ​ chat?​ ​ Took​ ​ Holmes​ ​ five​ ​ minutes to​ ​ chew​ ​ through​ ​ it.
11:58:11​ ​ Calvin​ ​ S:​ ​ I ​ ​ see​ ​ that​ ​ you​ ​ have​ ​ cleared​ ​ cache​ ​ of​ ​ Play​ ​ services.
11:58:50​ ​ Calvin​ ​ S:​ ​ Let​ ​ us​ ​ uninstall​ ​ updates​ ​ for​ ​ the​ ​ Play​ ​ Store​ ​ app​ ​ Play​ ​ Store​ ​ and​ ​ Google​ ​ Play​ ​ Services.

At which point it became obvious I was going to spend the rest of the day dinking around:

12:00:58​ ​ Ed​ ​ Nisley:​ ​ Given​ ​ that​ ​ this​ ​ notification​ ​ appears​ ​ in​ ​ the​ ​ morning,​ ​ doing​ ​ this​ ​ step​ ​ by​ ​ step​ ​ will​ ​ take days.​ ​ Give​ ​ me​ ​ a ​ ​ list​ ​ of​ ​ everything​ ​ you​ ​ will​ ​ suggest​ ​ so​ ​ I ​ ​ can​ ​ do​ ​ it​ ​ without​ ​ wasting​ ​ hours​ ​ typing​ ​ at​ ​ you.
12:02:22​ ​ Calvin​ ​ S:​ ​ Respecting​ ​ your​ ​ time,​ ​ I’ll​ ​ follow​ ​ up​ ​ with​ ​ you​ ​ over​ ​ an​ ​ email​ ​ with​ ​ all​ ​ the​ ​ possible troubleshooting​ ​ steps.

The “troubleshooting steps” look like a generic list of progressively more desperate measures applicable to any mysterious Android problem:

Clear app data for the Play Store

Go to Settings > Apps.
Tap Google Play Store > Storage > Clear data > Ok.
At the top left, tap the Back arrow to go to the “App info” screen.
At the top right, tap More (3 dots) > Uninstall updates > Ok > Ok to restore the app to its factory version.
Note: The Play Store will update automatically within 48 hours. If “Uninstall updates” is dimmed, you can skip this step.
Note: If you’ve changed the Google Play Store app settings (content filters, password protection, etc.), you’ll need to set them up again.

Clear the app data of Google Play services

Warning: Clearing the app data of Google Play services can reset settings, affect app performance, and cause unpredictable behavior across the device.

Go to Settings > Apps or Application Manager.
At the top right, tap More (3 dots) > Show system apps (on Android versions lower than 6.0, go to All instead).
Tap Google Play services.
Note: If you don’t see “Google Play services,” check Show all system apps and make sure that both Google Play Framework and Google Play Services are enabled. ​​If they aren’t enabled, download the Google Play Service from Play Store.
Tap Storage > Clear cache.
Then tap Manage Space > Clear All Data > Ok.

After completing this step, you should check the settings on your apps to see if they’re still configured correctly.

Remove and re-add your Google Account

Note: This may reset settings and remove in-app content. However, your purchases and synced data (Gmail, Google contacts, etc.) are tied to your account and will be available after re-adding your account.

Go to Settings > Accounts > Google.
Tap the name of the account you wish to remove.
Important: Make sure you remember your account password. You’ll need it to sign back in to your account.
At the top right, tap More (3 dots) > Remove account > Remove account.
At the top left, tap the Back arrow > Add account > Google.
Sign in to your Google Account.

Uninstall and reinstall Play Store updates

Temporarily uninstalling updates to the Google Play Store app can help fix some issues.

To revert the Play Store app to the previous version:

Go to Settings.
Tap Apps or Application manager (depending on the device).
Tap Google Play Store (depending on the device, you may need to go to All).
Tap on the menu button, and then Uninstall updates.
If the Uninstall updates button isn’t available, skip the rest of this step and continue troubleshooting.
When prompted to change the Play Store app back to the factory version, tap OK.
Go back to the device’s home screen and relaunch the Play Store. Your Play Store app should update to the latest version within a few minutes.
If the Play Store app doesn’t update, tap on the menu button from within the app and go to Settings. Scroll down until you see Play Store Version. Tap on that to check for an update. If none is available, continue to the next step.

Uninstall updates for Google Play Services

Go to Settings.
Tap Apps or Application manager (depending on the device).
Tap Google Play Services (depending on the device, you may need to go to All).
Tap on the menu button, and then Uninstall updates.
If the Uninstall updates button isn’t available, skip the rest of this step and continue troubleshooting.
When prompted to change the Play Store app back to the factory version, tap OK.

Reset your device to factory settings

If you’d like help with resetting your device, contact us from another device and we’ll walk you through it.

To reset your device:

If you have an SD card, remove it to save the data on the card.
Reset your Android device to factory settings.
Sign in to your device with a Google Account that was signed in before the reset.
If you removed an SD card, reinsert it.

To reload your apps and data:

Open the Play Store app.
Tap the Menu (3 lines) > My apps & games > Library.
Next to the apps that you’d like to install, tap Install or Enable.

If the issue still persist after performing all the troubleshooting steps I request you to reply to this email with the screenshot.

As it turned out, blowing away “the app data of the Google Play services” did the trick; the notification Went Away and hasn’t returned.

I hope I never need that information again …



Optiplex 9010: Xsetwacom vs. Dual Monitors

Having replaced the Dell Optiplex 980 (running from an eBay NOS power supply) with an off-lease Optiplex 9010, I was mildly surprised to find two Displayport outputs from the built-in Intel graphics chipset. Not being a gamer, I don’t care much about graphic performance, but plugging two 2560×1440 monitors into the jacks and having them Just Work was delightful. Indeed, Dell even managed to fix work around the error in the U2711  firmware requiring me to power-cycle the damned thing before booting the PC; now I can just turn the PC on and It Just Works.

Mysteriously, the incantation required to limit the Wacom tablet to the left-hand landscape monitor now uses DP1 instead of HEAD-0:

xsetwacom --verbose set "Wacom Graphire3 6x8 stylus" MapToOutput "DP1"
xsetwacom --verbose set "Wacom Graphire3 6x8 eraser" MapToOutput "DP1"
#xsetwacom --verbose set "Wacom Graphire3 6x8 Pen stylus" MapToOutput "HEAD-0"
#xsetwacom --verbose set "Wacom Graphire3 6x8 Pen eraser" MapToOutput "HEAD-0"

I’ll leave the “HEAD-0 incantations as comments, so as to have a hint the next time …

Leave a comment

Optiplex 980 Power Supply: Capacitor FAIL

Came up from the Basement Laboratory to find my Dell Optiplex 980 PC had failed, with the power button and diagnostic 1 + 3 LEDs blinking amber.  They built it back in June 2010, so section 3 of the Dell reference applies, the power supply status LED on the back panel was off, and, going straight to the heart of matter, I popped the top, disconnected the internal power supply cables, and poked the power supply test button:

Optiplex 980 Power Supply - rear panel test button

Optiplex 980 Power Supply – rear panel test button

… and it’s dead.

Inside, the system board sports a Mini-ATX power supply connector:

Optiplex 980 - Mini-ATX power connector

Optiplex 980 – Mini-ATX power connector

I originally hoped to swap a supply from an Optiplex 755 (also in a Small Form Factor case) residing on the recycle heap, but it has an ordinary ATX connector:

Optiplex 755 - ATX power connector

Optiplex 755 – ATX power connector

So I moved the 980’s SSD and dual-Displayport video card into the 755, fired that devil up, and … it worked!

With my desktop back in action, albeit somewhat slower, I popped the dead supply’s case by violating the Warranty Void If This Label Removed sticker to unscrew the last screw:

Optiplex 980 Power Supply - overview

Optiplex 980 Power Supply – overview

Notice anything?

The electrolytic capacitors over on the left look like this:

Optiplex 980 - Good capacitor

Optiplex 980 – Good capacitor

The cluster of caps on the upper right have bulged pressure-relief lids, like this:

Optiplex 980 - Bulging capacitor 1

Optiplex 980 – Bulging capacitor 1

And this:

Optiplex 980 - Bulging capacitor 2

Optiplex 980 – Bulging capacitor 2

And this:

Optiplex 980 - Bulging capacitor 3

Optiplex 980 – Bulging capacitor 3

None had ruptured, but they’re obviously feeling a bit nauseous.

Given the 980’s mid-2010 manufacturing date, this probably isn’t capacitor plague, just simple overheating from operating in a dead-air zone amid all those heatsinks and wires. Some of the Usual Unnamed Sources suggest overheating the capacitors is how manufacturers ensure their hardware doesn’t last forever, without being obvious about planned obsolescence; I’m loathe to ascribe to malice what can be explained by design desperation.

A Genuine Dell replacement supply from eBay ($25 delivered) came from yet another “small form factor” Dell chassis, so it isn’t quite the same size, lacks a supply test button / LED status light, and doesn’t quite fit:

Optiplex 980 - replacement supply misfit

Optiplex 980 – replacement supply misfit

Nothing a sheet metal nibbling tool can’t fix, though, given I haven’t developed a deep emotional attachment to the chassis. I gnawed off the left side of the frame and squared up the rim around the lower screw, after which the opening fit the supply pretty well, although the latching tab bent up from the bottom of the chassis didn’t quite engage the far end of the supply. No big deal: it’s not in a high-vibration environment.

The new-to-me supply also carries an ATX connector, but the eBay seller included a Mini-ATX adapter. Jamming the adapter + wires into the space available required concerted muttering, assisted by tucking the SSD under the DVD-RW drive. No pictures, as it’s a classic seven pounds in a five pound box situation.

And then It Just Worked again.


Canon LiDE 120 Scanner vs. SANE

I just replaced a cheap old Canon LiDE 30 flatbed scanner with a cheap new LiDE 120, only to get flat-black scans. The machinery worked (yes, I released the travel lock), everything seemed fine, the images were the proper size, but they were dead black.

Of course, the scanner worked OK on the Token Windows Box, but wow what crappy software they include.

Turns out the LiDE 120 requires the latest-and-greatest version 1.0.27 of the various SANE programs & libraries. Mercifully, getting those didn’t require compiling from source, just setting up the maintainer’s PPA of the most recent stable release:

sudo add-apt-repository ppa:rolfbensch/sane-release
sudo apt-get update
sudo apt-get upgrade

Which introduced circular dependencies with the distro-installed version 1.0.25 files, which I solved by ripping the entire SANE Thing out by the root(s) and reinstalling it to (re)synchronize All The Things:

sudo apt-get remove libsane:i386 sane sane-utils xsane libsane-common ia32-libs libsane
sudo apt-get install libsane:i386 sane sane-utils xsane libsane-common ia32-libs libsane

And then It Just Worked:

C-Note - detail

C-Note – detail

Of course, you must keep this WARNING in mind:

Canon LiDE 120 - Legal Issues Warning

Canon LiDE 120 – Legal Issues Warning

Franklin didn’t know about scanners or color laser printers when he observed:

Those who would give up essential Liberty, to purchase a little temporary Safety, deserve neither Liberty nor Safety

Of course, there’s more to the story, but one should:

Never let the truth get in the way of a good story.


Raspberry Pi Boot vs. Avahi vs. DHCP

Sometimes, one of our homebrew streaming media players will emerge from reset without starting up properly. The system board LEDs blink more-or-less normally, but the WiFi activity monitor seems … odd. This post documents the results of some exploratory surgery hinting at a possible solution.

I set the router’s DHCP server to assign a fixed IP address to each of our homebrew streaming media players based on its MAC address. That seemed less horrible than setting a static IP address in each player’s configuration, although I could see advantages to either approach. For streamer1, the player discussed here, the IP address is; that’s a non-routable address used only on our network behind the router.

During the Raspberry Pi’s boot, the default /etc/rc.local script finds and displays its IP address:

_IP=$(hostname -I) || true
if [ "$_IP" ]; then
  printf "My IP address is %s\n" "$_IP"

The /var/log/boot log showed this after one boot:

--- snippage ---
         Starting LSB: Raise network interfaces....
[  OK  ] Started LSB: Raise network interfaces..
         Starting ifup for wlan0...
[  OK  ] Started ifup for wlan0.
[  OK  ] Reached target System Initialization.
[  OK  ] Listening on Avahi mDNS/DNS-SD Stack Activation Socket.
[  OK  ] Reached target Sockets.
[  OK  ] Reached target Basic System.
         Starting Avahi mDNS/DNS-SD Stack...
         Starting Regular background program processing daemon...
[  OK  ] Started Regular background program processing daemon.
         Starting dhcpcd on all interfaces...
[  OK  ] Started Avahi mDNS/DNS-SD Stack.
[  OK  ] Started dhcpcd on all interfaces.
[  OK  ] Reached target Network.
         Starting /etc/rc.local Compatibility...
         Starting Permit User Sessions...
[  OK  ] Reached target Network is Online.
         Starting LSB: Start NTP daemon...
My IP address is
[  OK  ] Started Permit User Sessions.
connect: Network is unreachable
[  OK  ] Started /etc/rc.local Compatibility.
         Starting Terminate Plymouth Boot Screen...
         Starting Hold until boot process finishes up...

That mysterious IP address is a Link-local address, about which Wikipedia says: “If a host on an IEEE 802 (Ethernet) network cannot obtain a network address via DHCP, an address from to may be assigned pseudorandomly.”

So, having the router hand out IP addresses doesn’t quite work the way I expected. The Pi awards itself a link-local IP address before getting one from the DHCP server, presumably because the vast Linux startup Pachinko machine has a race condition. Alas, the pseudorandom LL address doesn’t fit in the network handled by the router: the Pi can’t connect to the network.

My code in /etc/rc.local starts the streaming player immediately after the default code displaying the IP address, thus joining the race condition: if the player starts up before the DCHP server assigns the proper IP address, it can’t connect to the music server out on the Interwebs. My code includes a retry loop with a five second delay which eventually connects, at least most of the time, but sometimes gets wedged.

The most reasonable fix seems to involve forcing a static address on each Raspberry Pi, so it can immediately connect to the network, without any negotiation, and get on with the business at hand.

Rather than configuring that in  /etc/network/interfaces as before, the New Hotness adds a stanza to  /etc/dhcpcd.conf:

interface wlan0
static ip_address=
static routers=
static domain_name_servers=

En passant, I killed off IPV6 with this line in /etc/sysctl.conf:


The router doesn’t support IPV6 and there’s no point in using it. Bonus: less log clutter. Double Bonus: startup happens faster!

All of which may help the NTP client update the system clock sooner, perhaps preventing time jumps like this:

2017-02-14 08:42:24,183 INFO: Player setup for: BR1
2017-02-14 08:42:24,184 INFO: Volume control knob: /dev/input/volume
2017-02-14 08:42:24,225 INFO: Starting mplayer on Ambient ->
2017-02-14 08:42:27,175 INFO: Track name: [Arcticology - Nocturnal Sounds]
2017-02-14 08:42:27,194 INFO: Track unmuted
2017-02-15 04:25:00,386 INFO: Track name: [Oöphoi - Suspended Matter]
2017-02-15 04:25:00,413 INFO: Track unmuted

The timestamps in the first five lines date back to the previous shutdown. The Pi remains plugged in and powered while it’s reset, which apparently preserves the system clock variables, albeit without a hardware clock ticking along: time stands still between shutdown and restart.

In this case, the IP address situation worked itself out before the player started, but the NTP clock reset on the sixth line happened at least three seconds after the log began.

This chunk of /var/log/syslog has more detail:

Feb 14 08:42:24 streamer1 dhcpcd[693]: wlan0: leased for 86400 seconds
Feb 14 08:42:24 streamer1 dhcpcd[693]: wlan0: adding route to
Feb 14 08:42:24 streamer1 dhcpcd[693]: wlan0: adding default route via
Feb 14 08:42:24 streamer1 avahi-daemon[387]: Registering new address record for on wlan0.IPv4.
Feb 14 08:42:24 streamer1 dhcpcd[693]: wlan0: deleting route to
Feb 14 08:42:24 streamer1 avahi-daemon[387]: Withdrawing address record for on wlan0.
Feb 14 08:42:24 streamer1 avahi-daemon[387]: Leaving mDNS multicast group on interface wlan0.IPv4 with address
Feb 14 08:42:24 streamer1 avahi-daemon[387]: Joining mDNS multicast group on interface wlan0.IPv4 with address
Feb 14 08:42:25 streamer1 dhcpcd[693]: wlan0: no IPv6 Routers available
Feb 14 08:42:25 streamer1 ntpd_intres[728]: DNS ->
Feb 14 08:42:25 streamer1 ntpd_intres[728]: DNS ->
Feb 14 08:42:25 streamer1 ntpd_intres[728]: DNS ->
Feb 14 08:42:25 streamer1 ntpd_intres[728]: DNS ->
Feb 14 08:42:26 streamer1 ntpd[720]: Listen normally on 6 wlan0 UDP 123
Feb 14 08:42:26 streamer1 ntpd[720]: Deleting interface #3 wlan0,, interface stats: received=0, sent=0, dropped=4, active_time=3 secs
Feb 14 08:42:26 streamer1 ntpd[720]: interface -> (none)
Feb 14 08:42:26 streamer1 ntpd[720]: interface -> (none)
Feb 14 08:42:26 streamer1 ntpd[720]: interface -> (none)
Feb 14 08:42:26 streamer1 ntpd[720]: interface -> (none)
Feb 14 08:42:26 streamer1 ntpd[720]: peers refreshed
Feb 15 04:20:10 streamer1 systemd[1]: Time has been changed

Given the timestamp resolution, NTP (or systemd) apparently resets the clock three seconds after the IP address changes. That may be as good as it gets, if only because the NTP daemon must find its servers, evaluate their status, then whack the local clock.

After forcing the static address, things look better, but it’s too soon to be sure. Many things can clobber streaming, not all of which happen on this side of our router.


1 Comment

Unicode Keyboard Flameout and Workaround

For unknown reasons, probably having to do with the unmitigated disaster of trying to get an SDRPlay radio working with GNU Radio (about which, more later), Unicode keyboard input stopped working. This is not to be tolerated, because engineering notation requires a lot of Greek letters.

Unicode support seems to be baked into the lowest levels of the Linux operating system, although it’s not clear to me whether it’s in X, QT, GTK, or somewhere else. Googling the obvious keywords was unavailing; evidently this feature never ever fails or, more likely, very few people use it to any extent.

Note that I already have the Compose key set up, but Compose sequences don’t include Greek letters.

After considerable flailing, I added the Simple Greek keyboard layout and defined the (otherwised unused) Menu key as the keyboard layout switcher. That’s a pretty big hammer for a rather small problem; I devoutly hope Unicode mysteriously starts working again.

For reference, the Greek keyboard layout looks like this:

Greek keyboard layout

Greek keyboard layout

I’d have put Ω on the W key, rather than V, but that’s just because so many fonts do exactly that.