SEPTEMBER 23, 2022

Today, I discovered Adobe is introducing Project Shasta, a web-based AI-powered audio recording and editing tool. You can request access now.

It seems their intention is not only to provide AI-based audio editing and recording but also to cover the ground of what Riverside already offers.

Remote recording - Recording with others is as easy as sharing a link. Everyone’s audio is recorded in high quality locally, then Project Shasta syncs it back together in the cloud automatically.

"Soon to come features" list things we can already find in Descript, such as filler word removal or speech enhancement. And features already available in the beta include microphone checking for optimal quality and microphone distance, AI-powered audio, remote recording with guests, and project templates.

I was waiting to see what Adobe's take on AI-based audio editing and recording was, and it seems it's here. At the moment the project is referred to as Shasta; I imagine these capabilities either format a new product offering or are integrated with existing tools like Audition, Premiere, or After Effects.

What do you think?

SEPTEMBER 22, 2022

OpenAI has open-sourced Whisper, a real-time speech transcription system.

"We’ve trained and are open-sourcing a neural net called Whisper that approaches human level robustness and accuracy on English speech recognition."

SEPTEMBER 21, 2022

Let's create two files with incremental content.

echo "Hello," > a
echo "Hello, Nono\!" > b

Then show their diff in Visual Studio Code.

code --diff a b

A VSCode window comparing the two files we created will open.

SEPTEMBER 19, 2022

Today OpenAI sent a message to DALL·E's users saying "you can now upload and edit photos with faces with DALL·E," which had been forbidden for a while due to the concerns stated in the communication.

Many of you have told us that you miss using DALL·E to dream up outfits and hairstyles on yourselves and edit the backgrounds of family photos. A reconstructive surgeon told us that he’d been using DALL·E to help his patients visualize results. And filmmakers have told us that they want to be able to edit images of scenes with people to help speed up their creative processes.

With improvements in our safety system, DALL·E is now ready to support these delightful and important use cases – while minimizing the potential of harm from deepfakes.

We made our filters more robust at rejecting attempts to generate sexual, political, and violent content – while also working to reduce false flags – and built new detection and response techniques to stop misuse.

Our content policy still prevents uploading images of anyone without their consent, or images that you do not have the rights to.

We hope this update helps you use DALL·E in even more creative and practical ways. We’re excited to see what you create!

—The OpenAI Team

SEPTEMBER 18, 2022

Scanning my sketches is one of the many tedious processes I have to do as part of my creative workflow that create friction. I don't feel like doing it, ever. But it's convenient to have high-resolution scans of my drawings on Dropbox available when I need them.

Instead of scanning them on demand—when I intend to use them—I like to scan all pages of my sketchbooks as I fill them. That way, I don't stress out too much if I ever loose my sketchbook as I can create high-fidelity reproductions of my drawings with 1200 dpi scans.

SEPTEMBER 17, 2022

I've listened to a few episodes of The Talk Show with John Gruber lately. Specifically, the ones with Craig Mod and Daniel Jalkut. It had been a good while.

I enjoy the relaxed, maybe natural, mood of his conversations. There's no apparent structure other than two people talking, although I'm sure Gruber brings ideas about what he wants to discuss with the guest as we all do; maybe that have been topics loosely agreed upon with the guest but aren't necessarily forced. He probably reverse-engineers episode markers from whatever was talked about in each podcast.

Another thing that caught my attention is the Sponsor blocks. He introduces these ad sections irregularly from episode to episode, without an apparent structure.

I remember the old days when I discovered Daring Fireball—Gruber's blog. The site looks the same today as it did back then and continues to serve its function perfectly. The blog's Weekly Sponsorship program costs $10,500 a week1 and is usually sold out a few weeks in advance. "[T]he only way to promote your product or service specifically to Daring Fireball’s audience of Mac nerds, designers, nitpickers, perfectionists, and connoisseurs of fine sarcasm."

I wonder how expensive podcast placements on The Talk Show are.

I'm used to shows like Tim Ferris or Lex Fridman's, where conversations are often geared toward specific questions, and to my show—Getting Simple—which drags from the style of my favorite and most-listened podcasts out there.

Indeed, my home page borrows from his way of linking to external sources directly from the post title, creating a permalink with the post date (while he does so with the star symbol), and linking to that permalink from the title when the post doesn't contain an external link.

I guess it's only possible to make a living out of blogging and podcasting when you accrue such an audience; 80,000–100,000 weekday page views, 2.5 million monthly, and over 200,000 RSS feed subscribers.

  1. Inflation? The price is up from $9,750 as it was back on May 17, 2022. 

