Monday, February 11, 2019

New Favorite Trackball - Elecom M-XT3UR

Years ago, I was dealing with carpal tunnel syndrome pain, pain that would keep me awake at night. I built my own braces, built a sling where I could sleep with my hands elevated at night. I was trying a bunch of things and wanted to avoid surgery. Some of my friends had benefited from surgery, some had not. I stumbled onto split keyboards and trackballs. With split keyboards and trackballs, I found the pain diminishing, to the point today where I rarely think about pain. For me, split keyboards and trackballs let me type all day.

For keyboards, my favorite is the Microsoft Wired Natural Ergonomic Keyboard 4000.

For trackballs, my favorite has been the Wired Logitech Trackman Wheel, T-BB18. These have been out of production for years, and I have been replacing them with the Wireless Logitech Trackman Wheel, M370. The M370 is pretty good, except for the batteries. The batteries last a long time, but when they start going low, double clicking, dragging, and other operations get a bit flakey. This drives me nuts when I am trying to get something important done and I can't get double clicks to work cleanly. I really want a wired trackball. I don't want to worry about batteries.

Many recommended the Wired Elecom M-XT3UR as a replacement, and I can support that recommendation. Its a bit smaller than the M370 and I think I would like a trackball that is larger than the M370, but after a weekend I feel at home and find myself wanting a spare to take into work. I want to replace my M370s with the Elecom trackballs.

Thumbs up to the Elecom M-XT3UR.

Monday, September 17, 2018


This weekend, I decided to try the EFF’s LetsEncrypt certificates. It was easy for Apache, not as well worked out for Postfix/Dovecot.

My self signed certificates on a couple of my Linux boxes have been torturing me when using Apple Mail. Apple is doing the right thing trying to warn you about self signed certificates.

I tried to go straight to the EFF email solution STARTTLS. After fumbling around with that for many hours, I decided I would get Apache working and then tackle Postfix/Dovecot. I don’t really want Apache on these boxes nor do I want them exposed directly to the internet, but it seemed like a good way to start understanding LetsEncrypt.

I cleared out all the Apache stuff that I had played with previously on a Debian system, reinstalled Apache2, and used these instructions to get the LetsEncrypt certificate installed:

I looked at a number of different pages about LetsEncrypt and this set of instructions seemed straight forward.

I poked a hole in my firewall for apache, which was necessary for LetsEncrypt and setup a public DNS entry for that Debian box.

The Apache certificates installed painlessly.

Next I tackled the Postfix/Dovecot certificates. I ended up using this set of instructions:

This took more fumbling around but it works and now my Apple mail is happy with reading mail from my main Debian box.

I decided to leave the Debian box with the default web page up overnight in case I discovered something that would require re-doing the certificates.  Oh wow! The internet is a dangerous place. I thought nobody would notice my Debian box. The logs this morning were just full of random IP addresses trying all sorts of non-existant URLs, most ending in “.php”. I was glad I had cleared out all my old experiments and reinstalled Apache. I had what I wanted, so I turned off all external access again.

For Apache, LetsEncrypt is easy. I’m am going to play more with STARTTLS and see if I can find a way to make easy to do. Maybe I’m just misunderstanding something.

Monday, June 18, 2018

Plug for

This is a shameless plug for my cousin’s boy Daniel.

Daniel has been quoting sports scores to me since he was 6 or 7 years old. I think he got his iPod when he was about 8 and he would sit in his room with his little miniature NFL helmets in front of him and make videos of himself commenting on upcoming football matches. A few weeks back, the now 14 year old Daniel asked me, what I would use to make a website.  Since then he has created a website,, Sports Talk with Daniel, and a Patreon page, and posted a bunch of content. I think his NFL article is pretty good for a 14 year old. Like most first time web authors, he is watching for every page view. I haven’t helped him to this point, but I probably will this weekend, since adding the Javascript for Google AdSense has got him stumped. I would appreciate if anyone could click on his page. He doesn’t have feedback or anyway to comment on his main site, but you can comment and like on his Patreon page. I think this is pretty good and I want to try to encourage him.

Friday, December 29, 2017

DO-178B/C Friendly Debugging Macros

