Nono.MA

JANUARY 16, 2022

I recently found an old folder with Processing sketches of geometric drawings I made over the past decade1. These virtual drawings are commonly included in the so-called generative art or drawing—due to being generated using parametrized, procedural algorithms—which have been included within the digital art category of the non-fungible token (NFT) and crypto world.

Creative coders and digital artists have been authoring and sharing these artifacts online for years for free, and it was only recently that they started offering unique digital copies of these creations for a fee. The claim of this paradigm? To put artists' art in the hands of their supporters—and potentially other creatives alike, who pursue similar endeavors—in hopes that art can be sustained by its making and minting, the act of creating a non-fungible token in a blockchain that embodies the ownership and uniqueness of an art piece, without need to manufacture and deliver a physical product to the buyer. More than that of a customer, the figure I've described is that of a patron, who wants to support the art of their favorite creators. Yet many in the NFT world utilize these digital art tokens like any other monetary asset, to speculate, in hopes that prices will go up in the near future. Others sell and buy to build a virtual art gallery with pieces they own and can display.

I'm a newbie on the matter. But I'd love to get involved as I continue to work on my artworks for the remote possibility of building a community around my pieces. I'm hand sketching daily and publishing one sketch a week, and I create physical, museum-quality, limited reproductions of my works. In this sense, it would make sense to accompany each digital token with a physical counterpart.

On a different plane, I'm investigating the role of machine intelligence to produce drawings mimicking my hand sketching style, which could be an augmentation of this project or a different one on its own. Machine learning models allow me to generate permutations of my works—to hallucinate sketches—as static or animated pieces. Email me@nono.ma if you'd be interested in being amongst the first ones to know when I mint my first NFTs.


Comment on Hacker News.


Oh, and one more thing. If you're still learning, as I am, you may enjoy my conversation with Aziz Barbar on NFTs and digital art.

Happy Sunday!


  1. If you're curious, here's Fruit Flies, a little video I made out of one of my old Processing sketches. If you don't know about Processing, go ahead and give Processing 4 a try! I recorded an interview with Processing's co-creator Ben Fry, back in 2018 in Cambridge, Massachusetts. 

JANUARY 15, 2022

For most of what we do, there's no point in holding off, on overthinking. Done, even if imperfectly, is better than saving for later. Review it now, read it, skim through it, do it with care, but don't postpone. Engage or not. But if the let the to-do list grow, you'll accrue increased levels of stress. Either say no or act soon. It makes sense to squeeze yourself, to put the extra mile, on the important things. The hard part is to identify what those things are to ignore the noise or deal with it quickly.

JANUARY 14, 2022

Yesterday, during Live 57, I recorded a recap video of the Collaborative AI Sketching project.

The first part is an overview of a React drawing app we built using Perfect-Freehand (see on GitHub), an incredible library open-sourced by Steve Ruiz on Github1. The second is a walk through a second React app (see on GitHub), which will be the base for the AI Sketching app, that includes esbuild (for bundling), create-serve (for serving and live reloading), rko (for state management), and react-hotkeys-hook (to add keystroke combinations). I focused on state management, the undo-redo stack, and hotkeys. But previous videos cover how to add esbuild and create-serve to a React app from scratch.

At the very end, I showcased my new analog timer and stopwatch, a fifteen-dollar purchase that's helping me track how long a stream or podcast recording has been going for, and deep work sessions, without having to use a phone or computer. (Here's an affiliate Amazon link to the exact item I bought.)

I'll continue building this online drawing app live during live streams. Sign up to this calendar to know when the next live stream will take place, and subscribe on YouTube.

Have a great day!


  1. Here's a live demo app of Perfect-Freehand working on the browser. 

JANUARY 13, 2022

Today, I woke up early and did my usual morning routine—meditate, write, sketch, and Readwise. I don't have a super clear schedule to do these, other than remembering every day not to not do it1. But I'm trying to stick with a more rigid model. Otherwise, these endeavors stay in the back of my mind as to-dos for the rest of the day. I oblige myself to do them as I'm already experiencing the benefits of this discipline, of this identity. It feels great to be done with it by 9 AM.

