IT Consulting

     My Hardware
      I've been a Mac guru since 1986. The current Apple isn't the same company I loved for decades. My last new Mac purchase was a MacBook Pro Retina 15" Early 2013, My last iPhone purchase was a 2017 iPhone 7 Plus. I doubt I'll ever buy new Apple products again.
      Stacks Image 490
      iPhone 7 Plus (PRODUCT) RED

      Dear Apple: you named it iPhone, I expect the telephone to "just work". Far too often calls go directly to voicemail without ringing. This isn't a question of carrier, reception, location, or battery charge. At the same location a call doesn't ring I'll immediately get the voicemail. This insanity happened regularly on my iPhone 5. I long for the days of robust cell phones like my LG VX4400.
      Stacks Image 496
      Mac Pro Early 2009

      My main Mac, with dual 3.46 GHz Xeons, 96 GB RAM, Radeon RX570, SSDs, USB-3 card, macOS Mojave. It started as a single-cpu with WiFi and Bluetooth. I bought a dual-cpu Mac Pro, its case was a bit damaged and it had no WiFi or Bluetooth so I put it's dual-cpu tray in my original single-cpu's chassis. Then the single-cpu tray died so I bought a dinged-up third single-cpu Mac Pro just for the tray. The single-cpu is a spare, it has a 3.46 GHz Xeon and runs headless just so I can keep it up-to-date. The dinged-up Mac Pro is for parts.
      Stacks Image 502
      LED Cinema Display 27" Mid 2010

      Attached via DisplayPort to my main Mac Pro.
      Stacks Image 508
      iMac 27" Late 2009

      This iMac does Target Display Mode via its DisplayPort. I use it as a second 27" display for my main Mac Pro. It runs bare-bones High Sierra. It typically runs without restarting between Apple security updates.
      Stacks Image 514
      MacBook Pro 15" Retina Early 2013

      2.8 GHz i7, 16GB RAM, 750 GB SSD, macOS Mojave. This used to be my main Mac when I was still working. It's become very slow even after a clean install. Something in the hardware is starting to fail. Then the battery died and hasn't been replaced.
      Stacks Image 520
      MacBook Air 13" Mid 2013

      1.7 GHz i7, 8 GB RAM, 500GB SSD, macOS Mojave. I've learned to love the smaller size, I often grab it when I don't want to carry my 15" MacBook Pro in a backpack or messenger bag. It lasts on battery far longer than my MacBook Pro Retina 15. Luckily for me the original owner maxed out the CPU, RAM, and SSD.
      Stacks Image 526
      iMac 21.5" Late 2012

      2.7 GHz i5, 16 GB RAM, 1 TB SSD, macOS Mojave. This used to be my main Mac after I retired. I keep it current in case my Mac Pro dies. I use it to watch DVDs, Blue-rays, Amazon Prime, Internet Archive, et al.
      Stacks Image 532
      MacBook Pro 17" Mid 2010

      2.66 GHz i7, 8 GB RAM, 1TB SSD, Mac OS X Snow Leopard. I use this when newer crapware/bloatware doesn't get the job done.
      Stacks Image 538
      MacBook Pro 15" Mid 2009

      2.53 GHz Core Duo, 8GB RAM, SSD, Mac OS X Snow Leopard and macOS El Capitan. For those times when older hardware is needed.
      Stacks Image 544
      PowerBook G4 15"

      Dual boots Tiger and Leopard. Used for Classic. I have two of these, mine is well used, the one I was gifted is in better condition.
      Stacks Image 550
      iMac 17" Late 2006

      Runs Snow Leopard. I've always loved the look of these, when a pristine one was getting recycled I had to save it. Absolutely no practical use for it.
      Stacks Image 556
      iMac Bondi - The Original iMac from1998

      This iMac was used lightly and kept under a cover. It is near new condition. I maxed out the RAM to 384 MB. It runs System 9.2.2.
      Stacks Image 562
      PowerBook 3400c

      I keep this since it has a SCSI port and I have all the adapters to go with it. The last time I powered it on years ago it took many attempts to get it booted. IIRC the hard drive suffers from stiction.
      One of my PCs just died, I'm down to just the Lenovo.
      Stacks Image 578
      Lenovo IdeaPad Yoga 13

      i7-3537U 2.0GHz, Intel HD Graphics 4000, 8GB RAM, 128GB SSD.

      This has a touch-screen and folds over.

      It dual boots Windows 10 and Linux Mint.
      Stacks Image 774
      Dell Latitude E6500

      Core 2 Duo P8700 2.54 GHz, 8GB RAM 120GB SSD.

      A heavy oldie that's a backup.
       Raspberry Pis
      Stacks Image 586
      Raspberry Pi 3 B+

      I have three RPi 3 B+s all with Sense HATs, all in Miuzei Cases (shown at left). Two of them monitor networks, they email and text me when there are outages. One is at home and the other at a client. The third is unused.
      Stacks Image 594
      Raspberry Pi 4

      I have one RPi 4 with a Sense HAT and ICE Tower (shown at left). It runs Pi-hole and my software.
      Stacks Image 602
      Raspberry Pi Sense HAT

      All of my RPis have Sense HATs. they are a lot of fun to program and have many practical uses.

      Every picture I could find of them active had the LEDs too bright. I'll take a picture of mine one of these days.
      More soon.
      Stacks Image 733
      NVIDIA Jetson Nano

      SBC (Single Board Computer) with 4-core 64-bit ARM CPU @ 1.43 GHz, 128-core Maxwell GPU., 4 GB RAM.

      Since it requires Ubuntu I changed to xubuntu and modified the GUI to be like Linux Mint.

      I bought it to run SETI@Home and Einstein@Home. I ported some special SETI code to it, but the Maxwell GPU didn't use the CUDA code properly. Now that SETI is taking a hiatus it only runs Einstein.
     My Software
       Bash Scripts
      • Catalina No Update Red Badge
        A bash script that stops some of Mojave's incessant nagging to upgrade to Catalina.
        Script to install a LaunchAgent that removes the Catalina Update red badge nag from System Preferences.

        The install script tells softwareupdate to ignore Catalina. This should need to be done only once.

        The LaunchAgent runs when the user logs in, it also runs at 3:33am.
      • Fix Unsafe Filenames
        A bash script that renames files and folders removing unsafe characters from their names. It can also remove orphaned metadata (resource fork) files and old Microsoft Office temp files.
        Warning: this script renames files and folders and can result in data loss. Backup before running this script. Always use Preview mode to test this script before actually modifying filenames.

        This script is intended for more advanced sys admins. The script's documentation is in the beginning of the script. READ IT.

        The script has a preview mode where it shows what will be modified. I strongly recommend using it before allowing the script to change anything.

        I wrote this to fix directory and file names on a Synology NAS that is accessed from macOS 10.6-10.14 plus Windows 7, 8.1, and 10. Many files on the NAS originated in older versions of Windows, macOS, Mac OS X, and Classic Mac.

        The NAS is littered with decade+ old Microsoft temp files of the forms ~XXXXXXX and XXXXXX~X where X =[A-Z0-9]. The script will optionally delete these files.

        The NAS also has many metadata/resource fork orphans (files prefixed with ._ that don't have the matching original file without the ._). In Preview mode the script only says they would be deleted.
      • Reset Icon Services
        Updated: 2020-10-02. A Launch Daemon that resets iconservices when it runs amok consumming more than 1 GB of RAM.
        Updated: 2020-10-02

        iconservices in Mojave can run amok and use many GB of memory. I've seen it consume more than the physical 96 GB on my Mac Pro. This extreme memory usage causes excessive paging, slowing the Mac to a crawl and making the GUI unusable.

        Apple never fixed the bug(s) that caused this in Mojave. I don't know if the problem still exists in Catalina.

        I wrote this launch daemon to monitor iconservices memory usage and reset it when it exceeds 1 GB of RAM. On my Mac Pro iconservices normally uses from a few MB to a couple of hundred MB.

        The included README.txt has more details.
      • Set Microsoft Office Preferences
        A bash script to set Microsoft Office 2019/365 preferences for uploading diagnostic data et al.
        Microsoft's web site states that Office 2019/365 does not upload any document content. Previously Microsoft stated that "Send full diagnostic data" could upload memory dumps containing content from open documents.

        To comply with United States' HIPAA rules no PHI (Personal Health Information) can be uploaded to Microsoft. Since open documents may contain PHI their memory content cannot be uploaded to Microsoft.

        Given Microsoft's history on factual disclosures concerning privacy and data collection, it's safest to minimize what's uploaded to Microsoft.

        Some previous Office updates have reset preferences to the defaults. I've seen "Send basic diagnostic data" get reset to the default "Send full diagnostic data". To be safe, run this script after every month's Patch Tuesday Office updates.

        The beginning of the script has more documentation. Help is available by running the script with -h for a summary or -hd for details.
      • Set “noatime” on Non-Boot Volumes
        Updated: 2020-10-27. A Launch Daemon that sets the noatime attribute for drives not mounted at boot.
        Updated: 2020-10-27

        noatime is short for "no access time."

        From mount's man page:
        noatime - Do not update the file access time when reading from a file. This option is useful on file systems where there are large numbers of files and performance is more critical than updating the file access time (which is rarely ever important).

        noatime is also a good idea for SSDs to prevent unnecessary wear.

        The included README.txt has more details.
       RPi Python Scripts

      I've written some Python scripts for my Raspberry Pis.

      • Vital Signs
        Multi-purpose monitoring tool displaying on a Sense Hat. Measures CPU loads (per core), RAM usage, temperature, humidity, and pings hosts to see if they're alive.

        Vital_Signs uses a Sense HAT's LEDs to display columns of:
        • The combined load % across all CPU cores, or
        • Each core's load %.
        • Memory available/unavailable
        • CPU temperature (C or F)
        • Sense HAT's temperature (C or F)
        • Sense HAT's % humidity

        Vital_Signs optionally displays ping results as OK/fail for up to 8 computers.

        The data is organized by column. The Sense HAT's LED array is organized by row. The least-complicated programming methodology is to map columns to the LED array's rows. The first row at the top becomes the left column.

        The terms "LED" and "pixel" are used interchangeably. In most cases LED is used when referencing hardware and pixel is used for arrays. #

        The columns appear 90 degrees clockwise from the rows. To see the columns in the row's orientation the columns' LED array is rotated -90 (270) degrees.

        I went overkill on features, the interface is way to busy. I did this to hone my programming skills in Python, Raspbian, the Python IDE, and the Sense HAT.

        The Ping Hosts feature runs as an independent thread on its own update schedule. That way if it gets delayed waiting for responses the
        main display will update on schedule. The main thread displays the ping results regardless of how far through its cycle the Ping Hosts thread is.

        The Apple logo is displayed because "I'm a Mac". My Raspberry Pi's run headless (without a display, mouse, or keyboard). I control them using VNC Viewer on my Mac.

        Details are in the script's comments.
      • JavaScript Obfuscater
        JavaScript Obfuscater is a drag & drop AppleScript application that makes JavaScript extremely difficult to read. Hopefully reverse engineering the obfuscated code would take more time than writing it from scratch.
        JavaScript Obfuscater:
        • Removes all comments
        • Changes variables and constants to random names
        • Makes every line as close to 255 characters as possible.

        JavaScript Obfuscater does not modify the original file, it creates a new file in the same location as the original with the same name prefixed with JO_.
      • Timestamper
        Two drag & drop AppleScript apps for timestamping file & folder names. One app adds a prefix, the other adds a suffix. I prefer the prefix because files listed in alphabetical order are in chronological order.
        zz_Timestamper_Prefix and zz_Timestamper_Suffix are AppleScript applications. They add a date-time stamp as either a prefix or a suffix to items dropped on them.

        Drag & drop any number of files & folders onto one of the two zz_Timestamper's icon: they will all be renamed using the same date-time stamp. The contents of sub-folders dropped on zz_Timestamper_are not renamed.

        A file named Foo.txt dropped on the Prefix app would be renamed to:
             2020-02-12 12;34;56 Foo.txt

        A file named Moo.txt dropped on the Suffix app would be renamed to:
             Moo 2020-02-12 12;34;56.txt

        By prefixing a filename with the YYYY-MM-DD HH;MM;SS format files listed in alphabetical order are in chronological order. The date-time stamp's characters are compatible with Mac, Windows, and Linux/Unix.
    My degree is in Computer Science. I'll post some musings eventually.