Coding More

With a new1 tech job this year, I have been focused on learning.2 With that, I have also been focused on sharing.

I am a long-time fan (and paying customer) of Brett Terpstra. He sets a high bar—the gold standard IMHO—for Mac developers. He shares of a combination of polished paid apps with a generous helping of open source apps for anyone to enjoy and use. Another font of knowledge I am grateful for is the mysterious Dr. Drang with his focus on Python and LaTeX, a personal joy of mine.3

My goal is to follow in his example.

My GitHub account is shared at the top of every page on this site. Recent additions include:

  • lipsum – a “lorem ipsum” generator,
  • repo-update – a simple tool to update all of the git repositories in a given directory, and
  • zsh-setup-scripts – scripts for macOS and Linux to set up zsh with my preferred bells and whistles.

I’m filling my GitHub repos with works in progress,4 so use at your own risk. Remember, I’m learning. I hope we can learn together and contribute to The Greater Good!


  1. Is it still new if I started in January? I think so.  ↩
  2. A wide gamut of stuff that includes PHP, JS, Python, HTML, CSS while dipping my toe in Swift.  ↩
  3. Though I have little need for precise typesetting, I love everything about it!
  4. Seriously everyone. Use with caution unless otherwise noted. I don’t want to break your stuff!  ↩

Credit Application Process

We need a little help with some upcoming veterinary bills. For the first time in many years, I sought a line of credit to help with these new expenses. After finding a provider online and completing the application, I was provided with an application reference number and told to call Phone Number #1 to complete the application process. I dialed the number to hear a robot announce three options:

  1. Press 1 if you have account
  2. Press 2 to check status of an application
  3. Press 3 to apply for a new account

The last two choices already offer some confusion because I am calling to “check the status” of an application for a “new account.” I went with Option 2, which turned out to be the correct option, and the robot voice told me to hang up and dial Phone Number #2 to continue.

OK? Why couldn’t we just do this here and now? Anyway…

I hang up and call the next number and get to talk to a real person. The operator mostly asks me questions I already answered in the online application. When she was satisified, she told me to continue verification from a mobile device with a camera at a second website.

Once there, I was immediately prompted to share my location (denied!) and forced to provide access to my camera to take a “3D” video of my lovely mug. After that, I was required to share clear photos of the front and back of my photo ID. Now I get a 9-digit transaction number. Note that this is different from the 11-character application reference number I got earlier after completing the online application.

Great! I’m finished now, right?

Nope. When I finish sharing all of my private information for the third time I am prompted to call a third number at Phone Number #3 (these are all different phone numbers) where a second operator asks me for a “number.” I assume he wants the most recent number, the transaction number provided after sharing my video and photos. Wrong! He told that’s the wrong number and was apparently requesting the first number. It turns out the second transaction number was useless to this process.

He goes on to confirm the information I already shared:

  • in my online application on the first website,
  • with the first operator, and
  • with the video and photos shared in the second website.

Finally, after two websites, three phone numbers, two human operators, and a robot, my application was approved. I mentioned to the last human I spoke with how odd this process felt. He said it was for security to prevent identity theft. Maybe so, I told him, but I certainly didn’t feel safer having provided my personal information to so many people in so many different places. He apologized for that and wished me a nice day.

Are all applications like this now?

Linode-CLI Help Summary

This is a summary of the help files for linode-cli commands and is not intended to be helpful beyond letting fellow Linode users review what is possible from the terminal. For full documentation and support, visit Linode’s Tools – Linode CLI page.

Are you interested in hosting your work on Linode? Using this affiliate link to sign up would really help me out!

linodes

❯ linode-cli linodes --help
linode-cli linodes [ACTION]

