Tuesday, November 14, 2017

Paradise ponders: twilight zone edition...

Paradise ponders: twilight zone edition...  I'm not sure if I've blogged about Kickstarter before, even though it's a place I frequent.  I've never put a project up there, but I have backed quite a few of them over the years.  Amazingly, my experience has been uniformly good so far – every single project I've backed delivered what they promised.  Often, in fact, they over-delivered.  I do choose carefully, though: I only back projects that are something interesting to me and that look practical and competently led.  There are many that I review and dismiss because their goals look unrealistic or the project leaders look flaky.

But ... last night I ran across a new Kickstarter project that has set a new bar for both of my red-flag triggers.  To my surprise, investigating this project was like walking through a portal to another world: one populated with (if I'm being charitable) a large number of astonishingly under-informed people.

My first clue was the title of the project: Gabriel Device - Free energy for everyone.  That seems to over-promise a bit, no?  The photo at right is a screenshot of the device itself, taken from the video on the project home page.  It appears to be a simple toroidal transformer, a common enough device in modern electronics and electrical gear – one without any magical properties that I'm aware of.

My second clue was the first bit of the project description.  I'll just quote it:
How to change the world, Changing the world in of itself is a undertaking only most dream about and bicker about in early morning rush hour or afternoon coffee-shops, The United states is hapless says a Englishman, the new world is destroying our faith says a Muslim, why does my country seem to be in free-fall all the time, says a American.

Most of these issues are brought about by the media and propaganda that aspire to enrich or enslave a mind, but what if, the core issue to all of our problems stems from a power-source that just either hasn't been developed or needs to be fully developed,

If power was a source that could be transported and established across a well, a farm, a school, a vehicle, a hospital, all without moving parts and the only need to make it work is to get it initialized, that would even make Tesla himself dance in his grave.
I think Nicola Tesla may well be dancing in his grave, though perhaps not for the reasons this fellow thinks!

Further along in his description, he calls his device a “nested bi-toroidal transformer” – something I'd never heard of.  So I googled it.  It was when I started following the links that I felt like I'd entered that portal into another universe: the Universe of Perpetual Motion.  The current phrase in vogue is “above unity”, referring to devices with a ratio of output power to input power that is greater than one.  In the short intervals of coherency I found in the posts and videos, I think I figured out why the bi-toroidal transformer has entranced these folks: it's because they don't understand power factor, and this has fooled them into believing they're creating power from nothing.  This wouldn't be the first time that power factor has been a perpetual motion factor.

But ... this project is certainly the first time I've seen something so plainly loony on Kickstarter.  People are being asked to pledge a half million dollars (for what, I have trouble imagining, and the project doesn't actually say).  I'm somewhat relieved to see that as of this morning there is just one backer who has pledged $40.  I'm reasonably confident that this fellow won't get a half million dollars in pledges – but what if he did?  Would Kickstarter actually give him the money?  Kickstarter's guidelines and prohibited items list don't seem to rule out perpetual motion schemes.  Kickstarter and Stripe both make money from funded projects, so clearly both have an incentive to actually follow through with the funding, should there be sufficient pledges.  Gulp.  Part of me says “Yikes!  That shouldn’t be allowed!”  Another part of me – dominating at the moment – says “If there are enough fools willing to donate to an obviously hopeless cause, then … it’s on them. ”

But still ... oh, my!

A bad vendor experience..

A bad vendor experience...  Our old trash compactor (one that we inherited with the house) was on its last legs: rusty bin, problems with the tracks, noisy as all get out.  I'd been looking into a replacement for over a year, and I waited for a highly-rated KitchenAid model (at right) to become available – and for some of the other projects I had going to settle down.  So in early October, I selected a vendor (Lowe's) and ordered it.  They promised delivery on October 24th.  I was surprised that it would take two weeks, but that was still ok.

Well, the 24th came and I hadn't heard from Lowe's at all.  Not good.  I called, was promised a call back with a delivery date.  Never heard back.  I called again, this time got another delivery date promised: the 30th.  The 30th came and went.  Are you seeing a pattern here?  In this day and age, when vendors like Lowe's must compete with Amazon, the experience was so bad I can still scarcely believe it.  Overall it was five weeks from the time I placed the order until it arrived in my house.  I called Lowe's on six separate occasions, was promised three different delivery dates before they finally got it right on the fourth try.  There is no online service to get this information, and every employee I contacted seemed to be uncertain about how to even find my order – much less any accurate information about it.  I never received any sort of email confirmation from Lowe's (no snail mail, either).  I still don't have a receipt, though the cost was charged to my credit card.  About the only positive thing I have to report about the experience with Lowe's was that their delivery people were great: they had the right equipment, they took great care in the delivery, and they were friendly and polite.

We will never be ordering online from Lowe's again, unless convincing evidence of improvement is presented to us.  You may remember that we had a similarly disappointing experience with WalMart a few months ago.  Based on these two experiences, I'd say Amazon has little to worry about.  The bad service from Lowe's and WalMart contrasts especially keenly with the almost perfect record of great service with have with Amazon...

I should be careful to point out here that we have zero complaints about the trash compactor itself.  It is exactly as advertised.  So far we are very pleased with it.  It opens and closes effortlessly, and its operating noise is roughly half that of our old compactor.  A win on that front! 

Sunday, November 12, 2017

Paradise ponders: temperature moderation edition...

Paradise ponders: temperature moderation edition...  My office is located on the second floor of my barn.  It's well-insulated, and last year I installed a heat pump that both heats and cools it.  That heat pump works great, but there are a couple of less-than-perfect things about it.  First, when the weather is very cold (under about 20°F), it stops heating.  The only other source of heat in the office is a little woodstove – which works very nicely indeed, but of course only while I'm there to feed it.  So when I walk into my office after a very cold night, it might well be below freezing in there.  Secondly, in the summertime if I turn off the heat pump when I leave in the afternoon, by the next morning my office is very hot indeed.  So I've been leaving the heat pump running all night, spending the extra money to make it comfortable for me in the mornings.

The engineer in me says “There has to be a better way!”  A couple years ago I thought of one, and actually started to implement it.  This better way depends on the fact that my barn's first floor is heated, and never goes below 64°F.  It's a very nice heating system, using in-floor circulating hot water.  The first floor isn't air conditioned, but it is very well insulated and rarely goes above about 77°F.

So I came up with the idea of circulating air from the first floor through my office in two circumstances.  First, when the temperature in my office goes below about 60°F, and the first floor is warmer than that.   Secondly, when the temperature in my office goes above about 70°F and the first floor is cooler than that.  Last year I installed the fan required to do this, and started with the ducting for the fan's output.  My next big project is to finish that work: the fan ducting, the return and its ducting, and a controller.  The controller will be the fun part, of course. :)

