Nono.MA

MAY 13, 2021

Spotify's program is managed by Anchor, which makes it a bit hard if you're using another platform to release your content. Apple's program is managed at podcastsconnect.apple.com, the same interface in which you obtain analytics for your show, and you'll probably have to upload paid episodes through their interface.

More on Spotify's blog and Apple Podcasts website.

Features in Apple Podcasts

  • Ad-free listening. Let subscribers focus on the story.
  • Additional episodes. Give subscribers more to love with extra episodes.
  • Early access. Offer subscribers new episodes before everyone else.
  • Archived episodes. Unlock access to all the past episodes.

MAY 13, 2021

from PIL import Image

img = Image.open('/path/to/image')

left = 10
top = 20
right = 10
bottom = 20

img = img.crop((left, top, right, bottom))

MAY 11, 2021

Introducing the Bytes series

Last week, we introduced Bytes—a new series of the Getting Simple podcast—and released our first episode. Aziz Barbar and I will talk about concepts at the intersection of digital technology and culture in a language we can all understand.

We've recorded our next episode on StyleGAN—an algorithm developed by NVIDIA which can learn from images and synthesize fakes ones in the same style—and intend to release future conversations on NFTs and digital art, cryptocurrencies, machine intelligence, design and authorship, GPT-3, automation, creativity, and much more.

In his own words, co-host Aziz Barbar is an architect by training specialized in computational design, interested in the digital environment, automated construction techniques, building performance, and all things digital.

As with most of what I do, these pod series are an effort to learn and find the tactics, techniques, and digital tools that can help us live a more meaningful, creative, and simple life.

I hope you will join us on this journey.


Listen to the introductory episode of the Bytes series.

MAY 8, 2021

After CVAT is running and you have access to its login screen, you need to have an admin account to log in and access the admin panel.

You create an admin user from the command-line interface.

docker exec -it cvat bash -ic 'python3 ~/manage.py createsuperuser'

This command will as you for a username, email, and password.

After you log in, you can hover your username (in the top-right corner of the screen) and select "Admin page" to access the Django admin panel, where you can manage your CVAT site, manage users, groups, and more.

MAY 6, 2021

Bytes — Intro

Hi Friends—

Today we're introducing the Bytes series, in which we'll talk about concepts at the intersection of digital technology and culture in a language we cal all understand.

(Enter Aziz Barbar.)

In this episode, you'll learn about the series' name and format, co-host Aziz, and what's coming.

Listen to "Bytes — Intro"

MAY 4, 2021

The Sawyer effect

In Drive, Daniel Pink argues that people perform best when they do things because they're interesting and can do them with autonomy and self-direction. Pink describes how "if-then" or extrinsic rewards—say, for mowing the lawn or drawing a portrait—can diminish a subject's performance, creativity, and long-term interest in the task.

"For artists, scientists, inventors, schoolchildren, and the rest of us, intrinsic motivation—[the third drive is] the drive to do something because it is interesting, challenging, and absorbing—is essential for high levels of creativity," Pink says. When someone sets your goals, your challenge is to stay motivated. When you lead others, the challenge is to ensure they enjoy and feel part of the process without the stress of performing in a specific way to be rewarded.

Another curiosity I learned from Pink's research is Edward Deci's discovery of the Sawyer Effect—that depending on how rewards are used, they can turn play into work or work into play. Paradoxically, "When money is used as an external reward for some activity, the subjects lose intrinsic interest for the activity. […] [Artists] who pursued their painting and sculpture more for the pleasure of the activity than for extrinsic rewards have produced art that has been socially recognized as superior. […] It is those who are least motivated to pursue extrinsic rewards who eventually receive them."

MAY 1, 2021

When you use two-factor authentication to sign in to your Gmail account (or to "Sign in with Google") you access your account with your email, password, and a verification code generated by Google Authenticator or other authenticator apps (such as Duo).

You might get an error like the one that follows when trying to sign in to Gmail with your Google password.

