Nono.MA

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

FEBRUARY 25, 2021

Batch-Export PowerPoint Slides to Images Programmatically

unoconv is a tool to "convert between any document format supported by OpenOffice," available to install via Homebrew on macOS. You can convert, for instance, ppt files to png images (or to a multi-page PDF files) by running a command with this command-line interface program. The project is open source and you can browse its code on GitHub.

Install unoconv with Homebrew

brew install unoconv

Common issues: LibreOffice not found on your system

I ran into this issue when I first ran the unoconv command.

unoconv
# unoconv: Cannot find a suitable office installation on your system.
# ERROR: Please locate your office installation and send your feedback to:
#        http://github.com/dagwieers/unoconv/issues

That's because unoconv can't find libreoffice. You can install its Homebrew Cask.

brew install --cask libreoffice

After doing that, unoconv can find the libreoffice installation.

unoconv
# unoconv: you have to provide a filename or url as argument
# Try `unoconv -h' for more information.

Export PowerPoint Slides to PDF

unoconv slides.pptx -f pdf

Convert PDF to PNG or JPG Images

Even though you can directly export a PowerPoint presentation to JPEG or PNG format, unoconv exports only the first page by default.

You can use ImageMagick's convert tool to rasterize the PDF pages as images.

convert -density 300 slides.pdf image%d.jpg

Batch-convert Presentations to Images

Here's a bash script that will convert all ppt presentations in a folder to jpg images by folders.

# Convert all pptx files to multi-page pdf files
unoconv -f pdf *.pptx

# Loop through pptx files
for f in *.pptx
do
    echo "${f}.."
    mkdir -p ${f}-jpg
    convert -density 20 ${f%.*}.pdf "./${f}-jpg/image%d.jpg"
done

Available formats

You can see the extensive list of supported input and output formats on unoconv's documentation and read more about how to use unoconv in its help manual page or by running unoconv -h.

FEBRUARY 24, 2021

To read environment variables from a Python script or a Jupyter notebook, you would use this code—assuming you have a .env file in the directory where your script or notebook lives.

# .env
FOO=BAR
S3_BUCKET=YOURS3BUCKET
S3_SECRET_KEY=YOURSECRETKEYGOESHERE
# script.py
import os
print(os.environ.get('FOO')) # Empty

But this won't return the value of the environment variables, though, as you need to parse the contents of your .env file first.

For that, you can either use python-dotenv.

pip install python-dotenv

Then use this Python library to load your variables.

# Example from https://pypi.org/project/python-dotenv/
from dotenv import load_dotenv
load_dotenv()

# OR, the same with increased verbosity
load_dotenv(verbose=True)

# OR, explicitly providing path to '.env'
from pathlib import Path  # Python 3.6+ only
env_path = Path('.') / '.env'
load_dotenv(dotenv_path=env_path)

# Print variable FOO
print(os.environ.get('FOO')) # Returns 'BAR'

Or load the variables manually with this script.

import os
env_vars = !cat ../script/.env
for var in env_vars:
    key, value = var.split('=')
    os.environ[key] = value

# Print variable FOO
print(os.environ.get('FOO')) # Returns 'BAR'

FEBRUARY 23, 2021

A world without email

From the outside, Cal Newport looks to me as a superhuman. On top of having family and kids, he teaches computer science at Georgetown University, Washington, publishes academic research papers, writes about the intersection of digital technology and culture, has published six books, and will be releasing his seventh book—A World Without Email: Reimagining Work in an Age of Communication Overload—next Tuesday, March 2, 2021, which is now available for pre-order.

Newport started writing and publishing books while he was a student—his first titles include How to Win at College, How to Become a Straight-A Student, and How to Be a High School Superstar—and started building a community of readers who enjoyed his Study Hacks blog.

So Good They Can't Ignore You was Newport's first book outside of the college or high school arena, which walks you through how to "build a career you truly love [where] you're not only paid well, but you're doing work that matters." Newport teaches the Top Performer course online—based on this book—together with Scott Young.