Why not simply use a thermostat?  The challenge there is the thermostat would base its decision solely on the temperature in my office, but I need something different: to take the temperature at the ceiling of the first floor into consideration.  Of course I'm going to tackle that with a Raspberry Pi (diagram of proposed system above right)!  The parts are on order and should be here soon.  I'm going to put a temperature sensor in my office, near my desk, and a second on the ceiling of the first floor.  I'll use a solid state relay to turn the fan on and off.  The Raspberry Pi will implement the fan control algorithm exactly as I described above, and in addition it will act as a monitor for both the first floor temperature and my office temperature.  Once I have that all running, I'll be able to restrict my use of the heat pump to when I'm actually in the office (saving a few bucks a month), and I won't have to worry about the office temperature descending into the deep-freezer realm...

Paradise ponders: powered by UPS edition...

Paradise ponders: powered by UPS edition...  My “install the UPS” project yesterday went about as well as it could.  There were no major challenges, and no extra trips to Home Depot were required.  The new L5-30R receptacle (at right) is about the only visible part of the project, other than the UPS itself.  As I'd hoped, at the current draw my actual equipment has, the UPS is fairly quiet.  I located it in the storage area of my barn, outside the insulated walls of my office, so from inside the office I can't hear it at all.  I put my 'scope on the power produced by the UPS, and it's a beautiful, noise-free sine wave.  Put my freq counter on it, and it's running at 60.0002 Hz: more than close enough for anything I need!  That's actually probably better than the power company, especially when you take the noise on the main lines into account.

I did run into one disappointing thing.  The “Multilink” software that comes with the UPS is a restricted license with very limited capabilities.  It has an embarrassingly bad user interface, and there's no obvious way for me to write software that can interact with it, or monitor it. This is not what I had been expecting out of a datacenter-class piece of kit.

Multilink communicates with the UPS over a serial port.  That got me to wondering whether the serial protocol was documented.  A little googling and I discovered that (a) no, it's not documented and in fact is explicitly proprietary, and (b) of course some other datacenter operations folks have reverse-engineered it (the same protocol is used on many UPSs, including the monsters used in datacenters).  This fellow made a start on documenting it, and includes some interesting information about how he did it.  Here's another guy who actually wrote a Linux device driver for it!  It looks like it won't be too hard for me to integrate some monitoring for this...


Saturday, November 11, 2017

Paradise ponders: a new project edition...

Paradise ponders: a new project edition...  Naturally I have a challenge right from the start!  Yesterday I took delivery of a new UPS (store photo at right) for my office.  One advantage of having run datacenters in the past is that I know a bit about UPS technology (datacenters make extensive use of them) – something that comes in very handy when selecting one for my own use.

The main problem I'm trying to solve is providing power for the (hopefully short) period of time between the time we lose main power and the time my backup generator kicks in.  Generally that's around 30 seconds.  A secondary problem I'd like to solve is to mitigate the effects of “dirty power” (brownouts, momentary outages, surges) on the computer equipment in my office.  We had an example of a momentary outage last week, and it took me a couple of hours afterwards to get everything back up and running.  It was that experience that prompted me to pull the trigger on ordering a UPS.

The one I bought is an “online” type, meaning that it has an inverter that continuously outputs 60 Hz sine wave 120 VAC.  That inverter is powered from a battery, and the battery is continuously charged when there's 120 VAC available at its input (in other words, when the power is up).  Most UPSs designed for home or small office use are a different type: “standby”.  These UPSs only produce power when the main power fails, and there's always a brief “glitch” when the power switches over.  Furthermore, standby UPSs aren't very good at dealing with brownouts or intermittent power outages.  The datacenters I managed all used online UPSs, as hard experience with the problems caused by standby UPSs long ago convinced datacenter operators to stay away from them.

Another thing I learned while managing datacenters is that you really don't want to run an online UPS anywhere near its rated capacity.  Doing so will reduce reliability (not exactly a feature in a UPS!) and, perhaps surprisingly, cause them to make much more noise.  The latter is because in order to cool the power electronics (for the inverter, primarily) at maximum capacity, the fans in the unit generally run full blast – but when running well below their capacity, they can (and usually do) run much more slowly.

So I selected a UPS with roughly twice the capacity I actually need (I need 1,500 VA, so I bought one rated at 3,000 VA).  Everything I read about it validated the thought that this would reduce noise, and I know enough about electronics to know that it will also increase its lifetime.  The particular model I selected is 120 VAC in and 120 VAC out, matching the power I had available at the place I wanted to mount it, and the power I need for my computers. 

Here's where the challenge arises.  A 3,000 VA UPS will draw nearly 30 amps from its 120 VAC input if it's running at max capacity.  Standard 120 VAC outlets, the kind you're used to using every day, are rated usually at 15 amps, sometimes at 20.  They can't safely handle a 30 amp load.  I knew this, but it never occurred to me when I ordered the UPS.  So when I unpacked it yesterday, I noticed immediately that it had a weird plug (just like the one at right).  Of course I do not have a receptacle matching that plug, nor do I have a circuit installed that can handle 30 amps.  Dang it!  So yesterday evening Debbie and I headed for Home Depot, where I bought all the parts I'd need to install a matching (NEMA L5-30R) receptacle and run a 30 amp circuit to it.  Today I'll be installing it.  I have a subpanel already installed just 30 feet from where I need the receptacle, so this really isn't all that big a deal.  But so much for my careful planning!  I fully expected to unpack that UPS, plug it in, and be done.  Not so much!

Friday, November 10, 2017

Paradise ponders: gpsctl functionally complete edition..

Paradise ponders: gpsctl functionally complete edition...  gpsctl is the name of the C program I've been working on for a few weeks now.  Early this morning I added the last planned features in – it does everything I needed it to do.  I've made it publicly available, on the off chance that it will help some other nutcase who wants a stratum 1 NTP server on the cheap.

It came together very quickly in the last few days, mostly because that's when I finally got all the basic stuff up and running solidly.  Here's one example of a feature recently implemented: querying the GPS for the data it holds on visible satellites:

GNSS     ID CNo  El Azi   PRr Signal qual         Sat Hlt Orbit Src      Flags
GLONASS   2  52  43  35   0.6 Code/carrier locked Ok      Ephemeris      uea
GPS      29  51  36 158   1.2 Code/carrier locked Ok      Ephemeris      uea
GPS      15  50  52 101   0.9 Code/carrier locked Ok      Ephemeris      uea
GPS      20  50  55  52  -0.4 Code/carrier locked Ok      Ephemeris      uea
GLONASS  18  50  74 355   0.6 Code/carrier locked Ok      Ephemeris      uea
GPS      21  49  72 333  -0.9 Code/carrier locked Ok      Ephemeris      uea
GLONASS  17  49  46 125  -1.5 Code/carrier locked Ok      Ephemeris      uea
GPS      18  48  58 248   0.5 Code/carrier locked Ok      Ephemeris      uea
GPS      13  47  33  62   0.0 Code/carrier locked Ok      Ephemeris      uea
GLONASS   3  47  79 207  -2.7 Code/carrier locked Ok      Ephemeris      uea
GPS      10  45  24 240   0.4 Code/carrier locked Ok      Ephemeris      uea
Galileo   8  45  66 174   1.3 Code/carrier locked Ok      Ephemeris      uea
GLONASS  19  45  22 322  -1.3 Code/carrier locked Ok      Ephemeris      uea
Galileo   3  44  48  57   0.6 Code/carrier locked Ok      Ephemeris      uea
GPS      16  42  20 299  -1.4 Code/carrier locked Ok      Ephemeris      uea
GLONASS   4  41  22 213  -7.0 Code/carrier locked Ok      Ephemeris      uea
GPS       5  47   7  56  -1.1 Code/carrier locked Ok      Ephemeris      a
GPS      27  46  13 320  -0.4 Code/carrier locked Ok      Ephemeris      a
GPS       4  44 -91   0   0.0 Code/carrier locked Bad     None          
GPS      26  41  20 267   2.3 Code/carrier locked Ok      Ephemeris      a
Galileo   7  39  18 208   1.6 Code/carrier locked Ok      Ephemeris      a
GLONASS  10  38   3 348   4.6 Code/carrier locked Ok      Ephemeris      a
Galileo  22  37   8 124   4.6 Code/carrier locked Ok      Ephemeris      a
Galileo  26  33  14 308   7.9 Code/carrier locked Ok      Ephemeris      a
Galileo   5  13   1  39  -1.4 Unusable            Ok      Ephemeris      a
Galileo   1   0   2 307   0.0 Searching           Ok      Ephemeris      a
Flags:
  u - used for navigation fix
  d - differential correction is available
  s - carrier-smoothed pseudorange used
  e - ephemeris is available
  a - almanac is available
  S - SBAS corrections used
  R - RTCM corrections used
  P - pseudorange corrections used
  C - carrier range corrections used
  D - range rate (Doppler) corrections used


That is a lot of information, and quite useful when troubleshooting.  The results of some of the configuration code I wrote are visible here, if you know what to look for.  For example, I've configured the GPS to ignore any satellite whose elevation is within 20° of the horizon.  This prevents the use of satellites whose signal path goes through a lot of atmosphere.  Similarly, I've configured the GPS to ignore any satellite whose signal strength (as CNo) is under 30.

Another feature recently implemented is querying for configuration information.  This is vital, both for figuring out what the default configuration was, and for verifying that the configuration code I wrote actually worked.  Here's an example result:

U-Blox GPS configuration
  Antenna:
    Power enabled:            yes
    Short detection:          yes
    Open detection:           no
    Power down on short:      yes
    Auto recovery from short: yes
  GNSS:
    Tracking channels:  32
    Type: GPS
      Enabled:          yes
      Minimum channels: 8
      Maximum channels: 24
    Type: SBAS
      Enabled:          no
      Minimum channels: 0
      Maximum channels: 0
    Type: Galileo
      Enabled:          yes
      Minimum channels: 8
      Maximum channels: 8
    Type: BeiDou
      Enabled:          no
      Minimum channels: 0
      Maximum channels: 0
    Type: IMES
      Enabled:          no
      Minimum channels: 0
      Maximum channels: 0
    Type: QZSS
      Enabled:          no
      Minimum channels: 0
      Maximum channels: 0
    Type: GLONASS
      Enabled:          yes
      Minimum channels: 8
      Maximum channels: 24
  Navigation engine:
    Dynamic model:                Stationary
    Fix mode:                     3D only
    Fixed altitude (2D):          0.00 meters
    Fixed altitude variance (2D): 0.0001 meters^2
    Minimum elevation:            20 degrees
    Position DoP mask:            10.0
    Time DoP mask:                10.0
    Position accuracy mask:       40 meters
    Time accuracy mask:           40 meters
    Static hold threshold:        0 cm/s
    Dynamic GNSS timeout:         60 seconds
    Threshold above C/No:         8 satellites
    C/No threshold:               40 dBHz
    Static hold max distance:     0 meters
    UTC standard:                 USNO
  Time pulse:
    Time pulse 0 enabled:         yes
    Use frequency vs. period:     no
    Use length vs. duty cycle:    yes
    Lock on GPS frequency:        yes
    LockUseOtherSet:              yes
    Align to top of second:       yes
    Polarity rising edge:         yes
    Time grid:                    UTC
    Antenna cable delay:          56 nanoseconds
    RF group delay:               20 nanoseconds
    Locked pulse period:          1000000 microseconds
    Unlocked pulse period:        1000000 microseconds
    Locked pulse length:          500000 microseconds
    Unlocked pulse length:        0 microseconds
    User configurable delay:      0 nanoseconds
  Fix rate:
    Measurement rate:                 1000 milliseconds
    Measurements per fix:             1
    Time reference:                   GPS
  Power mode:
    Power setup:                      Balanced
    Period (if interval):             0 seconds
    On time (if interval):            0 seconds


Lots of information there, too!  At least, if you're a GPS geek. :)  It's a bit mind-boggling that all this capability is in the tiny little module you see in the photo at right.  By “module”, I don't mean the green circuit board with the LEDs on it.  I mean that tiny little square module just to the right of the antenna connector.  That teensy little thing – smaller than my thumbnail.  That thing can listen simultaneously to 32 satellites, solve large systems of differential equations, and communicate at high speed with my computers.  It's quite astounding, actually.

I have some personal experience that really drives this home.  When I was in the U.S. Navy, back in the '70s, I worked on a system called SINS (for Ship's Inertial Navigation System).  There's some specific information on SINS here, and on inertial navigation systems in general here.  In the '70s, long before GPS, these were the state of the art in navigation.  A SINS system occupied a fairly large compartment shipboard, used huge amounts of power, and it had a low reliability (in my own experience, less than 50% up time).  The information it provided degraded in accuracy the longer you went since a calibration (against a known point on the earth).  At its best, at least when I was observing, it would put you within a mile or so of your actual location.  As bad as that sounds, that was far better than the alternatives available at the time.  That GPS in the photo above is smaller by far than the smallest piece of electronics in SINS – and far more accurate and reliable.  Not to mention cheaper!  A SINS system had to cost several million dollars in today's money; that GPS cost me under $100.  Amazing!

