Archive for October, 2019

AirPods Pro Announced

Monday, October 28th, 2019

Apple Computers

Today Apple announced the new AirPods Pro, and they look really nice. Noise cancelling, and a Transparency feature to allow some level of noise in if you're in traffic or needing to listen to a little of what's going on around you. Nice feature, and clever - because that's something you might like to tune depending on your environment.

I've become a nut about wireless headphones, and so, of course, I ordered a set, and they should be at the house in a few days. Very nice. The stems of the AirPods Pro are shorter than the AirPods, and have a button on them. Nice. The specs indicate that they should last 4.5 hrs on a charge, and the case is good for 12 hrs. Very nice indeed.

Can't wait to try them out. Life can be fun. 🙂

UPDATE: they are small, light, snug fit, great sound, everything I was expecting from Apple. Just amazing!

Fun RESTful Paging with Bash and jq

Tuesday, October 22nd, 2019

Ubuntu Tux

I was pulling data from a RESTful API, and the returned data was paginated, as data like it often is, and I wanted to process it all in bash because I wanted to be able to share this with a large community. But how to really do that efficiently? I'm not worried about the time it takes to process data in bash, but just to make sure that we're not fetching the same data multiple times. What I came up with was pretty interesting.

First, let's set up the body of the RESTful call. Standard JSON, with the data in the payload as well as a nextLink key:

  {
    "events": [ { "dish": "Stevie is at Poppers!", "userId": "ralph" },
                { "dish": "Ralph is at Waffle House", "userId": "dorris" }
              ],
    "nextLink": "https://yoyo.com/api/rumors?page=4"
  }

where the events key is really holding the important data from the call, but because there was too much data to get in one (efficient) call, the service gave a complete link to hit to get the next page of data. Simple.

Now some APIs return a page number, or a placeholder value to pass to the same URL that generated this data, and this saves 100 bytes, but that's just a different way of getting the "next" page to the caller.

So... how to put all this in bash? Let's start with jq, and you can get it from Homebrew, with:

  $ brew install jq

and then we can look at the basic loop over all pages:

  # this is my YoYo API Token - you can get one too
  tok="111111111111111111111"
 
  # dump all the rumors into a file
  hit="https://yoyo.com/api/rumors"
  while [ "$hit" != "null" ]; do
    # make a temp file for the details of this page of the rumor group
    rumors=$(mktemp /tmp/yoyo.rumors.XXXXXXXX)
    # get the page, and possible next page URL...
    curl -s -X GET $hit \
       -H "accept: application/json" \
       -H "X-API-Token: $tok" > $rumors
    # write out as CSV, the data from this file
    for usr in `jq '.events[] | select(has("userId")) | .userId' $rumors`; do
      echo -e "$title,$usr"
    done
    # get the next URL to load from the service
    hit=`jq '.nextLink' $rumors | sed -e 's/^"//' -e 's/"$//'`
    # clean up the file as we don't need it any more
    rm $rumors
  done

In this example, the $title variable is something that's not defined, but would presumably be defined in the script before we get to the loop. Whatever the point of the gathering the data really is.

What I enjoyed about this is that we can get the data from the service with a simple curl command, and then process it with jq and the flexibility with jq is really quite impressive. In just a few lines, I was able to make a script that fetched a lot of data from a service, extract what I needed into a CSV for processing in a spreadsheet, and it didn't take all that long. Winner. 🙂

Very Exciting New Smart Lock

Thursday, October 17th, 2019

Machine Learning

This morning, I read about Level Lock and it is exactly what I've been hoping to see in a smart lock for my home. It's just the guts of the deadbolt. The facade - even the keys are your old keys - and the guts are smart. Very.

The basic functionality is similar to many of the others - HomeKit aware, with the ability to lock/unlock remotely, and give people "keys" for times of day, etc. It's all pretty standard. But the fact that it in no way effects your ability to use the same key as before, but adds the smart lock features - well... that's what sold me.

So I put my name on the waiting list for early 2020, and we'll see if it ships. 🙂

Auto-Scrolling not Working on Adium on macOS 10.15

Thursday, October 10th, 2019

Adium.jpg

With the upgrade to macOS 10.15 Catalina, I noticed that Adium is not functioning as it should. Specifically, that the chat windows are not auto-scrolling to the bottom on new input to the window. I'm guessing this is something related to the way the internals of Adium, and macOS are updating the contents of the window, but it's also well known that Adium hasn't had the best support in the last few years, so it might not get fixed.