Sorting through some PDFs and a PDF I had saved if from a friend, Mike Potts,, that is worth talking about.

In DO178B/C code, you want each line of code covered by a requirement or requirements, and ideally nothing else. The requirements say what you are going to do and only what you are going to do. Every DO178 project I have been in has had to deal with dead or deactivated code. There are many cases where you would like to keep some debugging code in there that you could re-activate when things go wrong to see information. Mike has a set of C macros that leave no code behind when compiled for production. Not even stray semi-colons.

I have used this philosophy many times over the years and keep a set of notes he gave me long ago about how to use this:


Ed asked about debug printf.

Here is how it works, you enable Serial-Input-Output (SERIO) Debugging Prints with #define SERIO_DEBUG.

To issue a debugged printf, you call it with two parentheses and NO semicolon.

Yes it looks weird, and takes some getting use to, but watch.

SERIO_DEBUG_MSG(("NMEA Semap, BUSY %11d\n", hi_pri_clock_read()/TICKS_PER_MS_HIGH))

A bunch of these macros are stored in the debugging module's header file:

#if (defined(SERIO_DEBUG))
#define SERIO_DEBUG_MSG(macro_string) printf macro_string;
#define SERIO_DEBUG_MSG(macro_string)

If SERIO_DEBUG is defined, then the SERIO_DEBUG_MSG and the first set of parentheses turn into a printf and a semicolon.

If SERIO_DEBUG is not defined, the while macro disappears (and does not even leave a semicolon behind).

This is kinda nice, not even a semicolon left behind to disturb certification. I like pre-processor tricks.
If you want to carry this idea forward, you can use something similar to:

#ifdef LINK_ERROR #include <debug.h>
#define GPS_ERROR_MSG(macro_string) {debug_msg macro_string; debugbreak();}
#define GPS_ERROR_MSG(macro_string) debug_msg macro_string;

This error printf happens to be writen as non-maskable, but can optionally issue a debugger break statement that is provided by a specific tool set.

We were consistent with this naming convention.

Enables were always *_DEBUG, and the associated debugging prints were always *_DEBUG_MSG.
This allowed us the option of sprinkling some extra computation code (within #ifdef *_DEBUG) near the printfs and still 'clearly' be debugging code.

These was also a master debug_on macro to globally enable the whole group.


Mike is a really sharp guy and always goes that the extra distance to make things right. One of his recent project's was to put together a really excellent setup guide for the Ubiquity EdgeRouter X, a fantastic little router. His setup guide was mentioned on Security Now, Episode 641, before Christmas and can be found at

Friday, September 09, 2016

PowerPC Ubuntu Installation on PowerPC Mac Mini

Just my quick notes:

PowerPC Linux on Mac Mini, 7447a, September 9, 2016

  • I haven’t had success with high resolution monitors, I had to use a 1024x768 monitor and the 1280x1024 monitor from work also functioned correctly
  • ISO Image for Ubuntu Power 14.05 from Ubuntu
  • live radeon.agpmode=-1
  • You need the radeon.agpmode=-1 to keep the graphics from locking up.
  • Double click the install icon on the desktop
  • Don’t add extra options like download the packages while installing.
  • You may have to manually erase all partitions, if it’s getting hung up go into the advanced (manual) partition setup, erase all the partitions and start the installation from scratch.
  • Create the encrypted disk, default partitions
  • Encrypt home directories
  • Boot the installation with “Linux radeon.agpmode=-1 video=radeonfb:1024x768”
  • Edit /etc/yaboot.cnf, find the “append=“ and add “radeon.agpmode=-1 video=radeonfb:1024x768”
  • /bin/ybin -v to update the kernel

Sunday, May 08, 2016

Find where a routine is defined in shared libraries.

I can't find a reasonable Linux command that will let me search all the shared libraries defined by the ld.conf configuration and LD_LIBRARY_PATH. I keep ending up grep'ing through all the directories. So here is a short script on github:

Friday, April 08, 2016

Apple Pencil Case

First attempt at a Apple Pencil case. My thought was that copper would look nice.

I am going to try Plumbers Caulk for a soft closed end.

Let that dry standing up.

Quick wood interference fit cap to start with.