Wednesday, November 8, 2017

Paradise ponders: we live in a postcard edition...

Paradise ponders: we live in a postcard edition...  Just walked outside, and the skies are clear with a beautiful, bright, 2/3 moon.  The moonlight is bright enough for me to clearly see the snow-capped mountains around us, just like those in the daytime photo at right.  Despite the bright moon, the air is so clear that I could still easily see the Milky Way, the Pleiades, and other not-so-bright celestial objects.  Beautiful...

Monday, November 6, 2017

Paradise ponders: winter approaches edition...

Paradise ponders: winter approaches edition...  Yesterday's weather was a little nasty – cold, wet gloppy snow on the ground, and not too much sunshine.  We went on a quest for moose (we start seeing them in Blacksmith Fork Canyon in the winter), with no success.  We were treated to some pretty scenery (as in the view at right, from near the mouth of canyon), saw about a bazillion turkeys, and a few deer.  There were quite a few hunters in the back country, all scanning the hillsides – Debbie tells me that cougar (mountain lion) season is now open here, so that may be what they're looking for.

My little C program is shaping up nicely.  It's not so little any more – it's just over 3kloc (three thousand lines of code, for all you non-geeks).  It's been a terrific learning exercise for me, just what I needed for “reentry” into the world of low-level programming.

When I quit working on code yesterday afternoon, I had a problem that was vexing me: unreliable communications (via serial port) with the GPS, using the U-Blox proprietary UBX protocol.  Fixed in my head was the notion that the problem was caused by the fact that the GPS was transmitting both UBX and NMEA data on the same wire.  I imagined that the GPS was behaving stupidly, interleaving the bytes from each protocol.  This morning while I was taking my morning shower, an alternative theory came to me – one that would be much simpler to fix.  It's amazing how often I have solved (or at least made progress on) problems while taking a shower.  Something about that activity is conducive to insights.  Anyway, the alternative theory was simply that when I was sending a UBX command the host computer's UART receiver was out of sync with the data stream being transmitted by the GPS.  This would only be an issue if the receiver had been fed a stream of NMEA data before trying to read a UBX message.  I made a quick change to my code to force synchronization before any UBX operation, and poof! – just like that my reliability problem disappeared.

Obviously I need to take more showers!  :)

Sunday, November 5, 2017

Paradise ponders: dogs in the snow edition...


Paradise ponders: dogs in the snow edition...  Well, we had a most unexpected event last night: snow!  Roughly 2" of the white stuff, heavy, wet, gloppy snow.  The forecast called for a moderate amount of rain, but apparently it was a bit colder than the weatherman expected. :)

We let the dogs outside to play in it, and they had a ball.  Short video at right, a few photos below.  This may well be Ipo's first sight of snow: we believe she spent last winter in Florida, with her then-owner.  If this was her first snow, she certainly seemed unfazed by it.  Miki (first photo) was more like “Oh, crap, we’ve got this again?” ..


Friday, November 3, 2017

Paradise ponders: NTP server update...

Paradise ponders: NTP server update...  I wrote yesterday that I had installed the new antenna on my barn roof, and that a quick check showed it to be working correctly.  Well, now it's had most of 24 hours to get settled down (NTP and GPS both take a while to do that), and I have some more concrete results.  First, the photo at right shows my barn with a superimposed indicator showing where my NTP server's GPS believes it is.  The position shown is roughly eight inches (33 cm) from where it actually is.  This is gobsmackingly good!  It's also an amazing demonstration of several different technologies.  First, there's the satellite photo of my barn superimposed on a map of the world, via Google maps.  What an astonishing capability – especially given that it's free – this is.  Then there's my little under-$100 Raspberry Pi with a high-performance GPS (including an active antenna) system.  State-of-the-art geolocation when I was a kid was map-and-compass.  Then there's the amazing correspondence of these two completely independent chains of technology.  That 8" error is the sum of the error in Google maps and in my GPS.  And it's just 8"!  Like I said, it's gobsmackingly good...

Then here's a report from my GPS (extracted with the work-in-progress program I'm writing), produced this morning:
 Time (UTC): 11/03/2017 13:50:41 (mm/dd/yyyy hh:mm:ss)
   Latitude:  41.58308650 N
  Longitude: 111.84003970 W
   Altitude: 4868.373 feet
     Motion: 0.007 mph at 0.000 degrees heading
 Satellites: 21 (used for computing this fix)
   Accuracy: time (12 ns), height (+/-2.169 feet), position (+/-1.654 feet), heading(+/-169.961 degrees), speed(+/-0.029 mph)