I've lost count of how many times I've recommended his latest books on the podcast and my writing, mainly Digital Minimalism and Deep Work.

Deep Work was a response to readers' questions on how to structure their workday. As reads the summary of his Wall Street Journal bestseller, "deep work is the ability to focus without distraction on a cognitively demanding task. It's a skill that allows you to quickly master complicated information and produce better results in less time." Newport firmly believes we can only do deep work with full concentration without distractions. His approach consists of working in a series of 1 h 30 min blocks separated by one-hour breaks that he uses for productive meditation (recharge walks or breaks in which your mind can continue pondering about the problems you're trying to solve at work). To keep track of your time, Newport created The Time-Block Planner, a notebook that lets you plan your day using this technique.

For the past years, I've been using this method using this 7:00–19:00 time-blocking sheet that you can download here. It contains four planning cards to print in an A4- or Letter-sized sheet to fold in four. Works best with two-sided printing to create eight cards to cover an entire week. I try to block time for deep tasks one day in advance at the end of my workday.

Digital Minimalism was a response to readers who asked how to manage their non-work time. My takeaway from this book is that a social media sabbath—going cold turkey for thirty days in a row—can help you get rid of the habit of mindlessly scrolling through your social media feeds and reclaim your leisure time, only getting back to using social media after you've identified what value you're getting out of them if any, and making sure to schedule your leisure time as well as your workday to ensure the activities you want to do are happening. It's interesting how much Newport—a person who's never been on social media—can contribute with his digital minimalism philosophy. In my case, I spent three months in a row without social media. I decided I would be present by sharing the content I created but wouldn't routinely interact in other ways and would remove the social media apps that remained on my phone.

A World Without Email will be released next week. As Newport mentions on his podcast—Deep Questions—online communication as we know it today isn't the result of careful thinking in search of the best way for knowledge workers to communicate but something that happened because the technology was there. We embraced email and instant messaging as the solution, but Newport explains how this constant influx of messages depletes our ability to perform deep work. He sees applications like Slack or Teams as transient applications that will go away sometime soon, as we devise new methods that will let us—as knowledge workers—work without distractions. I already pre-ordered a copy.

I doubt Cal Newport is superhuman, but I applaud his work and life approach and his consistency to ship work that matters.

FEBRUARY 16, 2021

The urban sketching habit

The 2020 pandemic broke my 'urban sketching' habit and I don't sketch outside as much as I used to.

Yesterday, the blue sky pushed me to leave the keyboard and adventure myself out with my sketchbook, pens, and watercolors.

I enjoyed drawing a concrete mixer truck as I caught up on the phone with Grandma, who will get her first COVID vaccine shot tomorrow.

The truck comes and goes to a huge building site at Hoyo de Esparteros, Málaga, for the ongoing construction of an H10 'high-rise'1 hotel by Pritzker Prize architect Rafael Moneo.

It'd be great to capture the hotel's evolution on my sketchbook, as days get longer and sunnier. That, surely, will help to get back the urban sketching habit.


  1. The building is just eight floors, but most buildings around it aren't more than three or four floors. 

FEBRUARY 15, 2021

Here's how I installed pandoc on my MacBook Pro (13–inch, M1, 2020) to run with Rosetta 2 — not natively, but on the x86_64 architecture — until a universal binary for macOS is built that supports the arm64 architecture in new Appple Silicon Macs.

This guide may be used to install other non-universal brew packages.

# Install Homebrew for x86_64 architecture
# https://soffes.blog/homebrew-on-apple-silicon
arch -x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
# Install pandoc using that version of Homebrew
arch -x86_64 /usr/local/bin/brew install pandoc

Outputs

==> Downloading https://homebrew.bintray.com/bottles/pandoc-2.11.4.big_sur.bottle.tar.gz
Already downloaded: /Users/nono/Library/Caches/Homebrew/downloads/34e1528919e624583d70b1ef24381db17f730fc69e59144bf48abedc63656678--pandoc-2.11.4.big_sur.bottle.tar.gz
==> Pouring pandoc-2.11.4.big_sur.bottle.tar.gz
🍺  /usr/local/Cellar/pandoc/2.11.4: 10 files, 146.0MB
# Check pandoc's version
arch -x86_64 pandoc --version

