Nono.MA

SEPTEMBER 29, 2022

This season of the Getting Simple podcast will feature episodes with Leire Asensio Villoria & David Mah, Zach Kron, Andy Payne, John Pierson, and Ian Keough.

SEPTEMBER 28, 2022

It's been great to see familiar faces in person and get to know peope I've been interacting with for years via social media and Zoom meetings.

Keep an eye on Kean's blog as he'll probably do a summary of his experience at Autodesk University 2022. He's been showcasing a 3d-printed bridge at the Expo.

SEPTEMBER 27, 2022

Idea generation versus execution

I can write two hundred words in five minutes.

Yet it takes me several hours to write particular two-hundred-word essays.

I write daily in my diary without a specific goal in mind other than capturing memories, facts, and thoughts. Then, I conduct review sessions in which I highlight passages worth developing further and deep writing sessions where I focus on turning drafts into publishable essays.

Generating ideas is cheap and fast.

It's curating, developing, and shipping those ideas that require the most time and effort.

SEPTEMBER 26, 2022

I'll be at Autodesk University 2022 in New Orleans this week. If you're around, let's meet!

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 20, 2022

Open for interpretation

The power of writing is universal: anyone has the potential to inspire others with their words.

But meaning—how people understand language—isn't universal.

Without the right words, you can inspire someone to do something you did not intend to or land the wrong message. Each individual brings language to their context and worldview.

Individual words and short phrases are open for interpretation, which is helpful in some instances. Nike's Just Do It and Apple's Think Different slogans inspire people to do sports and be creative. Short and abstract is not a bug in this case but a feature; everyone can adapt these messages to their lives.

When you want to ensure everyone gets the same picture—a set of instructions, a mission statement, a notice, a story—we need to remember that what's evident for the writer won't always be for the reader. Here's where redundancy comes into play: stating the obvious and the not-so-obvious helps a significant part of the readership to extract a similar meaning from a given message, leaving less room for interpretation.

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
  • Riverside.fm: 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 zoom.us 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 13, 2022

Habits and play

Nurture your habits, or they will rot.

Make room for play, or you'll get bored.

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 "your@email.com"
# 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/id_ed25519.pub
# 
# The key fingerprint is:
# SHA256:CPtr5U4xCPT1Ypssz0L/bIn7+l2gNMVe1Bkh2H8tB6w your@email.com
# 
# 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@email.com

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 github.com/settings/keys.


  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." 

SEPTEMBER 9, 2022

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.

SEPTEMBER 8, 2022

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

SEPTEMBER 7, 2022

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: obsproject.com/blog/obs-studio-and-obs-websocket-join-forces

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

SEPTEMBER 6, 2022

Summer content post-mortem

On July 12, I shared the things I wanted to ship in August and needed to prepare before going on vacation. A week later, I got COVID. As a result, I couldn't deliver all the content I had initially planned. Things don't always go according to plan.

I ended up publishing five sketches and mini-essays, twenty-three blog posts, and two videos and recorded a podcast episode which is still to be edited and released1.

In August, I disconnected from the digital world and started returning to work yesterday. I deliberately stuck with two daily routines during vacation: sketching and writing. I look forward to sharing my drawings and stories with you soon2.


  1. This episode is a long-form conversation with Leire Asensio Villoria and David Mah on decoding and upgrading design systems, reverse engineering, the creative process, knowledge dissemination, and much more. Subscribe to Getting Simple to get notified when this episode goes out. 

  2. Twenty rupees is a story I wrote and published while immersed on a trip around Delhi, Agra, and Rajasthan, India. 

SEPTEMBER 5, 2022

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

parseFloat("123.456").toFixed(2);
// Returns 123.46

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

SEPTEMBER 4, 2022

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.

SEPTEMBER 3, 2022

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.

SEPTEMBER 2, 2022

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 bitbucket.org:nonoesp/some-repo.git
#  - [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).

SEPTEMBER 1, 2022

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 bitbucket.org:nonoesp/some-repo.git
#  - [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:
  /opt/homebrew/Cellar/dnsmasq/2.85
  /opt/homebrew/Cellar/php/8.1.1
  /opt/homebrew/Cellar/php/8.1.1.reinstall
  /opt/homebrew/Cellar/php/8.1.3_1
  /opt/homebrew/Cellar/php/8.1.4.reinstall
  /opt/homebrew/Cellar/php@7.4/7.4.21_1
  /opt/homebrew/Cellar/php@7.4/7.4.27.reinstall
  /opt/homebrew/Cellar/php@7.4/7.4.28_1.reinstall
  /opt/homebrew/Cellar/php@8.0/8.0.14

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 30, 2022

Twenty rupees

It's hot and especially humid. Bea and I wonder around Jodhpur's Clock Tower Road, stop at a street food stall, and buy a one-litre bottle of cold mineral water for twenty Indian rupees, the equivalent to twenty five cents. That's the standard price for bottled water here in Rajasthan, the Northern region of India in which the cities of Udaipur, Jaipur, or Pushkar are located.

We've been warned not to drink tap water or eat street food. Unlike locals, we could get sick because of bacteria our body has never been exposed to or due to the inability to digest spicy food.

An interesting practice we've had to follow for the past week is brushing our teeth with bottled water. Every hotel provided us with water bottles and we knew we shouldn't use the tap. Yet the habit of brushing our teeth with water from the tap is extremely engrained on us, which led me to use water from the tap by mistake a few times.

Having drinkable water from the tap is one of the many things we give for granted, and it's crazy we use drinkable water for showering and flushing the toilet.

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.

parse_url("https://gettingsimple.com/podcast");
// [
//     "scheme" => "https",
//     "host" => "gettingsimple.com",
//     "path" => "/podcast",
// ]

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

$components = parse_url("https://gettingsimple.com/podcast");

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

$host = $components["host"];
// "gettingsimple.com"

$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://pecl.php.net/mongodb-1.13.0

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

Want to see older publications? Visit the archive.

Listen to Getting Simple .