Authentication failed. Please check your username/password and Less Secure Apps access for mail@example.com.
Server returned error: "534-5.7.9 Application-specific password required. Learn more at 534 5.7.9 https://support.google.com/mail/?p=InvalidSecondFactor l25sm248619lfe.188 - gsmtp , code: 534"

When the service you're trying to use your Gmail account with doesn't allow you to "Sign in with Google," you need to create an app-specific password as detailed in the support Url provided by the error message.

Create a Google App Password

This app password

  • Go to your Google account
  • Security
  • Sign in to Google
  • App passwords
  • Choose the service type — e.g., Mail, Calendar, Contacts, YouTube, or Other (custom)
  • Choose the device type — e.g., iPhone, iPad, Mac, Windows, etc.
  • Generate

You'll get an app-specific password like this one — dbkdwckcplvgaktc — that will let you log in to the authorized service with your email and this password.

In my case, I use this password to be able to "Send as" from Gmail from an email address that has two-factor authentication turned on.

APRIL 27, 2021

Luis Ruiz Padrón — Writing, Sketching, and Teaching Through The Lens of Architecture

Hi Friends—

Today I bring you an episode with Luis Ruiz Padrón on the creative process behind his writing, sketches, and publications, seeing the world as an Urban Sketcher, identity, teaching, technology, life, success, and more.

I'm excited to announce that we're producing a full video version of this conversation—recorded by Daniel Natoli—to be released within the next weeks and that we'll be rolling out full transcripts of all episodes sometime in 2021.

I hope you enjoy this episode (and its detailed show notes) as much as I did.

Listen to: "Luis Ruiz Padrón — Writing, Sketching, and Teaching Through The Lens of Architecture"

APRIL 27, 2021

A frugal practice: Use cash

Here's an excerpt of my conversation with JR from Insisting Simplicity in which he shared with me a simple frugal practice we can all use to spend less. (You can listen to the audio version of this segment of the conversation or the full episode.)


Nono

Do you have any specific frugal practices that help you save money?

J.R.

Yeah. Oh my God. Gazillions. They're all stupid. But that's the thing—as with anything, it's gamification.

If you use cash, which less and less people do, and especially in post-COVID, we might be a cashless society, but again, that's a totally different conversation.

Research suggests that, if you use a credit card, you are more inclined to make impulsive purchases.1 If you have actual dollars in your hand, it's harder to part with them. It's also harder to part with them if they are larger denominations. So one thing that you can do is... Just carry some cash and really think about it and have them in larger denominations. And that alone will maybe make you a little bit more hesitant, maybe make you a little bit more mindful of those purchases that you're making.

And that could lead hand in hand with another stupid little thing, which is not stupid, but you have a change jar or a little thing, whatever, every time that you go and spend that cash—say it's a $20 bill—and just like some of the banks and FinTech companies, they'll do this electronically automatically with your credit card or debit card, you take that cash and whatever change you have, you put it in your jar and you forget about it.

Then you come back to it like a year later, all of a sudden, now you got some money. Do something with that. Put it somewhere. Buy something that you've been thinking about for a while. You didn't buy it impulsively because you've had this little bucket over here building for the last 12 months. So you could buy it in a responsible way.


Listen to the full conversation with JR from Insisting Simplicity.


  1. Raghubir, Priya & Srivastava, Joydeep. (2009). The Denomination Effect. Journal of Consumer Research. 36. 701-713. 10.1086/599222. 

APRIL 20, 2021

Tools: Pen case

My partner gifted me with a MUJI case some time ago. The brand lists it as a case for glasses and small articles. I tested using it for my glasses—which did not convince me—and ended up repurposing the translucid case to carry my pens and my water brush. (Right now, it contains a 0.38 MUJI pen, 005 and 03 Micron Sakura pens, and a Pentel watercolor brush whose cap I had to trim with a knife cutter to fit in the case.) The case fits in the side pocket of my Fjällräven Kånken backpack, and it's convenient to place my pens on top of a flat surface as I sketch.