Outputs

pandoc 2.11.4
Compiled with pandoc-types 1.22, texmath 0.12.1, skylighting 0.10.2,
citeproc 0.3.0.5, ipynb 0.1.0.1
User data directory: /Users/nono/.local/share/pandoc or /Users/nono/.pandoc
Copyright (C) 2006-2021 John MacFarlane. Web:  https://pandoc.org
This is free software; see the source for copying conditions. There is no
warranty, not even for merchantability or fitness for a particular purpose.

Converting Markdown to Html

arch -x86_64 pandoc sample.md -o sample.html

Contents of sample.md:

# Hello, Apple Silicon!

- Pandoc
- seems
- to
- work.

Contents of sample.html:

<h1 id="hello-apple-silicon">Hello, Apple Silicon!</h1>
<ul>
<li>Pandoc</li>
<li>seems</li>
<li>to</li>
<li>work.</li>
</ul>

FEBRUARY 9, 2021

Each sketch is different

If you draw every day, it's inevitable to repeat certain objects. The items I bring with me daily—Airpods, phone, watch—and the ones I work with at my desk—computer mouse, microphone, laptop, chair—show up every once in a while on my sketchbooks. Yet each sketch is different. Think of the omnipresent face masks. Every time a mask sits on the table or hangs from a wall, it takes on a unique shape and sketching it becomes a brand new challenge.

Other artifacts and scenes, however, only appear once—the drawing of a place I traveled to, a gathering with family or friends, a building, a distinct palm tree—and become tied to a memory.

FEBRUARY 9, 2021

When running any git command — including git pull, git push, git status, etc. — I was getting this error on macOS Big Sur.

xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun

The message means the Xcode Developer Tools are not properly installed, and you need to run the following command to fix this.

xcode-select --install

A window will prompt you to Install the Developer Tools. After two minutes, a message saying "The software was installed" showed up on my machine, a MacBook Pro (13-inch, M1, 2020). I was good to go.

FEBRUARY 2, 2021

Snow emergency and sunny walks

Ever since I lived in Cambridge, Massachusetts, I receive emails from the City of Boston. Yesterday, Mayor Martin J. Walsh declared a snow emergency ahead of the forecasted winter storm, scheduled to start yesterday at noon and end today's afternoon (Boston time). "I am urging everyone to be ready and prepared for tomorrow's forecasted snowstorm," said Mayor Walsh. According to the warning, my fellow Bostonians are better off removing their vehicles from main roads, using caution outside, and staying home.

Here, in Málaga, Spain, all non-essential business is about to close for fifteen days. The weather doesn't invite us to stay inside; the high was 25 Celsius degrees last week. Mask ok, I walked more than twenty kilometers over the weekend, wearing my sunglasses and enjoying the sunny weather. We'll get colder days before the summer, but nothing compared to the snowy winters of Cambridge.

I get nostalgic of my days in Cambridge when friends send pictures; I used to walk to class under the snow, boots on, enjoying this buffer time to be alone with my thoughts, call, or listen to podcasts. That nostalgia might be why I don't click the 'unsubscribe' button at the end of the City of Boston.

There's barely anything we can do. But we can still walk outside.


Be safe, stay sane, and stay healthy.


P.S. You can now listen to a new Getting Simple podcast episode with Mike Gabour on Falling in Love With the Ocean, Dark Showers, Attention, The Sensorium, and The Contents of his Backpack.

FEBRUARY 1, 2021

Mike Gabour — Falling in Love With the Ocean, Dark Showers, Attention, The Sensorium, and The Contents of his Backpack

Hi Friends!

Today, I bring you an insightful conversation with Mike Gabour, a good friend of mine whom I admire and have been meaning to get into the show for a while. I love the attention he puts into everything he does and his peaceful and quieting worldview. Listening to him talk is soothing.