I often recommend others to blog in public, daily if possible. I'm not quite there yet. Probably, because I want the perfectionism of publishing well-crafted ideas that stick and postpone drafts for later in case I have time to put more time on them, or simply because I don't want to spend too much time writing every single day. I've repeatedly discussed the friction of publishing posts in English and Spanish, accompanied by an illustration2. I applaud the daily blogging habit of people like Seth Godin or Ken Perlin; it's a lifestyle and a statement. Like shouting from afar, I'm a blogger. I'm a writer.

I know I didn't talk about my current routine. But you can learn about it by listening to my Atomic Habits podcast episode and reading 600 Days of Practice, a short essay on deliberate practice and my routine.


  1. "It takes a certain amount of dedication to blog every day. The key is to remember every day not to not blog." The luxury of daily blogging by Ken Perlin. Tuesday, Jan 11, 2022. 

  2. There's freedom in typing and hitting publish instead of having to write, translate, pick an illustration or drawing, edit, upload, and then publish. What's reduced along the way? Creative friction. 

JANUARY 11, 2022

When to-do lists get too long

They cease to be useful.

You fool yourself into thinking you can do more than you're capable of doing.

Work; Fix this and that; Share a post; Sketch; Catch up with (too many) people; Edit another episode; Write.

There's just not enough time for it all.

What's worse is that the list was meant to off-load your mind, and it's now stressing you out, defying its own purpose.

Sooner or later, you’ll have to stop fooling yourself.

You can’t do everything.

JANUARY 2, 2022

Podcast: Goodbye, 2021

Hi Friends—

Happy new year! 🥂

The following is an episode celebrating 2021 and my achievements in podcasting, live streaming, sketching, and writing over the past year. I also added a note on why I think you should start writing, in public.

Listen to "Goodbye, 2021"


DECEMBER 28, 2021

Goodbye, 2021

In 2020, billions of people wore a face mask to walk outside for the first time.

At the end of 2020, I said goodbye to the pandemic and recorded my impressions of what I thought would be the end of that phase—I wasn’t expecting COVID to be around us one year later.

We've had to comply with full lockdowns, limited gatherings, and ever-changing curfews. We've reduced our travels and kept our trips as local as they can be. Christmas hasn't been our traditional holiday—a sense of fear and anxiety accompanies our gatherings with friends and family—and local restrictions forced many to spend salient dates apart from each other.

Ever since some of us got vaccinated and obtained a COVID certificate and fought multiple coronavirus variants. Today, omicron is on the news, spreading faster but killing less, especially amongst those who got their shots.


This is my last publication of the year, and I wanted to, once again, shift my focus from the bad to the positive and highlight some of the good things I take from 2021.

  • I live streamed (and showed up for more than 40 weeks)
  • I recorded podcasts (and published 16 episodes)
  • I wrote and sketched daily (and published 52 stories)
  • I started freediving1
  • I built a recording studio for podcasting and streaming2
  • We recorded the first full video interview of Getting Simple3
  • We started the Bytes podcast series

At the turn of 2019, I published Twelve Grapes—a short reflection on temporal landmarks and New Year's resolutions. For me, 2021 was a year to stop overdoing things and ship faster; to reduce creative friction by automating workflows where possible and delegating work to other creatives.


If you’re thinking of starting a blog or a personal journal, read One Word per Day. I agree with Seth Godin—Everyone should have a blog and should write daily, in public. It’s free, and it’s a great way to establish your tone before anyone cares about your writing.

As a matter of fact, one of my goals to remove friction from my creative writing process is to begin publishing on Substack, in English only and without a required illustration. The simple fact of having to translate a piece of text and couple it with a drawing or photo makes my process more complex than it needs to be.


There are lots more that I’d like to share with you. But I’ll leave that for future posts. If there’s anything you’ve learned or enjoyed from my sketches and stories of 2021, I’d love for you to send me a note. Feel free to reply to this email if you’re getting the newsletter, tweet at me @nonoesp, message me on Instagram, add a comment to this publication, or through this contact form.


Thanks!

Thanks so much for being there.

Goodbye, 2021.