APRIL 20, 2021

If you're receiving this error when trying to composer install.

Your GitHub OAuth token for github.com contains invalid characters

Here's what worked for me.

Edit the composer authentication configuration file ~/.composer/auth.json.

nano ~/.composer/auth.json

Then replace the following.

  "github-oauth": {
    "github.com": "ghp_[YOUR-PERSONAL-TOKEN]"
  }

With this (basic auth):

  "http-basic": {
    "github.com": {
      "username": "[YOUR-GITHUB-USERNAME]",
      "password": "ghp_[YOUR-PERSONAL-TOKEN]"
    }
  }

Source

APRIL 20, 2021

I found this error while trying to update and install composer packages with composer install.

could not find driver (SQL: select * from information_schema.tables where table_schema = folio_burns and table_name = folio_items and table_type = 'BASE TABLE')

At first, I thought the solution was to edit /etc/php/7.4/cli/php.ini (for PHP-FPM 7.4 in my case) and uncomment the line ;extension=pdo_mysql to be like extension=pdo_mysql . But I was still getting this error as the mysql extension was missing.

PHP Warning:  PHP Startup: Unable to load dynamic library 'pdo_mysql' (tried: /usr/lib/php/20190902/pdo_mysql (/usr/lib/php/20190902/pdo_mysql: cannot open shared object file: No such file or directory), /usr/lib/php/20190902/pdo_mysql.so (/usr/lib/php/20190902/pdo_mysql.so: cannot open shared object file: No such file or directory)) in Unknown on line 0

The solution ended up being to install the extension, which would also add its own .ini file and activate itself on installation.

sudo apt-get install -y php7.4-mysql

Note that you can run this command with multiple extensions to be installed at once.

sudo apt-get install -y php7.4-{xml,bcmath,gd,mbstring,xsl,zip,curl,mysql}

APRIL 15, 2021

After downloading a website as HTML with cURL or any other workflow, you can convert the HTML code to the Markdown syntax with pandoc.

pandoc -o output.md input.html

APRIL 15, 2021

You can download any website as an HTML file (without the site's assets) using cURL in the command line, using the -L flag to follow any existing redirects.

curl -L https://nono.ma --output nono-ma.html

The manual alternative is to right-click on a website on your browser of choice (say, Google Chrome or Firefox), select Save As.., and save the site as HTML with some of its assets in a subfolder.

Afterwards, you can convert the downloaded HTML page into a Markdown document with pandoc.

APRIL 14, 2021

Here's how to get the raw String value of a Stringable object. Laravel's Illuminate\Support\Stringable has lots of helper functions, but sometimes you want to get the raw string value. For that, you just need to use the strval PHP built-in function on an object of the Stringable class.

// Define Strintable object
$stringable = Str::of('laravel-stringable-to-string');
get_class($stringable); // returns Illuminate\Support\Stringable
gettype($stringable); // returns object

// Get its raw String value
$string = strval($stringable);
get_class($string); // returns PHP Warning:  get_class() expects parameter 1 to be object, string given in […]
gettype($string); // returns string

APRIL 13, 2021

Why should you write?

They say you need to write a couple of nonsense pages to warm up before you are ready to write something meaningful, and I've experienced this to be true. I rarely sit and write with a clear idea in mind but begin by pouring random thoughts.

Writing is about creating a daily practice where you repeatedly show up and do your thing waiting for the magic to appear. Without this practice (time-based labor to some extent), you won't be able to get to the good parts—even if you've been practicing for decades—as it's hard to write anything meaningful in thirty minutes. I reserve time to sit and write every day without the pressure of having to get anywhere specific. A thirty-minute daily practice can take you far. (That's 182 hours of writing a year.)

My current goal is to write a minimum of two hundred words per day, but it's easy to go over once you get going. I practice deliberately to better articulate my thoughts, communicate and share my ideas, and express myself more clearly; I believe writing and storytelling benefit my podcast conversations, talks, and live streams.