Available actions:
┌───────────────────────┬──────────────────────────────────────────────┐
│ action                │ summary                                      │
├───────────────────────┼──────────────────────────────────────────────┤
│ list                  │ Linodes List                                 │
│ create                │ Linode Create                                │
│ view                  │ Linode View                                  │
│ update                │ Linode Update                                │
│ delete                │ Linode Delete                                │
│ backups-list          │ Backups List                                 │
│ snapshot              │ Snapshot Create                              │
│ backups-cancel        │ Backups Cancel                               │
│ backups-enable        │ Backups Enable                               │
│ backup-view           │ Backup View                                  │
│ backup-restore        │ Backup Restore                               │
│ boot                  │ Linode Boot                                  │
│ clone                 │ Linode Clone                                 │
│ configs-list          │ Configuration Profiles List                  │
│ config-create         │ Configuration Profile Create                 │
│ config-view           │ Configuration Profile View                   │
│ config-update         │ Configuration Profile Update                 │
│ config-delete         │ Configuration Profile Delete                 │
│ disks-list            │ Disks List                                   │
│ disk-create           │ Disk Create                                  │
│ disk-view             │ Disk View                                    │
│ disk-update           │ Disk Update                                  │
│ disk-delete           │ Disk Delete                                  │
│ disk-clone            │ Disk Clone                                   │
│ disk-reset-password   │ Disk Root Password Reset                     │
│ disk-resize           │ Disk Resize                                  │
│ firewalls-list        │ Firewalls List                               │
│ ips-list              │ Networking Information List                  │
│ ip-add                │ IPv4 Address Allocate                        │
│ ip-view               │ IP Address View                              │
│ ip-update             │ IP Address Update                            │
│ ip-delete             │ IPv4 Address Delete                          │
│ migrate               │ DC Migration/Pending Host Migration Initiate │
│ upgrade               │ Linode Upgrade                               │
│ nodebalancers         │ Linode NodeBalancers View                    │
│ linode-reset-password │ Linode Root Password Reset                   │
│ reboot                │ Linode Reboot                                │
│ rebuild               │ Linode Rebuild                               │
│ rescue                │ Linode Boot into Rescue Mode                 │
│ resize                │ Linode Resize                                │
│ shutdown              │ Linode Shut Down                             │
│ transfer-view         │ Network Transfer View                        │
│ volumes               │ Linode's Volumes List                        │
│ types                 │ Types List                                   │
│ type-view             │ Type View                                    │
└───────────────────────┴──────────────────────────────────────────────┘

accounts

❯ linode-cli account --help
linode-cli account [ACTION]

Available actions:
┌─────────────────────┬───────────────────────────┐
│ action              │ summary                   │
├─────────────────────┼───────────────────────────┤
│ view                │ Account View              │
│ update              │ Account Update            │
│ cancel              │ Account Cancel            │
│ invoices-list       │ Invoices List             │
│ invoice-view        │ Invoice View              │
│ invoice-items       │ Invoice Items List        │
│ logins-list         │ User Logins List All      │
│ login-view          │ Login View                │
│ maintenance-list    │ Maintenance List          │
│ notifications-list  │ Notifications List        │
│ clients-list        │ OAuth Clients List        │
│ client-create       │ OAuth Client Create       │
│ client-view         │ OAuth Client View         │
│ client-update       │ OAuth Client Update       │
│ client-delete       │ OAuth Client Delete       │
│ client-reset-secret │ OAuth Client Secret Reset │
│ payments-list       │ Payments List             │
│ payment-create      │ Payment Make              │
│ payment-view        │ Payment View              │
│ promo-add           │ Promo Credit Add          │
│ settings            │ Account Settings View     │
│ settings-update     │ Account Settings Update   │
│ enable-managed      │ Linode Managed Enable     │
│ transfer            │ Network Utilization View  │
└─────────────────────┴───────────────────────────┘

tickets

❯ linode-cli tickets --help
linode-cli tickets [ACTION]

Available actions:
┌─────────┬──────────────────────┐
│ action  │ summary              │
├─────────┼──────────────────────┤
│ list    │ Support Tickets List │
│ create  │ Support Ticket Open  │
│ view    │ Support Ticket View  │
│ close   │ Support Ticket Close │
│ replies │ Replies List         │
│ reply   │ Reply Create         │
└─────────┴──────────────────────┘