SEPTEMBER 16, 2022

Hi, friends! We're back.

I introduced the start of Season 3 in Live 84.

In this new season, I'll continue to release Getting Simple podcast episodes and explore a wide range of technologies in the form of live streams and video tutorials.

Here's what I talked about yesterday.

  • The recording studio is gone
  • OBS Studio 28 brought support for Apple Silicon chips
  • New camera: ZV-E10
  • A new tool to record podcasts online, which imports into Descript
  • Stream Deck XL: Nice workflow for creating markers live
  • Videos uploaded during the break
  • What’s happened during the break: stable diffusion, DALL-E, Midjourney
  • Incoming podcast episode

You can spread the word by liking and sharing this tweet.

If this is something that interests you, please let me know on Twitter or, even better, on the Discord community.

Thanks for watching.

See you next week!

SEPTEMBER 15, 2022

Today, I encountered this error while joining a Zoom meeting for our team's standup.

An error occurred.
Sorry, the page you are looking for is currently unavailable.
Please try again later.

If you are the system administrator of this resource then you should check the error log for details.

Faithfully yours, nginx.

I went on and shared on Hacker News under the title Zoom Is Down.

Within ten minutes, my submission was in the front page of Hacker News. (The highest I've seen it is number six.)

SEPTEMBER 14, 2022

Yesterday, a colleague of mine shared Toras, the Toronto Annotation Suite, which reminded me of Microsoft's VoTT. But this one has AI-assisted labeling, ala Photoshop smart selection.

SEPTEMBER 12, 2022

Dropbox for macOS is at version 156.4.4908, and it works great.

OneDrive is a nightmare though, and I don't quite understand why that is.

That means Dropbox has shipped hundreds of major and minor releases over the past decade, mostly to keep it working the same.

SEPTEMBER 10, 2022

List existing keys added to the SSH agent.

ssh-add -l
# The agent has no identities.

Create a new EdDSA key1.

ssh-keygen -t ed25519 -C ""
# Generating public/private ed25519 key pair.
# Enter file in which to save the key (/Users/john/.ssh/id_ed25519):               
# Enter passphrase (empty for no passphrase): 
# Enter same passphrase again: 
# Your identification has been saved in /Users/john/.ssh/id_ed25519
# Your public key has been saved in /Users/john/.ssh/
# The key fingerprint is:
# SHA256:CPtr5U4xCPT1Ypssz0L/bIn7+l2gNMVe1Bkh2H8tB6w
# The key's randomart image is:
# +--[ED25519 256]--+
# |        .o*B= oo.|
# |         *o++= ..|
# |        =.B .+o  |
# |       o B Eo.o  |
# |        S o  +.  |
# |       . .  + .. |
# |        .   .+.o.|
# |           . ++++|
# |            .+*.*|
# +----[SHA256]-----+

Here's how to copy the public key to the clipboard on macOS Terminal.

cat /Users/john/.ssh/id_ed25519 | pbcopy
# ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOMe/yQPuB7k4MO6pL9c+03YHXKc3q/LLvaUED24Vu6P

Your public key can be added to services like GitHub or Bitbucket for remote Git pull/push access or Linux machines via SSH.

For instance, you'd add that output as a New SSH Key to GitHub at

  1. According to Goteleport, "the [key type] choice is between RSA 2048/4096 and Ed25519 and the trade-off is between performance and compatibility. RSA is universally supported among SSH clients while EdDSA performs much faster and provides the same level of security with significantly smaller keys." 


Today, I got the first kernel panic on my new Mac machine running macOS Monterey.

panic(cpu 3 caller 0xfffffe0022cf8a54): "Just destroyed an active LRU node!" @Lru.h:26

I don't have a solution, but a former laptop I bought, a 13-inch MacBook Pro (M1, 2020), had to replace the motherboard after running into successive kernel panics. I hope that's not the case this time.


I spent some time looking for a solution to change the location of Visual Studio Code’s settings.json file without any luck.

But I found a solution.

Visual Studio Code’s settings JSON file is always located at the same path.

~/Library/Application\\ Support/Code/User/settings.json

The way I worked around this limitation is by creating a symbolic link from this path to another file. In my case, I place settings.json on a Dropbox folder that is synchronized across my computers.

ln -s \
~/Dropbox/settings/vscode/settings.json \
~/Library/Application\\ Support/Code/User/settings.json


Here's the release message you can find the first time you open the fresh release of OBS Studio 28.

My two highlights as a macOS user are native Apple Silicon support and obs-websockets as a first-party plugin. (Here's a list of OBS WebSocket clients.)

NOTE: Some plugins may not be compatible with OBS 28. You can check the status of the most common plugins on the OBS Plugin Compatibility page.

Welcome to OBS Studio 28, celebrating the 10th anniversary of OBS! 10 years ago, the first version of OBS was released by Jim. Today, we have hundreds of contributors and countless users. We're very grateful for all the support, and we're happy that so many people find it useful! This release comes with a ton of new features, all of which can be found in the release notes, but we've highlighted a few here.

First, and probably the biggest change, is that we now have HDR support! You can play games in HDR and OBS will automatically tonemap the content to SDR. If you want to capture and record HDR content, this is now possible with the appropriate HDR settings. See the release notes for a basic overview and how to set OBS correctly for HDR.

For our Apple M1/M2 users, native Apple Silicon support is here! OBS is now available as an ARM64 app for macOS, running without Rosetta. Also available for our Apple friends on macOS 12.5+ is the new ScreenCaptureKit, which improves the experience in capturing both individual windows and the display. For those on macOS 13+, direct audio capture is also available.

NVIDIA Background Removal is now available for RTX GPUs on Windows. This allows you to remove the background from your camera without a physical greenscreen.

We’ve added a new, more efficient and up-to-date implementation of the AMD encoder on Windows. This update improves performance and provides access to new encoder features.

A long time coming, obs-websocket is now part of OBS as a first-party plugin! This makes it easier to get up and running with tools that interact with obs-websocket. You can find more information here:

If you would like to support the OBS Project, please consider contributing to our Patreon or Open Collective!


Here's how to round a decimal float number to two decimals in TypeScript.

// Returns 123.46

Of course, you could change toFixed(2) to any number to keep as many decimals as you wanted.


Today was my last day of vacation.

Most of what I've published during August was scheduled in advance.

It will take some effort to get back to my daily work habits.

But we'll get there.

It's nice to see you again.


Here's how to convert a string from CamelCase to snake_case in Python with regular expressions.

import re

# Option 1
regex = r'(?<!^)(?=[A-Z])'
re.sub(regex, '_', 'GettingSimple', 0).lower()
# returns 'getting_simple'

# Option 2
pattern = re.compile(r'(?<!^)(?=[A-Z])')
pattern.sub('_', 'nonoMartinezAlonso').lower()
# returns 'nono_martinez_alonso'

See how to Convert from snake_case to camelCase.


Here's how to remove a remote Git branch without using an app or a website user interface, say, GitHub or GitLab.

# Delete a remote Git Branch (assuming your remote is called origin)
git push origin --delete your-branch-name
# To
#  - [deleted]         your-branch-name

Remember that you will also have to delete the Git branch from your local repository as follows.

# Delete a local branch
# -d is a shorthand for --delete
git branch -d your-branch-name
# Deleted branch your-branch-name (was f9b622c).

# Force delete a local branch (regardless of the branch merge status)
# -D is a shorthand for --delete --force
git branch -D your-branch-name
# Deleted branch your-branch-name (was f9b622c).


Here's how to remove a local Git branch.

# Delete a local branch
# -d is a shorthand for --delete
git branch -d your-branch-name
# Deleted branch your-branch-name (was f9b622c).

# Force delete a local branch (regardless of the branch merge status)
# -D is a shorthand for --delete --force
git branch -D your-branch-name
# Deleted branch your-branch-name (was f9b622c).

Remember that you will also have to delete the Git branch from your remote repository as a separate step.

Here's how to remove a remote Git branch without using an app or a website user interface, say, GitHub or GitLab.

# Delete a remote Git Branch (assuming your remote is called origin)
git push origin --delete your-branch-name
# To
#  - [deleted]         your-branch-name

AUGUST 31, 2022

I run the following command to clean up unneeded old Homebrew kegs on macOS.

brew cleanup --prune=all

But often get this error.

Error: Could not cleanup old kegs! Fix your permissions on:

Here's the tail of what the command returns when there are permissions issues.

==> This operation has freed approximately 395MB of disk space.
Error: Could not cleanup old kegs! Fix your permissions on:

The fix

brew won't use root permissions for any operations.

This is what you'll see if you try to cleanup with root.

sudo brew cleanup --prune=all                                                   
# Error: Running Homebrew as root is extremely dangerous and no longer supported.
# As Homebrew does not drop privileges on installation you would be giving all
# build scripts full access to your system.

What you have to do is to change the ownership of the problematic directories to your username instead of root.

You can do that with sudo chown -R "$USER":admin /conflicting/dir.

To solve the issues shown in my error above, I ran the following commands.

sudo chown -R "$USER":admin /opt/homebrew/Cellar/dnsmasq/2.85
sudo chown -R "$USER":admin /opt/homebrew/Cellar/php/8.1.1
sudo chown -R "$USER":admin /opt/homebrew/Cellar/php/8.1.1.reinstall
sudo chown -R "$USER":admin /opt/homebrew/Cellar/php/8.1.3_1
sudo chown -R "$USER":admin /opt/homebrew/Cellar/php/8.1.4.reinstall
sudo chown -R "$USER":admin /opt/homebrew/Cellar/php@7.4/7.4.21_1
sudo chown -R "$USER":admin /opt/homebrew/Cellar/php@7.4/7.4.27.reinstall
sudo chown -R "$USER":admin /opt/homebrew/Cellar/php@7.4/7.4.28_1.reinstall
sudo chown -R "$USER":admin /opt/homebrew/Cellar/php@8.0/8.0.14

Then run brew cleanup --prune=all again and everything should work.

AUGUST 29, 2022

You can use the parse_url built-in PHP method to break down a URL into its components.

here's the method itself.

parse_url(string $url, int $component = -1): int|string|array|null|false

And here's how to use it.

// [
//     "scheme" => "https",
//     "host" => "",
//     "path" => "/podcast",
// ]

You can then obtain the scheme, host, or path of a URL.

$components = parse_url("");

$scheme = $components["scheme"];
// "https"

$host = $components["host"];
// ""

$path = $components["path"];
// "/podcast"

AUGUST 28, 2022

Here's how to upgrade to a new version of PHP's Mongo extension if you previously installed it but you've upgraded to the latest PHP version. (If you haven't, see how to install it.)

Uninstall the existing mongodb extension.

sudo pecl uninstall MongoDB
# Extension mongodb disabled in php.ini
# uninstall ok: channel://

Then follow this guide to install it again for the latest PHP version.

AUGUST 27, 2022

Here's how to print the current date and time with bash.

date +%y%m%d_%H%M%S
# 220715_124140

You can store the timestamp on a variable.

DATE_NOW=$(date '+%y%m%d_%H%M%S')

And make use of it later on your command for clarity.

echo "Today is $DATE_NOW."
# Today is 220715_124805.

Note that you can customize the format of your date or timestamp by adjusting the formatting template.

Here's how the command works.

date +{formatting_code}

And here's a full list of options.1

# Gives name of the weekday as Mon, Sun, Fri
date +%a

# Gives name of the weekday as Monday, Sunday, Friday
date +%A

# Gives name of the month as Jan, Feb, Mar
date +%b

# Gives name of the month as January, February, March
date +%B

# Displays day of the month as 05
date +%d

# Displays current date MM/DD/YY format as 11-01-21
date +%D

# Shows date in YYYY-MM-DD format as 2021-11-01
date +%F

# Shows hour in 24-hour format as 22
date +%H

# Shows hour in 12-hour format as 11
date +%I

# Displays the day of the year as 001–366
date +%j

# Displays the number of the month as 01–12
date +%m

# Displays minutes as 00-59
date +%M

# Displays seconds as 00-59
date +%S

# Displays in Nanoseconds
date +%N

# Displays time as HH:MM:SS in 24-hour format
date +%T

# Day of the week as 1-7; 1 is Monday, 6 is Saturday
date +%u

# Shows week number of the year as 00-53
date +%U

# Displays year YYYY as 2021
date +%Y

# Displays time zone
date +%Z

To learn more about what you can do with the date command, run man date to print the manual.

AUGUST 26, 2022

I had installed an old version of Laravel Valet (2.18.10) on my system, and even when running composer global update, Valet wasn't being updated to the latest available version (3.1.9 at the time of this writing).

In theory, here's how you install and update laravel/valet.

# Install
composer global require laravel/valet

# Update
composer global update

But, as I mentioned above, my Valet installation was stuck at 2.18.10.

I forced composer to upgrade laravel/valet to the latest available version by specifying the ^3.0.0 constrain. (Note that this may lock your Valet version and not update in the future when ^4.0.0 is released.)

composer global require laravel/valet:^3.0.0
# Changed current directory to /Users/nono/.composer
# ./composer.json has been updated
# Running composer update laravel/valet
# Loading composer repositories with package information
# Updating dependencies
# Lock file operations: 0 installs, 1 update, 0 removals
#  - Upgrading laravel/valet (v2.18.10 => v3.1.9)
# Writing lock file
# Installing dependencies from lock file (including require-dev)
# Package operations: 0 installs, 1 update, 0 removals
#  - Upgrading laravel/valet (v2.18.10 => v3.1.9): Extracting archive
# Generating autoload files
# 15 packages you are using are looking for funding.
# Use the `composer fund` command to find out more!

Verify the installed version.

valet --version
# Laravel Valet 3.1.9

Inspecting Composer's global composer.json

You can get the path where your global composer.json is located, which defines your installed dependencies.

composer config data-dir
# /Users/nono/.composer

In that directory, you'll find composer.json.

cat $(composer config data-dir)/composer.json
# {
#     "require": {
#         "laravel/valet": "^3.0.0",
#         "laravel/installer": "^4.1"
#     }
# }

AUGUST 25, 2022

Here's how to locate the path of Composer's global composer.json, which defines the system packages installed and managed by Composer.

# Retrieve composer's data directory
composer config data-dir
# /Users/nono/.composer

# Print composer.json's contents
cat $(composer config data-dir)/composer.json
# {
#     "require": {
#         "laravel/valet": "^3.0.0",
#         "laravel/installer": "^4.1"
#     }
# }

AUGUST 24, 2022

Since Laravel Valet version 3, you can choose the specific PHP version a site should run on without the need to change Valet's global PHP version as in previous releases.

You can, for instance, run all your sites in PHP 8.1 but set specific legacy sites to run in PHP 7.4.

You'd set your global Valet PHP version.

valet use php@8.1

Then set the PHP version for a specific linked site.

# When the current folder matches the name of a linked site
valet isolate php@7.4

# Explicitly specifying a site name
valet isolate php@7.4 --site="my-app"

How to find a site's name

valet links
# +------+------------------+-------------------------+-------------+
# | Site | URL              | Path                    | PHP Version |
# +------+------------------+-------------------------+-------------+
# | gs   | http://gs.test   | /Users/.../gs-folio     | php@8.1     |
# | nono | http://nono.test | /Users/.../nonoma-folio | php@8.1     |
# +------+------------------+-------------------------+-------------+

The name of your site is listed in the Site column.

AUGUST 19, 2022

For a long time, I've tracked certain metrics in plain-text form, including weight, expenses, flights, and others. I use iA Writer because it synchronizes my notes across macOS and iOS devices. So I end up with Markdown (.md) files that are, in essence, a chronological database.

But I need a program to make sense of the data, parse it into an actual database, and visualize it in a graph that I can understand, such as a scatterplot.

I built a proof-of-concept from scratch almost a year ago, which I just open-sourced at I intend to develop it a bit more and host it online.

A previous prototype, really barebones, is live at

The idea is to drag and drop (or type) plain-text notes and visualize the data with a specific format as a scatterplot or other charts.

A sample note would look like this, containing both weights and currency amounts in euros. (Note the comments on the right side. That would be the data inferred from each line.)

2022                            # 2022.01.01

Aug                             # 2022.08.01

18                              # 2022.08.18

63.5kg                          # 63.5 kilograms

19                              # 2022.08.19

65kg                            # 65 kilograms
62.50€/2 #food @supermarket     # 31.25 euros

23                              # 2022.08.23

23€ #food @gusto                # 23 euros

AUGUST 18, 2022

It's okay if you didn't set aside time to do it or if you did it but didn't turn out how you expected.

You can try again tomorrow.

AUGUST 17, 2022

I just recorded a remote podcast interview with for the first time with Leire Asensio Villoria and David Mah.

Everything appears to have worked smoothly, and I've been able to export the one-and-a-half-hour session to Descript as a sequence using Riverside's automatic project creator.

I recorded a separate video track of myself in 2K (Quad HD) with OBS Studio using the Sony ZV-E10 camera and Elgato's HD60 S+ video capture device on a separate computer. I used a Logitech BRIO as my video feed in Riverside.

I fed the audio from my Shure SM7B into Riverside piping the Zoom PodTrak P4 via Audio Hijack and Loopback to create a virtual audio input device that can be selected from Riverside, applying a noise filter and recording the audio straight from the mic as a backup.

AUGUST 15, 2022

How often do you check analytics, bank accounts, notifications, followers, or email?

You can likely check it less often, and everything will stay the same.

Want to see older publications? Visit the archive.

Listen to Getting Simple .