Right now, the only pressure comes from writing publicly once a week, posting a story with a hand-sketched illustration on Tuesdays (which you're reading). Publishing frees me up from the fear of sharing what's on my mind, telling the world who I am, and being judged, and forces me to refine my writing and direct it to my readers. One essay at a time, I share my worldview and accept that my perspective will inevitably change. But that's okay—that means I'm evolving—and you should feel the same way.

Two hundred words won't get you far, but showing up day after day can translate into writing more than seventy thousand words per year, which will surely make a difference.

APRIL 6, 2021

Clack! Clack! Clack!

Clack! Clack! Clack! The wind pushes a cluster of bamboo logs against one another. Grrr! A tall log resists the wind. Bamboo is known for its structural soundness and its relaxing sounds. I sit with my partner next to a bush of common bamboo—the bambusa vulgaris, native to Indochina and the province of Yunnan, China1—in what feels like a humid piece of jungle. But we're far from the jungle. We're in Málaga's La Conception Botanical Gardens, our hometown. The pandemic forced us to stay during our vacation and trade the expensive flight and accommodation fees for a calm week of rest and light local tourism. The admission ticket is five euros and is free on Sunday afternoons. In minutes, we walked by exotic plants brought from remote parts of China, Japan, Australia, New Zealand, Africa. As a curiosity, April is the month of erythrina caffra. People mark wood logs and cactuses with love messages and graffiti signatures as a memorandum of their time on earth. The trash can by the historical gazebo—signed with a multi-color marker—reads, Imon Boy ❤️.


  1. Common bamboo. Wikipedia. 

MARCH 30, 2021

Do you have something to say?

I believe all of us do.

Even when you can't find the right words for us to understand what you're trying to say, the exercise is worth the effort; you can clarify your message by explaining it to others.

We have more mediums to deliver our message than we could have ever wished for—think blogs, newsletters, podcasts, live videos, or social media—and no shortage of people who want to talk.

What continues to be scarce (and we should work on) are trust, authenticity, and messages worth our attention.

Will you care enough to try?

MARCH 28, 2021

I got a sudden fan shut down every time I would switch on my MacBook Pro (16-inch, 2019) after I upgraded macOS from Catalina to Big Sur. Here's how I fixed it.

  • CMD + R - Press on reboot to enter Rescue Mode
  • Login as a user you know the password for.
  • Utilities › Terminal
  • Run kmutil trigger-panic-medic --volume-root /Volumes/Macintosh\ HD
  • Start the computer normally

This is the Kext extension that, apparently, was causing the issue.

cd /System/Library/Extensions/AppleThunderboltNHI.kext

MARCH 23, 2021

Looping playlists

Do you remember when music was sold on compact discs? The amount of audio that could ship in a CD was limited to 74 minutes and later extended to 80 minutes. Some albums will be sold with two, three, or four discs to be able to pack more songs. This limitation made it essential to select the contents that were going to be shipped carefully.

Nowadays, we have unlimited audio available in our pockets, and we don't even need to think how much we ship or even its length. YouTube makes millions of hours of video and audio available, and streaming services like Spotify provide us with an immense catalog of music and podcasts available to us without worrying about where the music is stored. With enough time and internet bandwidth, we can stream anything.

In the 2000s, I got a portable CD player, the Sony Walkman E-220, which I didn't get to use that much with the advent of the internet. It still works, and it looks as new. Apart from the standard playing function—which plays all the tracks on the CD ones—this device could play songs on repeat mode, looping over the entire disc in order; on shuffle mode, looping through songs in random order; or on single track mode, playing a single track repeatedly. The number of songs we could carry with us was limited, and we paid for each new album. Streaming services and the internet let us bring with us millions of songs today.

There is a little arrow symbol that seems to have stick until today—it shows up on Spotify and other digital music players. The arrow goes left, down, and right, and it means you're going to be looping through a specific block of audio; a playlist, an album, or a song.


Can you imagine situations in which you may want to play a song over and over and over? I want to share with you a habit I've been practicing for many years. Listen to this Getting Simple episode on looping playlists.

MARCH 19, 2021

If you're getting this message when encrypting files with a GnuPG—the GNU Pretty Good Privacy (PGP) package—you can mark your key as trusted (if that's the case). This often happens when you copy a trusted key from one machine to another.