events

❯ linode-cli events --help
linode-cli events [ACTION]

Available actions:
┌───────────┬────────────────────┐
│ action    │ summary            │
├───────────┼────────────────────┤
│ list      │ Events List        │
│ view      │ Event View         │
│ mark-read │ Event Mark as Read │
│ mark-seen │ Event Mark as Seen │
└───────────┴────────────────────┘

volumes

❯ linode-cli volumes --help
linode-cli volumes [ACTION]

Available actions:
┌────────┬───────────────┐
│ action │ summary       │
├────────┼───────────────┤
│ list   │ Volumes List  │
│ create │ Volume Create │
│ view   │ Volume View   │
│ update │ Volume Update │
│ delete │ Volume Delete │
│ attach │ Volume Attach │
│ clone  │ Volume Clone  │
│ detach │ Volume Detach │
│ resize │ Volume Resize │
└────────┴───────────────┘

nodebalancers

❯ linode-cli nodebalancers --help
linode-cli nodebalancers [ACTION]

Available actions:
┌────────────────┬─────────────────────┐
│ action         │ summary             │
├────────────────┼─────────────────────┤
│ list           │ NodeBalancers List  │
│ create         │ NodeBalancer Create │
│ view           │ NodeBalancer View   │
│ update         │ NodeBalancer Update │
│ delete         │ NodeBalancer Delete │
│ configs-list   │ Configs List        │
│ config-create  │ Config Create       │
│ config-view    │ Config View         │
│ config-update  │ Config Update       │
│ config-delete  │ Config Delete       │
│ config-rebuild │ Config Rebuild      │
│ nodes-list     │ Nodes List          │
│ node-create    │ Node Create         │
│ node-view      │ Node View           │
│ node-update    │ Node Update         │
│ node-delete    │ Node Delete         │
└────────────────┴─────────────────────┘

object-storage

❯ linode-cli object-storage --help
linode-cli object-storage [ACTION]

Available actions:
┌───────────────┬────────────────────────────────────┐
│ action        │ summary                            │
├───────────────┼────────────────────────────────────┤
│ clusters-list │ Clusters List                      │
│ clusters-view │ Cluster View                       │
│ keys-list     │ Object Storage Keys List           │
│ keys-create   │ Object Storage Key Create          │
│ keys-view     │ Object Storage Key View            │
│ keys-update   │ Object Storage Key Update          │
│ keys-delete   │ Object Storage Key Revoke          │
│ cancel        │ Object Storage Cancel              │
│ ssl-view      │ Object Storage TLS/SSL Cert View   │
│ ssl-upload    │ Object Storage TLS/SSL Cert Upload │
│ ssl-delete    │ Object Storage TLS/SSL Cert Delete │
└───────────────┴────────────────────────────────────┘

domains

❯ linode-cli domains --help
linode-cli domains [ACTION]

Available actions:
┌────────────────┬───────────────────────┐
│ action         │ summary               │
├────────────────┼───────────────────────┤
│ list           │ Domains List          │
│ create         │ Domain Create         │
│ view           │ Domain View           │
│ update         │ Domain Update         │
│ delete         │ Domain Delete         │
│ zone-file      │ Domain Zone File View │
│ import         │ Domain Import         │
│ clone          │ Domain Clone          │
│ records-list   │ Domain Records List   │
│ records-create │ Domain Record Create  │
│ records-view   │ Domain Record View    │
│ records-update │ Domain Record Update  │
│ records-delete │ Domain Record Delete  │
└────────────────┴───────────────────────┘

lke

❯ linode-cli lke --help
linode-cli lke [ACTION]