There are several interesting pieces of information in there beyond the location.  First, there's the fact that 21 satellites were used to calculate the 4D fix (the four Ds are: latitude, longitude, altitude, and time).  These satellites were part of three independent satellite systems: the US's Global Positioning System, The EU's Galileo, and Russia's GLONASS.  The accuracy of the 4D fix improves as the number of satellites used goes up, and with 21 satellites that accuracy is darned good.  Of most interest to me is the time accuracy, as that's what's synchronizing my NTP server.  The GPS is reporting that its time signal is accurate to within 12 nanoseconds (that's 0.000000012 seconds).  That will do just fine!

If you're wondering about that reported motion, first of all 0.007 mph is a very slow motion indeed: about one tenth of an inch (2 mm) per second.  Most of us would not distinguish between that speed and motionless. :)  But why isn't it zero?  That reported speed is the result of a small amount of “noise” in the GPS fixes.  From one fix to the next there is always a slight variation in the calculated location, even though the actual location isn't moving.  That “fix noise” looks like some very slight motion to the GPS, as it is exactly what would happen if you actually were moving ever-so-slightly and there was no fix noise...

Thursday, November 2, 2017

Paradise ponders: photo catch-up edition...

Paradise ponders: photo catch-up edition...  I mentioned my new Raspberry Shake earlier today.  That's a photo of it at right.  Something I didn't mention is that the Kickstarter project for it was done by a Panamanian team; all the design and construction was done there as well.  You can see that it says “Made in Panama” (in English!) on the case.  This is a great example of something the Internet is amazingly good at: connecting people with similar interests, no matter where they are in the world.  It's so different than 25 or 30 years ago, and even more different than when I was a kid.  In the '80s, for example, I'd say the chances of me connecting with a similar project would be approximately zero...

A couple days ago I caught the scene at left: our biggest willow, yellow with fall color, against a beautiful blue sky.  For some reason, our willow turned yellow a good week before the other willows around us (and there are a lot of them!).  I have no idea why that should be.

That same evening, I was playing with our dogs just before the sun disappeared.  Our three younger field spaniels (Mako, Cabo, and Ipo) were having a fantastic time tussling with each other at 90 MPH.  Race did his usual trick of bringing a stick for me to throw, laying it on the ground in front of me, and then just looking at me until I threw it.  All the photos below are from that session:


Paradise ponders: rooftop antenna and Raspberry Shake edition...

Paradise ponders: rooftop antenna and Raspberry Shake edition...  Yesterday, with some help from my brother Scott, I got my GPS antenna mounted on top of my barn.  This antenna is part of my stratum 1 NTP server project.  The antenna is very near the peak of my barn's second floor roof, about 26 feet above ground level.  Prior to going up to the roof, I had mounted a section of 2x10 on the inside of the barn, between two of the roof trusses.  This provided a sturdy mounting point for the antenna, instead of the 1/2" OSB that the roof is sheathed in.  Yesterday I crawled out of a second floor window onto the first floor roof, then put up a ladder to the second floor roof.  Scott and I lashed this ladder to a board placed across the window frame, to keep the ladder's feet from slipping down the first floor roof.  This part worked surprisingly well.

I did some careful planning to fill a bucket will everything I might need while working on the roof.  This almost worked. :)  It turns out I forgot an adjustable wrench, so I had to come back down once for that.  Otherwise, the entire installation went smoothly out of the one bucket full of tools and parts.
The trickiest bit was sitting on the 25% pitched roof without sliding off the slippery steel.  My roofers told me that they often worked barefoot, as their feet didn't slip nearly as much as their shoes did.  I tried this, and it worked just fine.  The walk from the ladder (at the roof's edge) to the peak (where the antenna was going) was maybe 15', definitely a tense distance, though short.  Had I slipped and fallen, I'd have gone off the second floor roof, bounced onto the first floor roof (same pitch), and slid off the side of the barn from about 15' high.  I was quite happy to have avoided this!  While I was doing the actual installation, I straddled the peak of the roof, so I was quite stable.  It was only that little journey from the roof's edge to the peak, and back, that was slightly terrifying.

Naturally I forgot to take photos of this little adventure.  I was too busy trying not to fall off of my barn's second floor roof!

Once I had the antenna installed, I connected it to my little Raspberry Pi GPS board and started testing.  On the first try, we had 12 satellites visible.  A few hours later I had 17.  My time accuracy is now reporting at +/- 2 nanoseconds – not bad at all!  Best of all, after 12 hours of operation the GPS was reporting very high time and position stability – and this is before I've even configured it in a way optimized for timekeeping!

I still have some work to do on the NTP server project, but at this point its all fairly mundane stuff  The C program I'm working on will form the heart of an NTP server monitor that I'll install on the Raspberry Pi.  This will keep statistics on the accuracy over time.  Then I need to build a little cabinet for the Raspberry Pi, so it can take its place of honor on my server rack. 

Just by coincidence, yesterday I also received my Raspberry Shake 4D - a seismograph that reports into an international network.  I assembled it and plugged it in, mainly to see if it was working, and it all seems to work just fine.  I'm not sure where I'm going to mount it – it needs to be on the ground floor, preferably on the concrete slab, and somewhere with minimal vibration and noise.  It might end up going in the basement of my home.  The screenshot at right is off the Raspberry Shake network's station view.  If you click to embiggen it, you'll see the little orange triangle NE of the Great Salt Lake that represents my station – the only one for a few hundred miles in any direction.  Unlike the USGS seismograph that I had in California, this one's data is directly accessible – there's a network API that will let me download it.  You can be sure I'll be playing with that!

Monday, October 30, 2017

Paradise ponders: sculpture progress edition...

Paradise ponders: sculpture progress edition...  I mentioned a few weeks ago that we had engaged a sculptress to make a bronze sculpture for our back yard.  I still can scarcely believe we did such a crazy thing!  This sculptress works out of her home in Colorado, and she's been sending us photos of her progress on it (we expect it to be done sometime next spring).  Here's what we've received to date:


It looks like she's being supervised by her dog, doesn't it?  :)

The finished sculpture should have the mom mountain lion and three cubs; the two that aren't there yet will be to the left in the last photo.  It's interesting to see how she puts together the armature with metal, and the (very!) rough shape with what looks like sheets of foam.  It's all very abstract until the clay starts to go on!

Sunday, October 29, 2017

Paradise ponders: happy dogs, musical memories, declining savings, and dark nights edition...

Paradise ponders: happy dogs, musical memories, declining savings, and dark nights edition...  It's so easy to motivate dogs to do anything at all – just figure out a way to let them associate the behavior you want with getting a treat, and they'll do it.  Anything.  If you just give them a treat for no reason, their joy is nearly boundless.  Often, upon noticing this, I reflect on how much more difficult it was to motivate people to do what I needed them to do at any business I owned or managed.  There is no “treat” that works for everybody, though often one could figure out a treat that worked for an individual.  Even then, though, that treat didn't work all the time – and something else might come along that completely negated the effect of a promised treat.

For example, I recall an engineer who worked for me, who (I discovered) really badly wanted to take a couple of months off for an around-the-world trip with his wife.  I promised him that in exchange for solving a particularly tedious problem we were having with one of our products, a problem he was particularly well suited for.  This worked for about four months; he plunged into the work with enthusiasm and was making great progress – until he got offended at a completely unrelated decision we'd made about another part of the product.  In the space of a day or two he went from an energized, nothing-will-stop-me attitude to that of a defeated soldier.  He gave up.  The work didn't get done by him, and he didn't get his reward.

That sort of thing never happens with dogs.  They're so much simpler!  That tasty biscuit works every single time.  Oh, I'd have given a lot for an engineering equivalent of a Milk-Bone!

As I write this, I'm listening to Tommy!, by The Who.  It was released in 1969, and for whatever reason is one of the few dozen pieces of music from my youth that I remember most fondly.  I listened to that album many, many times in my electronics “shack” (a converted chicken coop).  I played it on an ancient Motorola stereo with a tube amplifier and 14" electrodynamic speakers, one that I picked up as not-worth-repairing junk from a TV repair shop.  I still remember the experience of troubleshooting it, as it was a significant learning experience for me.  I had no schematic (or any other documentation) for it, so the first thing I had to do was to reverse-engineer a schematic.  I ended up with about 10 sheets of paper with a pencil schematic.  Then I had to figure out how it all worked, and man, that was hard!  There was so much in that design that I'd never run into before.  Finally, once I understood (or thought I did!) how it was supposed to work, then I went to work troubleshooting it.  I didn't have an oscilloscope, so I came up with a “poor man's” approach.  I started with a little signal injector – a simple oscillator that sent a (roughly) 1KHz tone into the input from the turntable cartridge.  Then I built a little amplifier and a capacitively-coupled probe that let me touch points within the Motorola's amplifier to see if there was a signal there.  I worked my way through several stages of pre-amp to the first stage of the power amplifier, and there I found the problem: a shorted capacitor.  So simple!  I replaced that capacitor and voila! – I had a working stereo.  Every time I hear Tommy! it takes me back to that experience...