Here's what I was getting before 'trusting' my own key.

gpg: <KEY_ID>: There is no assurance this key belongs to the named user
It is NOT certain that the key belongs to the person named
in the user ID.  If you *really* know what you are doing,
you may answer the next question with yes.

Use this key anyway? (y/N) y

Every time, I'd have to answer y to complete the encryption process.

I learned how to skip this step from this StackOverflow post.

gpg --edit-key <KEY_ID>
gpg › trust

Then you set the degree to which you trust the specified key.

1 = I don't know or won't say
2 = I do NOT trust
3 = I trust marginally
4 = I trust fully
5 = I trust ultimately
m = back to the main menu

I selected 5 as this is a key I created for myself.

Your decision? 5
Do you really want to set this key to ultimate trust? (y/N) y

Confirm, then quit.

gpg › quit

Now you can use your GPG key without confirm every operation.

MARCH 18, 2021

Charts.css is a modern CSS framework. It uses CSS utility classes to style HTML elements as charts.

MARCH 16, 2021

Mini-retirements

When I lived in London in 2015, I left my job two months before going to live and study in Cambridge, Massachusetts. Instead of accruing two more months of pay, I would take a break, travel to Japan for two weeks, and spend the summer back home. I planned for a two-month pause.

A question submitted to the podcast by Marc Exposito1 made me reflect on 'mini-retirements'—what they are and potential techniques, challenges, and reasons to live as if you were retired—and, in retrospect, understand my 2015 break like one. I deliberately reserved time to wander around Japan's streets at my own pace (like that of a turtle) and enjoy Málaga's sunny weather. What would happen if, instead of working for forty years and retiring for twenty, you distributed those twenty years throughout your career? Marc asked.

Listen to a Getting Simple podcast on mini-retirements.


  1. You can submit a question here. I'd love to hear from you. =) 

MARCH 9, 2021

Tools: White Nights watercolors

A few months ago, I started working with a new set of watercolors — the St. Petersburg White Nights Nevskaya palette — which comes in a plastic box with twelve pans. On their website, St. Petersburg lists dozens of colors; standard, pastel shades, and metallics.1 The Nevskaya palitra (Russian for palette) refers to the colors of the 74-kilometer-long Russian Neva River, more vivid than my Winsor & Newton set; which may vary depending on when and where you buy the set. My palette contains cadmium yellow medium (201), Indian gold (244), cadmium red light (302), carmine (319), ceruleum blue (503), ultramarine (511), emerald green (713), sap green (716), raw sienna (405), burnt sienna (406), sepia (413), and Payne's gray (812).

St. Petersburg White Nights artists' watercolors Nevskaya palitra.

MARCH 8, 2021

If you multiple Vue components of the same type throughout your application but they're not in the same parent DOM element, mounting them may not be as easy as calling their parent.

Mounting multiple Vue components with a shared parent

In this first example, we can mount all of our button-counter components by mounting their parent, #button-container.

<div id="button-container">
  <button-counter></button-counter>
  <button-counter></button-counter>
  <button-counter></button-counter>
</div>

We just need to make one call.

new Vue({ el: '#button-container' });

But what if our components are spread throughout different HTML elements?

Mount multiple Vue components without a shared parent

Imagine you have components of the same (or different) types spread throughout your website's DOM.

<div>
  <button-counter></button-counter>
  <button-counter></button-counter>
</div>

<div>
  <button-counter></button-counter>
</div>

<button-counter></button-counter>