Happy New Year!


  1. I captured my First Impressions in writing and recorded a podcast on the subject with Jose Luis García del Castillo. I explained How to prevent your diving mask from fogging up and how to use the Otovent, and talked about The Diving Reflex—probably, what I enjoyed learning about the most— and sighting dolphins

  2. I’m building my first recording studio to produce podcasts and video tutorials outside of my living room. I’ve learned a lot about acoustic treatment, lighting, and sound. And even though my space will always continue to improve, I’m actively using to podcast and live stream, and all of the equipment I’ve acquired so far can be reused when I move my studio elsewhere in the future. 

  3. Huge thanks to Daniel Natoli from Peripheria Films for making this possible. We can hopefully bring you more on-site video interviews in the near future. 

DECEMBER 21, 2021

Say you have a long list of numbers and you want to add them together, or maybe you wish to multiply them or do some other series of operations, to all of them. You can use a reducer, and here's a sample of how to define a reducer as a simply add-two function to add an entire list of numbers.

const numbers = [20, 30, 50];
const reducer = (previousValue, currentValue) => {
  return previousValue + currentValue;
}
const result = numbers.reduce(reducer); // 100

You could easily parse a plain-text list as well.

const text = '1.75 Milk\n0.70 Bread\n2.56 Yogurt';
const numbers = text.split('\n').map(s => parseFloat(s.split(' ')[0]));
const reducer = (previousValue, currentValue) => {
  return previousValue + currentValue;
}
const result = numbers.reduce(reducer); // 5.01

DECEMBER 21, 2021

Periodicity

I recorded a conversation for the podcast with Jordan Gray last week. The word that most resonated with both of us when discussing creative friction was periodicity. According to Cambridge Dictionary, periodicity is "the tendency of an event or series of events to happen repeatedly in a fixed pattern." As James Clear says, what happens when you do something recurrently you adopt the identity of someone who does that often. A person who writes often becomes a writer; a person who speaks in public often becomes a public speaker. You obtain knowledge through education, but the practice is what gets you to become whatever it is you're aiming for.

DECEMBER 14, 2021

The growing drafts

As I work through my writing drafts, I become fond of them. I look for short snippets I can pair up with a drawing to polish, translate, and publish. But I end up turning tiny pieces of text (say, 200 words) into larger essays (say, 1,000 words) which let me further develop ideas but require more time to edit and translate. Drafts grow bigger than I expected, and I let them aside to put more time on them.

These drafts not only develop into essays and text publications but podcast episodes. The Black Box and NFTs & Digital Art, essays I'm currently working on, turned into Bytes episodes (13 and 30 minutes, respectively); Stories Are the Answer developed into a 10-minute experiment; Should you give in to your brain's ideas or focus on deep work? is in the making, as are Unitaskers: Digital versus Hand Writing, In Search of a Publication Strategy, You Stopped Working, The Myth of a Better Life, and many, many other stories.

You're reading sketch number 129, which means this project has been going for 903 days. (Since July 2, 2019.)

The goal is to develop my writing and my ideas, to find out what I think, capture what I learn, and share it with you, in an archive we can navigate anytime in the future.

The process is messy. But it's exactly that journey I'm here to enjoy.

DECEMBER 13, 2021

Bytes — The Black Box

Hi Friends—

As we embrace new technologies, we delegate more and more tasks and decisions to the machine. In turn, algorithms permeate our daily lives—say, influencing what we listen to, watch, read, or who we interact with—yet few of us know how they use our information and make decisions for us.

In this episode, I talk to Aziz about how complex machines work, technological polarization, and the growing need to make algorithms understandable.

Listen to "Bytes — The Black Box"


DECEMBER 7, 2021

Beginner feeling

Every process needs persistence to yield long-term results.

Here are a few tips I try to live by to run away from the beginner feeling.


Make periodicity your friend.

Engage in your craft daily.