An email conversation with a (much younger) friend led me to do a little research this morning, and I found the chart at right (source).  It confirms something I suspected from my own  experience: people these days are saving (for all reasons, including retirement and buffer) at a much lower rate (~3% of disposable income today, versus ~12% in the '60s) than they did when I first entered the workforce (in the late '60s).  I don't know the reasons for this, but clearly some of it is a changing culture, part of the more general trend of people not expecting to have to handle the consequences of their decisions.  Anecdotally young people today seem much more likely to expect government intervention to support them in retirement.  When I've pressed people for details about this belief, I haven't run into anyone who has specific notions.  Everyone seems to dismiss Social Security as adequate for retirement, and many have a vague notion that the government will “do something” to provide for them in their retirement.  I saw figures recently (can't find them now, though) that less than 20% of people aged 50 had any means or even a plan for supporting themselves in retirement.  They had vague notions, like cashing in the equity on their house, but nothing more.

It seems rather obvious that a lower savings rate, combined with increased longevity (and therefore more years in retirement), leads to a bad problem for our society in general.  I don't understand why so few people seem to be concerned about this.  In that respect it reminds me of the under-funded pension problem hanging over so many cities, counties, and states.  Another very obvious problem, with relatively little general concern.  I'm very concerned about both, because I strongly suspect that in order to cover these deficits, the government will be trying to come after anyone who has assets in retirement.  Like us, if we live long enough...

This morning I walked from our house to our barn at around 6 am, and the skies were particularly dark.  Orion was high in the southwest, the Pleiades in the west.  As I was staring up at them, a big meteor, orange fireball, plunged straight down from between them.  I could even make out some smoke trail, so it must have reached a fairly low altitude.  The fireball was extinguished just before it would have disappeared behind the Wellsville Mountains from my perspective.  Beautiful!

Today is bookkeeping day for me.  I've got to catch up from my neglect over the past 10 days or so...

Friday, October 27, 2017

Paradise ponders: beautiful fall morning edition...

Paradise ponders: beautiful fall morning edition...  It's another gorgeous day in Paradise, folks.  I took the photo at right a few minutes ago.  It's looking southwest over our alfalfa field, with the morning's first sun rays lighting up the Wellsville Mountains to our west.  Our valley floor will get sunlight in the nest few minutes...

Debbie's coughing persists, so yesterday morning we ventured off to the urgent care again (if you're counting, that's the fourth time since she first got sick on the 7th).  We were ... less than satisfied with the outcome there.  The doctor on duty listened to us politely.  One of the things we told him is that the cough medicine Debbie had used for years to combat her cough-after-a-cold problem was benzonatate – but it no longer worked for her.  He recommended that we try a different cough medication.  We went to the drug store, picked up the prescription he gave us – and it was benzonatate in brand name form!

At that point we decided to make an appointment with our GP, despite the fact that we might have to wait a while to see her.  Debbie  called in, and it turned out that our regular GP was out on maternity leave (she just had a baby boy), and would be until January.  But ... there was a doctor covering for her, and we could get in on that very afternoon.  Awesome!  So off we went again, to see the new doc.  This fellow we both really liked.  In fact, Debbie's first comment upon leaving was that she wanted to switch GPs to him. :)  He listened, was full of questions and comments, and had a cracking good sense of humor.  We were most excellently entertained, and we left with a smile, a prescription for hydrocodone-based cough medication (the only one that's worked for her this year), and an inhaler that he thought might well help.  An hour later her coughing had stopped.  Last night she got her first good night's sleep in over a week.

In between trips to the doctor, I beavered away on my C program again.  Right at the moment I'm writing a replacement for the ancient getopt library.   I've got getopt working, so I really have no need to do this – but I'm offended by the unnecessary complexity of its API.  Further, writing a replacement looks like a tasty practice exercise to me.  So far it's turning out to be simpler and easier than I was anticipating, which really makes me wonder why it wasn't replace aeons ago...

Wednesday, October 25, 2017

Paradise ponders: it was just yesterday edition...

Paradise ponders: it was just yesterday edition...  Only 24 hours ago I mentioned that so far I had ended up writing utility C code myself instead of using third-party libraries.  Well, that ended this morning! :)  I needed to create some JSON-encoded output, and naturally I wondered if someone had a C library for that.  The answer is a resounding “Yes!” – I found dozens of them.  I looked for simple and small, and found this one that I quite liked, right down to the MIT license.  In this case the easy way to use the library was to simply download the two source files (one .c, one.h).  It all compiled and worked on the first try.  I might have to do a little more of that!

Tuesday, October 24, 2017

Paradise ponders: NTP, C, and a nice moment edition...

Paradise ponders: NTP, C, and a nice moment edition...  So a reader wrote and said “I know a bit about NTP, and I’d love to see your ntpq output!”  Well, ok then: here it is, as of a couple minutes ago:

remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
oPPS(0)          .PPS.            0 l   13   16  377    0.000    0.000   0.001
*level1f.cs.unc. .PPS.            1 u    3   64  377   77.729    1.578   1.958
+clock.sjc.he.ne .CDMA.           1 u   60   64  377   32.103    2.562   0.943
-toofishes.net   129.7.1.66       2 u   61   64  325   72.172    5.609   1.657
+pbx.cytranet.ne 192.207.62.39    3 u   16   64  377   31.646    1.925   2.052