I hope you enjoy learning how Mike fell in love with the Ocean, his take on mindfulness, meditation, attention, and love, his experiments with dark showers, the Sensorium, a detailed commentary on the contents of his backpack (of which we'll share a video in the coming weeks), and much, much more.

Without further ado, let's dive into Mike's mind.

Listen to "Mike Gabour — Falling in Love With the Ocean, Dark Showers, Attention, The Sensorium, and The Contents of his Backpack"

JANUARY 26, 2021

The new sketchbook

Awhile back, I wrote about my sketchbook of choice: the A4, landscape, 300-gram watercolor Moleskine (29.7 x 21.0 cm, 8.25 x 11.75 in). After going through four of these sketchbooks, I've grown used to their format. But it feels as if the Italian brand decreased the paper quality of their sketchbooks; its pages don't hold watercolors as well as they once did.

While I investigate whether it's the sketchbook or my use of it that's changed, its apparent decline in paper quality made me look for alternatives. Luis Ruiz recommended the Alpha and Gamma Series from Stillman & Birn—an American company founded in 1958 by the black hardbound sketchbook pioneer, a Viennese bookbinder by the name of Philip Birn (1911–2004).1 I decided to go for the hardbound, 150–gram, white-paper Alpha Series (22.9 x 15.2 cm, 9 x 6 in), slightly bigger than an A5 sheet. The Sakura Micron 005 and 01 pens run smoothly on the Stillman & Birn sketchbook, whereas they scratch the surface of my 300-gram watercolor Moleskine paper. And I can work with my watercolors reasonably well, as long as I don't apply too much water.

Here's the first page of my Stillman & Birn sketchbook. I'll be sharing more of my sketches and thoughts on this sketchbook in the coming months.


Sample sketches on a Stillman &amp; Birn Alpha Series sketchbook.

If you use them, what are your notebook and sketchbook of choice?


  1. Stillman & Birn. (2021). About Stillman & Birn. Accessed Monday, January 25, 2021. 

JANUARY 19, 2021

Here's how to execute a deployed AWS Lambda function with the AWS command-line interface.

Create a payload.json file that contains a JSON payload.

{
  "foo": "bar"
}

Then convert the payload to base64.

base64 payload.json
# returns ewogICJmb28iOiAiYmFyIgp9Cg==

And replace the contents of payload.json with that base64 string.

ewogICJmb28iOiAiYmFyIgp9Cg==

Invoke your Lambda function using that payload.

aws lambda invoke \
--function-name My-Lambda-Function-Name \
--payload file://payload.json \
output.json

The request's response will be printed in the console and the output will be saved in output.json.

If you're developing locally, you can use the aws lambda update-function-code function to synchronize your local code with your Lambda funciton.

JANUARY 19, 2021

What's so great about live streaming?

There's no edit button.

Whatever happens, goes online in real-time—live.

Viewers can engage and interact.

You can produce as many hours of content as you invest in live streaming.

After the fact, you can edit videos, curate, filter, censor, and re-upload your content as separate clips; in a more digestible format.

But post-processing is a time sink.

(Even when machine-learning-based tools—think Descript—help you out.)

What comes with live streaming, as with any other public speaking gig, is that, over time, you get more comfortable and are willing to ship content with fewer edits, and that's something I'm working hard to improve.


P.S. In case you missed it, I started live-streaming four months ago. For now, streams focus on machine learning, but I plan to cover topics related to creative coding, podcasting, design, writing, sketching, and workflow automation.

JANUARY 13, 2021

I got this error while trying to pip3 install tensorflow. I tried python3 -m pip install tensorflow as well — it didn't work.

ERROR: Could not find a version that satisfies the requirement tensorflow
ERROR: No matching distribution found for tensorflow

As was my case, the reason for this error might be that you are using pip from a Python version not yet supported by any version of TensorFlow. I was running Python 3.9 and TensorFlow only had compatibility up to Python 3.8. By creating a new environment with Python 3.8 (or reverting the current environment to use 3.8) I could pip3 install tensorflow successfully.

Want to see older publications? Visit the archive.

Listen to Getting Simple .