Thankfully, the Forums are still alive, and this was posted recently:

Running version 1.5.10.4 Adium on MacOs Catalina version 10.15.

Previously, in Chats when the list of text boxes was scrolled to the bottom, any additional messages, either typed by user or received from other users, was added to the bottom and the list was scrolled up to reveal it. After upgrading to Catalina yesterday, this autoscrolling behavior has stopped working. When user types a message and hits return, the new message is hidden. Likewise, messages from other users are not revealed by scrolling up. So one has to constantly manually scroll up to see the message thread.

No respondants with ideas - yet, but I have hope that the few that have access to the code can at least make the code available - if not fix the bug, and then we can get back to our lives. But if not, I found InstantBird which seems to have been somewhat abandoned several years ago, but it might offer some utility if Adium is never getting fixed.

I did look for Adium on GitHub and just googling it... but it seems to be a bit difficult to find... Hmmm...

UPDATE: At least I have a few more links... the page for Getting Adium Source is live, and describes how to get the code, and there's a page about Getting the Newest Adium Source as well. In the discussion about this, there's even a note that there exists a BitBucket repo for Adium, where PRs are welcomed.

On the bad news front, the code isn't even close to Xcode 11 ready:

I was going to take a crack at it. I'm fairly good at Objective-C. However, I can't even get Adium to compile with the newest Xcode. What a mess. File encoding issues galore.

So it seems like this may not be an easy fix, but I'll keep looking, and if I get some time, Maybe I'll dive in.

UPDATE: We have a solution... it's in the Javascript for the rendering of the window, and it's in two places:

  • /Applications/Adium.app/Contents/Resources/Template.html
  • ~/Library/Application Support/Adium 2.0/Message Styles/
    Colloquy.AdiumMessageStyle/template.html

where both might have to change these functions:

  // Auto-scroll to bottom.  Use nearBottom to determine if a scrollToBottom
  // is desired.
  function nearBottom() {
    //return ( document.body.scrollTop >= ( document.body.offsetHeight - 
    //                                      ( window.innerHeight * 1.2 ) ) );
    return 1;
  }
  function scrollToBottom() {
    window.scrollTo(0, document.body.scrollHeight);
    //document.body.scrollTop = document.body.offsetHeight;
  }

If you just fix the one in the app bundle, that's not enough, but you have to fix him. And then you need to fix the one in the Message Style as that's the one that's actually used. Once both are updated to working code, a restart of the app gets the scrolling back into action! 🙂

Updating my Treadmill

Wednesday, October 9th, 2019

Path

I really like my Matrix T75 treadmill with the XIR console... and today I checked the Matrix web site to see that they had updated the firmware to 1.4.8.3, so I downloaded it, unzipped it, put it on a USB drive, and then went through the update on the treadmill.

I'm hoping that this fixes the problem I've been having with the control electronics... about the only way I can be sure to run in the morning - uninterrupted, is to wake it up from it's sleep mode, and then pull the kill switch, plug it back in, and then start my run.

If I skip the pull/replace, then one morning in a week - and I don't know which one, will have an issue where the control electronics will think I pulled the kill switch, and stop the run. It's pretty jarring, and I'd like to avoid that, so I go through the ritual of the pull/replace, and I'm pretty safe.

We will see if this update solves that problem... fingers crossed. 🙂

Getting Apache 2.4.41 + PHP 7.3.8 Going on macOS 10.15 Catalina

Tuesday, October 8th, 2019

Yosemite

This morning I thought I'd perform the ritual of getting the old web development tools that I've used in the past going again - this time on macOS 10.15 Catalina. Now I haven't used PHP in ages, but I've still got code and databases for Postgres to use that - so it makes sense to get this all working again, and it's always fun to see how things work out.

Getting Postgres 11.1

Loads of coverage here about Postgres, and it's just so simple to get the latest version from Homebrew:

  $ brew install postgresql

I've even posted how to upgrade from major version differences, so it's easy to get the latest Postgres running on your box, and the tools are just superb.

Activating UserDir in Apache 2.4.41