Available actions:
┌───────────────────────┬───────────────────────────────┐
│ action                │ summary                       │
├───────────────────────┼───────────────────────────────┤
│ clusters-list         │ Kubernetes Clusters List      │
│ cluster-create        │ Kubernetes Cluster Create     │
│ cluster-view          │ Kubernetes Cluster View       │
│ cluster-update        │ Kubernetes Cluster Update     │
│ cluster-delete        │ Kubernetes Cluster Delete     │
│ pools-list            │ Node Pools List               │
│ pool-create           │ Node Pool Create              │
│ cluster-nodes-recycle │ Cluster Nodes Recycle         │
│ pool-view             │ Node Pool View                │
│ pool-update           │ Node Pool Update              │
│ pool-delete           │ Node Pool Delete              │
│ pool-recycle          │ Node Pool Recycle             │
│ node-view             │ Node View                     │
│ node-delete           │ Node Delete                   │
│ node-recycle          │ Node Recycle                  │
│ api-endpoints-list    │ Kubernetes API Endpoints List │
│ kubeconfig-view       │ Kubeconfig View               │
│ kubeconfig-delete     │ Kubeconfig Delete             │
│ versions-list         │ Kubernetes Versions List      │
│ version-view          │ Kubernetes Version View       │
└───────────────────────┴───────────────────────────────┘

Writing From Now On

For years as a curious nerd with an affinity for computers I have hopped from one writing platform to another.

In my early years, those included word processors including Microsoft Word, Nisus Writer (the classic version for MacOS 9 and earlier), ClarisWorks (same, obviously), and others. At some point, probably around the time I discoverd Markdown, my paradigm shifted from WYSIWYG to text editors. Those included BBEdit, Sublime Text on macOS and dabbling in Ulysses, Byword, and AI Writer for their cross-platform compatibility with macOS and iOS. Some software like Scrivener fit in between.

For my own sanity at age 50, I need to put stake in the ground.

BBEdit is my text editor of choice and that is where I will write. I don’t use word processors at all unless I have specific formatting needs for print and that is rarely the case. I enjoy Ulysses for it’s syncing across my Mac and iPhone, that rarely comes into play and I don’t like how it hides Markdown (which is designed to be easy to read in plain text). I also have a heretofore unmentioned intermediary app that is also cross-platform and more useful. That app is Drafts.

Drafts not only syncs across macOS and iOS, but offers dictation from watchOS, making any idea ready to be accepted by typing or speaking to any of the platforms I enjoy.

For the record:

  1. I will continue to use MarsEdit to manage my posts to WordPress because it’s awesome (also available via Setapp). If you like what you see at Setapp, which provides access to more than 100 great Mac apps, please sign up using this affiliate link to help me keep running this site.
  2. LaTeX (particularly MacTeX) still has a place in my heart if not my current publication medium.

Doing to Track What I’m Doing

A computer is in front of me most of every day, but I’m terrible at knowing what I’ve accomplished there. It’s a source of play and work (which is often itself a sort of play).

My platform of choice is macOS split with work in Ubuntu linux at the terminal. As a longtime “computer aficionado,” of the Apple variety, I found myself drawn to Brett Terpstra1 for his amazing work on the platform.2 One of the projects he has shared with the world is doing, a command line tool for tracking what you’re, uhm, doing.

I’ve had this app installed for years, but never really built a habit of using it regularly. My most recent career change requires me to be a little more attentive to what I’m doing where and how much time I spend doing it. Since I’m in iTerm2 so often anyway, I am overdue to give it a proper spin.

Once installed,3 just type doing now the thing you're doing and it creates a timestamped log entry. There are options for backdating tasks as well as annotating, archiving, tagging entries that can be accessed, exported, and shared in a number of ways. Used properly, which is my goal, doing can be used to accurately track your time devoted to each task.

For now, I’m studying up and sharing these possibilities with you. I plan to throw myself into using it for real next week.


  1. Known as @ttscoff most places online. 
  2. Seriously, just look at all of the projects Brett has shared with us! 
  3. Brett provides a generous wiki with full documentation in addition to extensive help within the app by typing doing help

Tricking Out iTerm2