(If you can't, try to show up on a weekly or biweekly basis.)

But again, make periodicity your friend.

Otherwise, you'll repeatedly feel like a beginner.

You'll find yourself getting back at your practice, over and over again.

Show up daily instead to minimize that friction.

LAST UPDATED DECEMBER 4, 2021

If you are wondering where the image files of your Apple Desktop backgrounds are, you can simply navigate to the following folder.

/System/Library/Desktop Pictures

To get to this folder, in case you don't want to remember the path, you can also do this.

  • Right-click on the Desktop
  • Change Desktop Background
  • Double-click on "Desktop Pictures"

To navigate to the folder with Terminal.

open "/System/Library/Desktop Pictures"

To navigate to the folder with Finder.

  • Menu bar › GoGo to Folder..
  • /System/Library/Desktop Pictures
  • Go

DECEMBER 2, 2021

SageMaker can be quite confusing. Here are some notes I took while learning how the model and output parameters work.

  • model_dir is provided as an Estimator function parameter.
  • output_dir and output_data_dir are provided as Estimator hyperparameters.

(See how to provide these arguments in code below.)

After a successful run, whatever is saved to each of these directories will be uploaded to a specific S3 location within your job's folder and bucket.

  • model.tar.gz will contain files saved to /opt/ml/model
  • output.tar.gz will contain files saved to /opt/ml/output and (inside of the data subfolder) the files saved to /opt/ml/output/data

Here's the sample directory tree with a train.py entry point that saves a text file to each of these locations.

# Files saved to /opt/ml/model/
model.tar.gz
    model.txt

# Files saved to /opt/ml/output/
output.tar.gz
    output.txt
    success
    # Files saved to /opt/ml/output/data/
    data/
        output_data.txt

# Files in the Estimator's source_dir
source/
    sourcedir.tar.gz
        # All files in your source_dir

Here's how you'd override these locations in your Estimator.

# Create a TensorFlow Estimator
estimator = sagemaker.tensorflow.estimator.TensorFlow(
    ...
    model_dir='/opt/ml/model',
    hyperparameters={
        'output_data_dir': '/opt/ml/output/data/',
        'output_dir': '/opt/ml/output/',
    },
    ...
)

And here's how you'd read their values inside of your entry point, e.g., train.py. Note that, even if you don't pass these three variables to your Estimator and its hyperparameters, you can capture them in your entry point script by defaulting to the SageMaker environment variables, namely, SM_MODEL_DIR, SM_OUTPUT_DIR, and SM_OUTPUT_DATA_DIR, which default to /opt/ml/model, /opt/ml/output, and /opt/ml/output/data.

import argparse
import os

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument("--model_dir", type=str,
                                    default=os.environ.get('SM_MODEL_DIR'),
                                       help="Directory to save model files.")
    parser.add_argument("--output_dir", type=str,
                                    default=os.environ.get('SM_OUTPUT_DIR'),
                                       help="Directory to save output artifacts.")
    parser.add_argument("--output_data_dir", type=str,
                                    default=os.environ.get('SM_OUTPUT_DATA_DIR'),
                                       help="Directory to save output data artifacts.")

    opt = parser.parse_args()
    print(f'model_dir › {opt.model_dir}')
    print(f'output_dir › {opt.output_dir}')
    print(f'output_data_dir › {opt.output_data_dir}')

Testing this functionality, I saved a text file to each of these locations to see what the SageMaker SDK was uploading to S3. (The resulting directory structure can be seen above.)

# Save a text file to model_dir
f = open(os.path.join(opt.model_dir, 'model.txt'), 'w')
f.write('Contents of model.txt!')
f.close()

# Save a text file to output_dir
f = open(os.path.join(opt.output_dir, 'output.txt'), 'w')
f.write('Contents of output.txt!')
f.close()

# Save a text file to output_data_dir
f = open(os.path.join(opt.output_data_dir, 'output_data.txt'), 'w')
f.write('Contents of output_data.txt!')
f.close()

What's the difference between output_dir and output_data_dir?

SageMaker provides two different folders, the parent output folder and the output data subfolder. According to official AWS GitHub samples, output_dir is the directory where training success/failure indications will be written—which is an empty file named either success or failure—, output_data_dir is reserved to save non-model artifacts, such as diagrams, TensorBoard logs, or any other artifacts you want to generate during the training process.


I hope the read was helpful!

NOVEMBER 30, 2021

Play next

Instant gratification platforms—Instagram, Facebook, Twitter, Email—get us hooked to the constant consumption of new information and notifications, and on-demand media platforms—YouTube, Spotify, Netflix—teach us to skip ahead when content ceases to entertain us. As we give in to these impulses, we become less and less capable to avoid the urge to context-switch (or may I say content-switch) leaving what we were doing half done, engaging in yet another activity, and getting used to never completing anything. This phenomenon is what makes twenty to fifty-minute-chapter mini-series thrive. We consume things in chunks and don't want to commit to the two-hour movie anymore. But we eagerly play next when a show gets us hooked and binge-watch for hours. I'm in control. You think. But are you?

NOVEMBER 29, 2021

One Year of Live Streams — Teaching & Coding

Hi Friends—

We hosted two live events on YouTube to record a two-part podcast celebrating one year of live streams. The second part, out now, features a conversation with Jose Luis García del Castillo on teaching and coding live.

We talk about friction and automation, community, practice, content creation, and how the podcast and the live streams have evolved.

Special thanks to the community and to everyone who joined us live. ❤️

Listen to "One Year of Live Streams — Teaching & Coding"

NOVEMBER 27, 2021

Hold the icon in the macOS menu bar for two seconds.

NOVEMBER 23, 2021

Bitcoin, bookmaking, and publication announcements

This week, I want to share a few links and announcements.

Anthony Pompliano says denominating your assets in bitcoin is better than doing it in US dollars, as the inflation rate of the cryptocurrency is much lower than the majority of currencies commonly used to denominate assets. I haven't yet dived deeply into the world of non-fungible tokens (NFTs) and smart contracts.

I enjoyed watching Craig Mod's bookmaking video in Japan, which shows the craftspeople involved in the production process of his third edition of Kissa by Kissa.

I'm working on a new interview with an old friend—Jordan Gray—on friction and creativity.

I'm building a sound studio to record my podcasts and live streams, and I'll hopefully be commenting on the results soon; it involves a green chroma, acoustic panels, and recording gear.

Last but not least, I'm going to start publishing on Substack soon. You can subscribe here.

See you next week!

NOVEMBER 18, 2021

I found this approach to install unzip on SageMaker Studio with yum in the Terminal.

sudo yum install -y unzip

Now you can use unzip --version to verify unzip is installed, and unzip file.zip to extract the contents of a compressed file.


An alternative approach which didn't work for me

Run the following command (note the bang!) inside of a Jupyter notebook or Python console in SageMaker Studio to install unzip.

!conda install -y -c conda-forge unzip

After running that command, I don't seem to be able to run unzip in Terminal yet.

NOVEMBER 16, 2021

It's getting cold(er)

The end of the year is coming closer, and it's getting cold(er) here in the South of Spain. (My friends from Massachusetts laugh when they hear me say it's cold; they have to shovel the snow from their yard.) Summer clothes in. Winter clothes out. Here, in Málaga, it's sunny outside. You can walk on a sweatshirt.