Now I know that only the geekiest amongst you will have any clue at all what you're seeing there.   If you're curious, everything you need to understand it is available here.  That output was generated with “ntpq -p”; it's a peers report.  The important bits to me are where I've highlighted it in orange: that's the offset and jitter, in milliseconds, for my little NTP server.  A zero in those measurements would be perfect; I'm pretty darned close! :)  My GPS-based timing unit is currently reporting (separately) a maximum error of 8 nanoseconds in it's pulse-per-second output, and that's what my NTP server is using for a reference (that's what the “oPPS(0)” refers to).  The other interesting piece of information I see is highlighted in red.  That's telling me that the toofishes.net NTP server I'm using as a possible reference has not responded to 3 of the last 8 queries my NTP server sent to it.  The “-” at the far left of that line tells me that my NTP server is ignoring it, most likely because of these errors.

I spent a good part of the day working on my GPS configuration and monitoring program, written in C.  I'm really enjoying this “close to the metal” experience again – it's a bit like being back in the '70s and early '80s, when this sort of development was the only kind I did.  On the other hand, it's also driving home for me just what a rich development environment I've been using with Java and JavaScript.  In C I find myself writing code for lots of different things that I haven't had to think about for years.  For example, today I wrote a set of C functions that implement some of the features of Java's standard ByteBuffer class.  That's a really handy thing for encoding or decoding binary data, which is exactly what I have to do for this GPS.  There's nothing even remotely like it in the standard C library!  I did find lots of libraries on the web, but ... knowing nothing about them, if it's something easy, I'll just do it myself.  And ByteBuffers are, in fact, almost trivially easy, so I rolled my own.  So far, if it's not in the Gnu Standard C library, I'm doing it myself.  I'm sure I'll run into something eventually that I'll want to borrow – but not yet.

Yesterday Debbie and I went to Aggie's Creamery for an ice cream cone.  Of course, as always, they were outrageously delicious.  When I first walked in, there were only two other customers there; they had just finished getting their ice cream.  One was a young woman, perhaps 25 years old.  The other was a much older man, maybe 85 or 90, very frail, a little confused, barely able to walk.  The young woman was, I suspect, his granddaughter.  I watched them, unseen, for a minute or so, just delighted by the scene.  The young woman was very solicitous of the old man, watching out and helping in many little ways.  She was clearly happy about his reaction to the ice cream: he was enjoying his little cup of chocolate wonderfulness at the same time she was trying to guide him into the safety of a seat at a little table.  He was distracted by everything: the shop, the bustling employees, the task of getting a spoonful of ice cream into his mouth, and the difficulty of walking in his condition.  Nevertheless, there was a huge grin on his face and he was making utterly unrestrained happy noises.  The young woman finally got him safely down, and as she sat down she turned toward me – and I could see her happy satisfaction with the moment.  She glanced at me and she saw my smile and thumbs up, and responded with a big grin of her own.  Just a sweet, happy moment: a younger person taking pleasure in making someone she cares about happy.  And in that she certainly succeeded...

Monday, October 23, 2017

Paradise ponders: dogs and C edition...

Paradise ponders: dogs and C edition...  There's a morning ritual at our house that is by now burned into the brains of our five (!) dogs.  The ritual has several parts, all of which the dogs have firmly associated with canine bliss.  The first part is the morning excursion to the back yard.  We generally let them out first thing after we get up, even before we do our morning ablutions.  The dogs all know that nothing else happens until they've gone outside and done their business.  They do that quickly, and then as soon as they see activity in our kitchen (as when we've finally really gotten up), then they clamor at the door to be let in – they know what's coming next: bananas!

With five dogs I changed from one banana to two, so they each get roughly 40% of a banana.  And they go bananas!  I peel the two bananas in the kitchen sink, which causes great excitement – especially for Ipo and Mako, both of whom are able to stick their noses over the edge of the counter and slightly into the sink.  There is much leaping and wagging and doggie excitement!  Then I take the two peeled bananas and a knife, and with my back to a kitchen wall wait for the dogs to form a semi-circle around me.  Ipo always performs one little ceremony: she darts into her crate, and then back out to the semi-circle.  Once they've all settled into place, I start slicing the banana and tossing them to a particular dog, saying their name just before I do it.  This is aimed at helping them associate their name to themselves and something good.  It works. :)

Once the bananas are gone, I (and usually Debbie) settle into our morning tea, coffee, and toast or pastry routine.  We're generally talking, reading news or email, etc. during this time.  The dogs are all watching us carefully, waiting for signs that we're finished.  They are incredibly good at detecting these signs, and you can see them winding up as the end approaches – because they know that once we're done, I'm going to feed them.  And that, of course, is the best moment of the day!

We have a small laundry room adjacent to our kitchen.  In there is a cabinet with a rollout drawer that we keep our dog food container in, with a low granite counter top above it.  In the left photo below, you can see that arrangement, caught in the middle of my filling of the bowls.  The three stainless steel bowls that are full of food are for our three youngest (Mako, Cabo, and Ipo), all of whom we feed in their crate.  So the first step for the feeding ritual is always the same: pull out the food drawer, unscrew the lid of the food container, and fill the three stainless steel bowls.  The dogs watch me on every step of this stage, making sure I'm doing it right.  The second photo shows the view behind me as I'm working: dogly inspectors hard at work.  After I fill the first three bowls, I take them (stacked up as in the photo) into the kitchen.  There I fill each bowl with warm water sufficient to cover the food (this brings out the smells in the food).  Then I take them over to the crates, stacked up again – and the three who are about to be fed dart at maximum possible speed straight into their crate.  Often there's a big crashing noise as they hit then end before turning around to await the delivery of their bowl.  Then the crunching and slurping begins. :)


After the young ones are chomping on their kibble, I return to the laundry room to fill the two big blue plastic bowls, for Miki and Race.  These two, being (much) older dogs, get less food, lest they turn into fat old men.  If anything, this makes them even more eager for their morning chow.  Miki's only demonstrations of physicality come during these moments that I'm walking toward the laundry room to fill their bowls.  He knows it's his turn, and he's very excited.  Race is just as excited, but seems to know he doesn't have to work to get his food – he just has to be patient.  So he hovers nearby, emitting little whimpers occasionally, as I fill their bowls with kibble and warm water.  Finally the big moment comes for them: the bowls are put into their stands in the laundry room, and they go to work with great enthusiasm.  Those bowls, you might note, are not smooth on the inside.  As Michelle's boy A.J. likes to say, they've got obstacle courses in them.  These bowls cured Miki and Race of a bad habit: gobbling their food down so quickly that they'd often puke it right back up.  They can't do that with these bowls, as the only way they can get most of the kibble down their gullets is to worm out the individual pieces with their tongues.  They take about twice as long to eat as the younger dogs, but the problems we used to have with their gulping eating style are all gone...

After all five dogs have finished, things are much calmer in the house.  I let them all back outside again, and then they start the serious business of doggie play.  This is their way of waiting out the clock for the morrow's morning, when the doggie ritual of joy starts all over again...

I spent a lot of the day yesterday debugging my C program, and I expect to be doing a bit more this morning.  From a very high level, debugging in C is no different than debugging in any other programming language.  At a lower level, though, it's very different than debugging in Java (where most of my recent experience is) – mainly because most of the problems I encounter are things like uninitialized variables, memory allocation goofs, and pointer errors of one sort or another.  In that respect, it's much more akin to debugging in assembly language, right on the (computer) metal.  Here's one example I debugged yesterday.  The broken code:

*count = 0;

while( TC && (*count < max) ) {
    int c = readSerialChar( fdPort, charWaitNs );
    if( c > 0 ) {
        buffer[*count] = (byte) c;
        count++;
    }
}
return *count >= max;

See the problem?  I didn't see it until I stepped through it with a debugger!  Here's the corrected code (highlighted in orange):

*count = 0;

while( TC && (*count < max) ) {
    int c = readSerialChar( fdPort, charWaitNs );
    if( c > 0 ) {
        buffer[*count] = (byte) c;
        (*count)++;
    }
}
return *count >= max;

This sort of error (referencing a pointer variable directly, instead of the object it was pointing too) just doesn't happen in Java.  There are no pointers, or so the language proponents like to claim (really, all the object instances are pointers internally, but the language does a great job of hiding that from you).

This difference in debugging is neither good nor bad, just different.  Especially, I think, for someone like me who hasn't done any “low level” debugging for a zillion years or so... :)

Sunday, October 22, 2017

I really am...

I really am ... still here.  Just heads-down on C code. :)

Wednesday, October 18, 2017

Paradise ponders: geekly gloating success!

Paradise ponders: geekly gloating success!  It took me damn near all day to do it, but I finally got remote debugging working with the toolchain I'm using.  All the difficulties turned out to be silly little things (as usual).  It's in the nature of things like this that you have total, epic failure until you nail the last problem ... and then suddenly everything works!  The main reason this was so challenging for me is that darn near everything I was working with (the parts of the toolchain) are brand new to me – so I wasn't just fighting actual problems, I was also fighting my ignorance.  I'm ever-so-slightly less ignorant now.  Here's what I had to do to make all this work:
  • I had to find the sources for a particular older version of the GNU debugger (gdb).  That turned out to be far more challenging than I expected, and led me down a blind alley learning how to clone git repositories.  Turns out GNU has a tarball of exactly the version I needed up on their anonymous FTP server.
  • I had to configure and compile that special version of gdb.  The configuration would allow gdb to execute on my Mac, but debug programs compiled for the Version 7 ARM computer that powers the Raspberry Pi 3.  This was way harder than I expected, but only because I had so much trouble locating the magic word (“armv7-unknown-linux-gnueabihf-gdb”) to use as the argument for the “—target” parameter to ./configure.  I read approximately 17 billion web pages to find that magic word.
  • I had to figure out what “symbol file” meant in the CLion run configuration screen.  I ran with the assumption that I had to tell the compiler to produce a symbol file ('cause that's how things worked in the dark ages when I last did things like this).  Turns out that's wrong.  What I had to do was to compile my source code on the target machine, then copy that object file back to my Mac – and point to that as the symbol file.  That took another 12 billion web pages skimmed to figure that one out.  I also found a way to produce a separate symbol file, though I'm not sure I actually care – the first method is easy and fast.
  • The easiest challenge turned out to be configuring CLion to automate all of the above things.  I only had to read about 5 web pages to get that! :)