The new year brought with it a new job for me as a full stack developer for Webinology,1 a small firm in Chattanooga, Tenn. I’ve always been a fan of linux, appreciate that macOS is built atop BSD, and have long been comfortable at the command line. While Apple provides Terminal.app, I’ve always preferred applications I can fully customize. Years ago, I found the best app for working in a shell is iTerm2.

Before my new professional role, I would only dip into iTerm2 occasionally to log into my Linode server or maintain a few apps installed with Homebrew. Now that I spend a good deal more time typing commands at a shell prompt, I decided it was time to pimp my ride.

Setting the Baseline

Apple switched the default shell from bash to zsh some time ago and that was just fine with me. As everyone should, I’ve installed oh-my-zsh (Links to site and GitHub) on top of the shell to easily enhance the environment.

Once oh-my-zsh is installed, it’s easy to enable plugins. For me, after some configuration, those include docker-compose, git, extract, zsh-autosuggestions, and zsh-syntax-highlighting. I also use the popular powerline10k theme.

iTerm Settings

There is a lot to fiddle with in iTerm’s settings window. My most important customizations are under the Profiles tab in my Default Profile. I’ve chosen the Calamity theme to set my colors and use the font MesloLGS NF to prettify the Powerline10k prompt.

Alternate Apps

I have “upgraded” a handful of command line apps to enjoy their feature enhancements for common tasks.

  • exa is a replacement for ls
  • bat is a replacement for cat

Aliases

Aliases are a great way for users in any shell to save long commands to short ones that are easier to type. They also provide an easy way to replace default apps like those mentioned above. For example, instead of typing ls -laFh, I type ll. Not only is it shorter and easier to type, it actually invokes exa. All I had to do was add a line to my ~/.zshrc file.

alias ll='exa -l --icons --no-user --group-directories-first --time-style long-iso'

To include hidden .dot files, I type lll, which actually sends this.

alias lll='exa -la --icons --no-user --group-directories-first --time-style long-iso'

Another good use of aliases is to help you remember IP addresses. For instance, when I type linode, it logs into my Linode server by sending something like this:

ssh user@123.123.123.123

  1. I speak for myself, all comments my own, blah blah blah. 

New Job, New Perspective

Soon after New Year’s Day I started a new job as what is easiest to describe as full stack developer.

I turned 50 in February and have learned more in the past two months than any other point in my life. I bought books on Linux (to refresh my memory) and a great book on PHP & MySQL.1 My employer, Webinology bought me a book on GitLab to learn more about CI/CD.

We don’t have a brick & mortar office so I work 100 percent from home. My coworkers are awesome. I get to do the very work I’ve been tinkering with for fun since I was in my 20s. Dreams come true!

Never stop learning!


  1. True story: I searched for a book on these topics on Feb. 15, the very day that book was published. You can buy it on Amazon with this PHP & MySQL affiliate link. Talk about Karma!

Mullenweg Interview

The Verge published a great interview with Automattic CEO Matt Mullenweg. So quotable! Here are a few hotspots.

  • I try to make as few decisions as possible and really say, “How do we push that out to the teams, the divisions, the edges of the branches of the tree versus the trunk?” The assumption is that none of us are as smart as all of us [emphasis mine], so now what do we build in there?
  • “Reversible decisions quickly, and irreversible decisions deliberately, or slowly.”
  • When we acquired it, Tumblr had a backload of 80,000 support tickets.
    We got that to zero just a few weeks ago.
  • AI on its own can be bad, humans on their own aren’t as good as AI at some things, but when you combine them, you can actually get superhuman results — better than either on their own.

He’s one smart dude and I think he has great ideas for growing the web and the world in the right direction.

Beginning to Understand DNS

Montreal developer Julie Evans has been publishing information about the Domain Name System (DNS) that is easier to understand than anything I’ve read before. If you’re interested in learning more about the topic, check out these articles:

This “series” (my term, not hers) is up-to-date as of February 15, 2022. There may be more articles to come, so subscribe to Julie Evans’ Blog.

Updated 2022-02-15 to added recent related post to series list.