We went away with friends to the countryside of Córdoba to disconnect over the weekend; walks, barbecue, and fireplace. I often wonder how we'd disconnect from work if there were no weekends, and constantly remind myself of a passage from Cal Newport's Digital Minimalism, which says the key to thriving in our high-tech world is to spend much less time using technology. Even though I try, I haven't found the right way to do it.

NOVEMBER 12, 2021

According to a forum post by a verified Adobe contributor, AI Robin is a background process, introduced in Illustrator 2020, responsible for background save and export tasks. I got warned by Lulu, an app that prompts for verification to enable any outgoing connections. On Windows, the same process is called AiRobin.exe. Apparently, users report AIRobin hogging huge amounts of RAM and slowing down the machine at times.

NOVEMBER 9, 2021

Using friction to break bad habits

Last week, I wrote about identifying where the friction lies to avoid it as much as possible. Arguably, that would lead us to ship more work and focus on the essentials. But there's a specific situation in which friction becomes our friend: when we try to break bad habits.

I learned about this idea from James Clear's 2018 book Atomic Habits. "The best way to break a bad habit is to make it impractical to do. Increase the friction until you don't even have the option to act."

Instead of working against friction, we engineer ways to produce more of it.

In his book, Clear provides a practical example. "The brilliance of the cash register was that it automated ethical behavior by making stealing practically impossible. Rather than trying to change the employees, it made the preferred behavior automatic."