The most important thing, though, is: Hooray!  I've got it working!

Paradise ponders: missing blogger edition...

Paradise ponders: missing blogger edition...  No, I haven't disappeared from the face of the earth!  I've just been heads-down on several projects, including installing a microwave, trying to figure out CLion (the C/C++ IDE from JetBrains), and generally learning the C toolchain for remote development on a Raspberry Pi.  So much stuff to learn!

Monday, October 16, 2017

Paradise ponders: C programming and compressed air edition...

Paradise ponders: C programming and compressed air edition...  Debbie and I took a beautiful drive yesterday morning up Blacksmith Fork Canyon.  We saw a dozen or so deer – all fat and healthy looking, ready for the privations of winter – and the tail end of the fall color.  It's elk season, and there were hunters all over the place.  Some of them (a minority, thankfully) park along the side of the road and set up what is basically an ambush at the side of a field where an elk might come to forage.  On one stretch of such an ambush, about 50' wide, I counted eleven hunters.  Each had their binoculars up, searching for some elk to poke its head out.  There were four other such ambushes along the edges of the same field, though the others weren't quite so large.  Still, if an elk was dumb enough to stride out onto that field, probably over a dozen rifles would be shooting at it.  I wonder how they decide whose “kill” it is in a situation like that?  We also saw some beautiful effects of the cold weather (it was 15°F where the photos below were taken), around waterfalls and rapids.  The combination of low temperatures and high humidity meant that the fine spray thrown up by the tumbling water stayed in the air as a liquid (or ice crystal) for much longer than usual.  This produced wonderful “steam” effects, and also ice-coated twigs and grasses.  A few photos of some of the better ones:


We also ran a few chores, but for much of the remaining day, and also today, I've been programming in C again.  I greatly expanded the simple little program I wrote about in my previous post, to give me all the functions I could imagine needing for my NTP server.  I've also modularized it in a way that will make it relatively easy to add new features, should I need to.  I'm finding that I quite enjoy the process of programming in C.  It's a far simpler, smaller language that the Java and JavaScript world I've spent the last twenty years in; in that sense it's easier and cleaner.  On the other hand, some things that are easy to do in Java/JavaScript (mainly because of the ubiquitous high quality, well documented libraries) are much harder to do in C.  Then there's the fact that C is fairly close to the hardware and the operating system – not quite as close as assembly, but not too darned far from it.  I like that; it plays to my hardware background and my desire to tinker with little embedded systems (like the NTP server and my irrigation supervisor).  One thing I've come to realize: it's pretty easy to meld the two languages for everything (or nearly so) that I might want to do: I can handle the low-level, close-to-the-hardware stuff in C (where Java either couldn't do it, or would have trouble doing so), and I can run those C “helpers” as a child process under Java.  That's both easy and clean.  I'm doing a test project of that general architecture right now: to let a Java program interpret the NMEA protocol output of the GPS on my NTP server.  A little C program will echo that NMEA data to stdout, and my Java program will run that as a child process and consume its output.  Simple!  But Java couldn't do it on its own...

Our sprinkler contractor showed up this morning, towing a huge air compressor behind his pickup.  He used this compressor to blow all the water out of our underground sprinkler lines, so that when they freeze this winter (as they surely shall), it won't damage any of the system.  The photo at right shows what it looked like as he blew out one zone in our back yard.  The noise as he did this was quite impressive, and full of bass notes that I wouldn't have expected from rapidly moving air...