We can iterate through the DOM elements and mount them one by one.

// Obtain all button-counter elements
let elements = document.getElementsByTagName('button-counter');

// Convert HTMLCollection to array
let arr = Array.prototype.slice.call( elements )

// Loop through array and mount all elements
arr.forEach((el) => {
    new Vue( { el });
});

Note that we had to convert the HTMLCollection to a JavaScript array before we could call the .forEach() function to iterate over the button-counter host DOM nodes.

This works with Vue 2, and Vue 3 recently released new features for multi-root components and optional TypeScript support.

MARCH 8, 2021

Change this.

window.Vue = require('vue');

For this.

window.Vue = require('vue').default;

Then this should work.

window.Vue = require('vue').default;
window.VueResource = require('vue-resource');
window.Vue.use(window.VueResource);

MARCH 8, 2021

When trying to use the newest features of Laravel 8.x to automatically install Babel plugins with the .vue() call after using mix.js(), I kept getting the following error.

AssertionError [ERR_ASSERTION]: mix.js() is missing required parameter 1: entry

Even though I was using Laravel 8.x, my application had been migrated from older versions and my JavaScript dependencies in package.json were old. Specifically, I was still using Laravel Mix 5 while the newest version 6 had been released.

The solution was to change to version ^6.0.6 in package.json and run npm install, as the .vue() call is a new feature in Laravel Mix 6.

    "devDependencies": {
        // ...
        "laravel-mix": "^6.0.6",
        // ...
    },

Then on webpack.mix.js.

mix.js('resources/js/app.js', 'public/js')
   .vue();

I could then run the following commands successfully.

npm run dev
npm run watch
npm run hot
npm run prod

I believe this works with Vue 2 and Vue 3, and that the Vue version wasn't the problem but the version of Mix. (Note that I had also run npm update previously to update other dependencies and had to remove the --inline, --hide-modules and --no-progress options from my development and production commands in the scripts property of package.json.)

MARCH 5, 2021

This script re-encodes the seconds between second 25 and 45 of an input.mov video from mov to mp4; rotates the frames 180 (the hflip,vflip flags flip all pixels vertically and horizontally); removes the audio (with the -an flag); and speeds up the video (i.e., skips frames, with the flag setpts=0.05*PTS, which you could adjust to have more frames, for instance, as setpts=0.1*PTS).

ffmpeg -ss 00:00:25 -to 00:00:45 \
       -i "input.mov" \
       -an -filter:v "hflip,vflip,setpts=0.05*PTS" \
       "output.mp4"

MARCH 4, 2021

James Melouney and Selene Urban — Overcoming The Fear of Meditation, Practices, Authenticity, Connecting With Your Audience, and More

Hi Friends—

Today I bring you an episode with James Melouney and Selene Urban on how to get started with meditation, self-discovery, building trust and connection with your audience through a humane and authentic message, and key learnings from their entrepreneurial journey.

We also talked about different meditation and breathing techniques, marketing and automation tools, the struggles of having your own business, and how James and Selene approach work and life.

I truly hope you enjoy it.

Listen to: "James Melouney and Selene Urban — Overcoming The Fear of Meditation, Practices, Authenticity, Connecting With Your Audience, and More"

MARCH 2, 2021

Breathe in, breathe out

I learned about pranayama, the yoga practice of controlling your breath, in an interview with James Melouney and Selene Urban. As Selene explained, a particular type of pranayama called sama vritti (equal length in the Sanskrit language) consists of breathing in and out in equal-length intervals. Say, counting four as you breathe in, hold, breathe out, and hold again. I added a bonus recording at minute 1:37:50 of this podcast episode, in which Selene guides us through a five-minute breathing session that you can use to relax, meditate, and calm down.

Breathe in.
One, two, three, four.
Hold.
Four, three, two, one.
Breathe in.
One, two, three, four.
Hold.
Four, three, two, one.

Want to see older publications? Visit the archive.

Listen to Getting Simple .