Another example is to avoid distractions by logging out from email, social media, and services that steal your time. Having to log back in each time you visit them makes the experience less enjoyable and serves as a wall to potential distractions.

By making what you want to avoid harder, friction helps break bad habits.

LAST UPDATED NOVEMBER 17, 2021

As is port 3000, port 5000 is commonly used to serve local development servers. When updating to the latest macOS operating system, I noticed my React development server, which I'm serving with React create-serve was using a port other than 5000, because it was already in use. (You may find a message along the lines of Port 5000 already in use.)

By running lsof -i :5000, I found out the process using the port was named ControlCenter, which is a native macOS application. If this is happening to you, even if you use brute force (and kill) the application, it will restart itself. In my laptop, lsof -i :5000 returns that Control Center is being used by process id 433. I could do killall -p 433, but macOS keeps restarting the process.

The process running on this port turns out to be an AirPlay server. You can deactivate it in System Preferences › Sharing, and unchecking AirPlay Receiver to release port 5000.

NOVEMBER 5, 2021

The Visual Studio Code (VSCode) development team has been working hard to ship vscode.dev, a version of Visual Studio Code that runs entirely in your browser.

NOVEMBER 2, 2021

Where's the friction?

Every piece of work can be considered either required—has to be done—or unnecessary—could be skipped but somehow slipped into your to-do list.

The first step to avoid friction is to say no to the unnecessary.

Once we've filtered out work what isn't required, we categorize the remaining tasks into core or delegable.

Core work is crucial for you to do. Delegable work can be automated or delegated and carried out, without your intervention, by a machine or human, potentially faster and better than yourself.

The second step to avoid friction is to delegate as much as you can without sacrificing the quality of your work, running away from perfection, and focusing on what's essential for you to work on.

Friction is on what doesn't need to be done and what could be done by someone else.

OCTOBER 26, 2021

One Year of Live Streams — Live Q&A

Hi Friends—

We hosted two live events on YouTube to record a two-part podcast celebrating one year of live streams. The first part, out today, features audience questions on the challenges and evolution of the channel after a year of streaming (almost) weekly.

I mentioned way too many things in this episode, so I tried my best at linking to most terms and technologies in the notes below.

Listen to "One Year of Live Streams — Live Q&A"

OCTOBER 26, 2021

Ding! Ding!

Ding! Ding!

A dummy notification drags you out of the meeting.

Dismiss.

You look back at your computer screen.

But a tiny distraction was enough to lose track of the conversation.

Could you repeat the question?

OCTOBER 19, 2021

Digital art, black boxes, live streaming, and more

Hi, there! Today I want to share a few things that went live recently.

On the podcast.

I released a new episode with Aziz Barbar on non-fungible tokens (NFTs), blockchain, cryptocurrencies, and digital art. You can listen here.

I know very little about the fast-moving world of digital currencies and the new age of digital art, and these byte-sized episodes are an attempt for us to catch up with the latest developments. I intend to publish essays on the topic to share my findings.

While everyone's wondering whether the representation of ownership of digital creations with tokens is a bubble, events such as the 69-million dollar sale of Mike Winkelmann's body of work—@beeple_crap—in an auction by Christie's significantly contribute to the validation of this piece of technology.

A future episode with Aziz will discuss the role of black-box algorithms in our culture.

On the live stream.

Last week, I hosted two live events on YouTube to record a two-part podcast celebrating One Year of Live Streams, to be released soon. The first part features audience questions regarding the evolution of the live stream after a year of weekly streams. The second is a follow-up conversation with Jose Luis Garcia del Castillo on our experience coding live.

Elsewhere.

Lastly, Jose Luis invited Andrew Heumann to his Introduction to Computational Design class (GSD-6638) at the Harvard GSD to give a guest lecture on Architectural Automation & Augmentation. You can watch here.

OCTOBER 18, 2021

I found the following error while trying to execute PORT=4444 node ./bin/server.js on my Node.js application.

SyntaxError: Cannot use import statement outside a module

I solved it by adding the following into the package.json file of my NPM project.

  "type": "module",

Want to see older publications? Visit the archive.

Listen to Getting Simple .