As in the previous updates, the UserDir extension is not enabled by default, so we need to get that going right away. This enables the code to be run from the development directories, and that's a big time-saver. First, we need to enable the UserDir module in Apache, and then make a specific config file for the user in question. Start by editing /etc/apache2/httpd.conf and line 183 needs to be uncommented to read:

  LoadModule userdir_module libexec/apache2/mod_userdir.so

and then similarly on line 520 uncomment the line to read:

  Include /private/etc/apache2/extra/httpd-userdir.conf

Next, make sure that the file we just included is set up right for including the user directories. Edit /etc/apache2/extra/httpd-userdir.conf and line 16 needs to be
uncommented to read:

  Include /private/etc/apache2/users/*.conf

At this point, you need to make sure you have at least one file in the /etc/apache2/users/ directory for each user, like: drbob.conf:

  <Directory "/Users/drbob/Sites/">
      Options FollowSymLinks Indexes MultiViews ExecCGI
      Require all granted
  </Directory>

where the last line - Require all granted is new as of Apache 2.4, and without it you will get errors like:

  [Thu Dec 18 10:41:32.385093 2014] [authz_core:error] [pid 55994]
    [client fe80::7a31:c1ff:fed2:ca2c:58108] AH01630: client denied by server
    configuration: /Users/drbob/Sites/info.php

Activating PHP in Apache

The mext thing to do is to activate PHP in the supplied Apache 2 with macOS 10.15. This is line 186 in the file - /etc/apache2/httpd.conf and you need to uncomment it to read:

  LoadModule php7_module libexec/apache2/libphp7.so

and then verify a file called /etc/apache2/other/php7.conf exists and contains:

  <IfModule php7_module>
    AddType application/x-httpd-php .php
    AddType application/x-httpd-php-source .phps
 
    <IfModule dir_module>
        DirectoryIndex index.html index.php
    </IfModule>
  </IfModule>

which does all the other PHP configuration in a separate file to make upgrades easy.

Finishing Up

At this point, a simple restart of apache:

  $ sudo apachectl restart

and everything should be in order. Hit a URL that's a static file with the contents:

  <?php
    phpinfo();
  ?>

and you should see all the details about the PHP install - including the PostgreSQL section with the version of Postgres indicated:

MacOS 10 15 PHP Config

What's really great is that Apple has included lots of support in the default PHP install:

  • PHP 7.3.8
  • Postgres 9.3.7
  • MySQL 5.0.12
  • SQLite3 3.28.0

so there's no reason to do anything more to get the kind of support that I used to get. And I get the other databases for free. This is great news! I then run my little test page to make sure the database connection is working:

MacOS Catalina Database Page

and everything is working exactly as expected!

Upgraded to macOS 10.15 on my MacBook Pro

Tuesday, October 8th, 2019

Software Update

This morning I decided it was time to install macOS 10.15 Catalina on my personal MacBook Pro. There are plenty of folks warning about the loss of 32-bit apps, and I've done an inventory of what I'll loose, and I'm OK with all of those. Sure, I purchased some, but I've gotten a lot of good use out of them, and nothing I'm losing is not already replaced by something that's better.

So off I go to install the upgrade...

I will say, they underreported my 32-bit apps, but that's OK, I know I'll just go through my Applications folder after the update and trash what I no longer need - or can use. But that's OK... it's nice to remind people.

There are quite a few differences in macOS 10.15 - and System Preferences is one of the biggest. I don't mind that they need to make these changes, but the need for me to log out of iCloud, and then log back in seems to be a bit annoying - as it looses all my Apple Pay cards, etc., but I can easily put them back.

One of the two real issues is that Mail.app is different on the "Old School" split view, and now you can't control the headers - at all. No selection of which ones to show, or where to put them, or hoe big to make them... it's just "Here you are" - and we live with it. Maybe they'll put some of that configurability back - I sure hope so.

The second issue is with Adium, my IM Client that I use every single day to chat with folks. In this update, the text view of the chats doesn't auto-scroll to the bottom to show new lines on the view when new lines are added. I don't know if this is meant to be this way, or if it's something that you can change with Xcode - but it's kinda annoying, and I was hoping to find a more supported alternative. I may have to get the Adium code and rebuild it myself with a fix. There just aren't any really good alternatives.

I'm sure there will be a lot more... I had plenty of issues with the Apple subscriptions, but that's just a one-time annoyance... shouldn't be ongoing... but we will see.