Remarkable Paper Pro


tl;dr: reMarkable Paper Pro gets five stars, but it isn’t for me.

Background

For several years I have been aware of reMarkable and their tablet. If you aren’t aware of them, the tablet promises a paper like writing experience and it has a limited set of features to help you stay focused on writing or consuming documents.

I resisted the urge to buy the reMarkable 2, but when I saw the announcement for their latest product, the Paper Pro, I decided to give it a try. The 100-day return policy made trying something complete new to me, risk free.

Unboxing

reMarkable has a very Apple-like out-of-box experience, in the best possible way. The boxes are easy to open with pull tabs, and the contents are nicely displayed. The tablet itself is remarkably (Ha!) thin and light. This was my first eInk device and I was impressed with the clarity of the screen and the ease of reading it. I can see why it may be easier on some people’s eyes, since there is no constant back light.

Setup and Configuration

After opening the packaging I had the tablet, a base-level folio cover, the marker (with eraser), and a flat type-C power cord. Turning it on, attaching the marker and setting up a reMarkable account were quick and easy tasks.

Navigating the user interface did present a couple of small challenges. Taps needed to be a fraction longer than I expected. There is also a slight delay as the display refreshes. Not objectionable but noticeable coming from the land of iPads. Within a day I had several folders and a notebook or two in each.

Using the Paper Pro

Handwriting notes was a very nice experience. The textured surface of the screen combined with the nib on the tip of the marker really does emulate the feel of writing on paper with a pen or pencil. Discovering that the OS will automatically straighten a drawn line if you pause the marker briefly after sketching it was delightful. It will also make squares and triangles. I wasn’t able to product a circle.

I was able to add my Dropbox account as an integration, allowing me to transfer files via that service. In order to have some PDF content to consume, I have been hoarding some PDFs of web pages since I placed my order. Scaling them to the screen size requires some pinching and zooming. You can fit them to the screen based on height, or width, or set a custom size. The custom size is done with a pinch-and-zoom motion. The refresh lag while pinching does make getting the size right a bit tricky.

Use Case

My use case, in broad terms, is to have one place for all my notes. I have tried paper notebooks many times in the past. They always start out purposefully but then I start doodling in the margins, or mixing work notes with personal. Then I am unhappy because the notebook is no longer “orderly”.

I can and do take notes on my computer. But I can’t easily draw or sketch ideas on the computer. I tend to use the back side of page-a-day calendars for note taking. My desk is littered with dozens of small pieces of paper. Some with doodles, others with important lists, some with sketches or ideas. Periodically I sift through and rewrite some to make them neater or to separate the note from doodles or to cull no longer needed notes.

The other use case that reMarkable touts is reading PDF files and marking them up. Turns out this use case isn’t one of my requirements. The friction required to convert a web page or other document to PDF format and then transfer it to the reMarkable, only then to have to fiddle with sizing it, meant I was happier reading the material in its raw format on my computer. I can easily see a lawyer, or researcher making excellent use of the PDF features.

Returning for a Refund

There is nothing wrong with the reMarkable Paper Pro. It is a quality device made for very clear and specific purposes. They set out to fill a niche and I think they have completely succeeded. That niche isn’t one I need to scratch. I am very glad to have tried the Paper Pro–now I know what it is and what it isn’t. I have satisfied my curiosity about it.

Therefore I have returned it for a refund. I give it five stars, and would recommend it to anyone who had the very specific use cases it sets out to satisfy.


Moleskine Mania: How a Notebook Conquered the Digital Era



Homemade Personal Pan Pizza


For the past several months I’ve been making personal pan pizzas at home. The recipe I’m using is simple, and the results have been surprisingly good.

Recipe

(This makes two 8" inch pizzas)

Dough

  • 3/8 teaspoon of dry yeast
  • 3/4 cup of warm water
  • 1 teaspoon Kosher salt
  • 7 ounces bread flour
  • Olive Oil
  • two 8" cast iron skillets
  • 8 or 9" cake dish

Topping

  • Pizza Quick sauce
  • Shredded Mozzarella cheese
  • Pepperoni
  • Grated Parmesan cheese

Combine the yeast and water, stirring to mix. Ideally this should sit for 5 minutes before being combined into the flour. I stir the water a couple times during that wait to make sure all the yeast is dissolved.

Measure 7 oz of bread flour and add the salt. Stir to combine.

Pour the water and yeast mixture into the flour. Stir until just combined. It should look dry.

I use a 9 inch square Pyrex baking dish for the dough to rise in. Oil the dish with olive oil. For the cooking step below the oil cannot be Extra Virgin, as that has a lower smoke point and will burn, so I use regular olive oil throughout this process.

With the dish lightly oiled, and at least one of your hands oiled as well, transfer the dough to the dish. Spread it out as evenly as possible. It won’t cover the bottom, but that is okay.

Cover with plastic wrap (puncture the plastic several times with the point of a knife). Let the dough sit for at least 8 hours. I make mine the night before.

About 2 1/2 hours before mealtime, oil two 8" cast iron skillets, bottom and sides. Split the dough evenly. Gather half the dough up into a loose ball and place in the skillet. Pull the sides up and over the top, and then flip the dough over. Spread it out as much as it will allow. Again, it won’t cover the bottom. Repeat for the other half.

Preheat the over to 350 degrees for 2 or 3 minutes, then turn it off. You want it warm, not hot. Place the skillets in the oven for the final rise. Loosely cover with plastic wrap.

About 30 minutes before mealtime, remove the skillets from the oven. The dough should have risen and spread out in the skillets. Preheat the oven to 550 degrees or as hot as it will go. Ours tops out at 525.

While the oven is heating, add pizza sauce and your choice of toppings. I put 2, maybe 3, tablespoons of pizza sauce on the dough, spreading it out evenly from the center, leaving a 1/2 inch or so dough as a border. I use just enough shredded Mozzarella cheese to cover the sauce. Add pepperoni or other toppings. Sprinkle a teaspoon or so o grated Parmesan cheese over the top. When the oven is ready, bake the pizzas for 15 minutes.

Remove from the pan (slice if desired) and transfer to plates and enjoy.


Browser History


If you frequent a site enough time, your browser will start to auto-complete that site’s URL when you begin typing its domain. Here is a list of what a single letter entered into the address bar of my browser produces.

A - amazon.com
B - boards.greenhouse.com
C - chatgp.com
D - daringfireball.net
E - en.wikipedia.org
F - fasterthenl.me
G - github.com
H - hackmd.gfuzz.de
I - imore.com
J - jimmymiller.github.i
K - kottke.org
L - lobste.rs
M - mail.google.com
N - news.ycombinator.com
O - os.phil-opp.com
P - polymonster.co.uk
Q - quillbot.com
R - rsdlt.github.io
S - sourcegraph.com
T - textualize.io
U - usgs.gov
V - veykril.github.i
W - www.youtube.com
X - xeiaso.net
Y - youtube.com
Z - zed.dev


How to Write Comments in Json


I spend a lot of time working in either JSON or YAML while building out infrastructure in AWS. I prefer YAML as I find it less cumbersome to type and it allows for comments.

Today on Mastodon I saw this posting that illustrates a way to put comments into JSON.

{
    "//": [
      "I am a comment",
    ],
    ...
}

Cumbersome, but effective.


How to Remove Outdated Local Git Branches


To clean up local Git branches that no longer exist on the upstream repository, you can run these commands.

Update your working copy

To start, make sure your working copy is up to date.

git fetch --prune

The --prune option removes and remote tracking references that no longer exist on the remote repository.

Discover which branches are already merged

By running

git branch

You get a list of all the branches on your working copy. Using the --merged flag, filters that list to show only those branches that are already merged into the main or master branch.

git branch --merged

Delete all merged branches

To delete all the merged branches from your working copy, run this command.

git branch --merged | egrep -v "(^\*|master|main)" | xargs git branch -d

The list of merged branches is piped to an egrep command that eliminates the master or main branch, as we don’t want to delete those. The remaining branch names are pipes to the git branch -d command, which deletes them.

Notes

Whenever I find a command or set of commands online, that purport to accomplish some task, I always break the command down, and execute each stage of it, to make sure I understand what it is doing, and to ensure that it does what the author claims. Trust, but verify.


How to See Only Active Network Interfaces on Macos


MacOS has a number of network interfaces making the output from ifconfig messy and not easily visually parsed.

Network Interfaces

A non-exhaustive list of network interfaces you might see on MacOS includes

  • ap1 - Access Point. Used if you are using your Mac as a wireless access point where you are sharing its connection.
  • awsl0 - Apple Wireless Direct Link. WiFi P2P link for AirDrop, Airplay, etc. Also used for Bluetooth.
  • llw0 - Low latency WLAN interface. Used by the Skywalk system.
  • utnun# - Tunneling interface. Use for VPN connections. MacOS seemingly hangs on to multiple utun interfaces, even after they aren’t in use.
  • lo0 - Loopback or localhost
  • gif0 - Software Network Interface
  • stf0 - 6to4 tunnel interface
  • en0 - Ethernet interface
  • en1 - Wireless interface
  • en5 - iBridge / Apple T2 Controller
  • en6 - Bluetooth PAN
  • en8 - iPhone USB
  • en9 - VM network interface
  • en10 - iPad
  • bridge0 - Thunderbolt Bridge

List current IP addresses

A simple way to see the current list of IP addresses your Mac has is by using an alias like this.

alias inet='ifconfig | grep inet | grep -v inet6'

Which produces output similar to this.

   ❯ inet inet 127.0.0.1 netmask 0xff000000
        inet 192.168.6.39 netmask 0xfffffc00 broadcast 192.168.7.255
        inet 192.168.65.1 netmask 0xffffff00 broadcast 192.168.65.255
        inet 100.101.18.109 --> 100.101.18.109 netmask 0xffffffff

While that can be useful, it would be nicer to know which interface had which IP address.

List current IP addresses and the network interface

This command will display the name of the network interface and the assigned IP address for the active network interfaces.

ip -4 addr show | awk '/inet/ {print $NF, $2}' | column -t

In order for this command to work, the iproute2mac formula via Homebrew.

The ip -4 addr show displays all the network interfaces having an IPv4 address.

❯ ip -4 addr show
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
        inet 127.0.0.1/8 lo0
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
        ether 74:a6:cd:b6:eb:7f
        inet 192.168.6.39/22 brd 192.168.7.255 en0
utun8: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1280
        inet 100.101.18.109 --> 100.101.18.109/32 utun8
bridge100: flags=8a63<UP,BROADCAST,SMART,RUNNING,ALLMULTI,SIMPLEX,MULTICAST> mtu 1500
        ether 76:a6:cd:6b:c1:64
        inet 192.168.65.1/24 brd 192.168.65.255 bridge100

The awk statement filters for the line containing inet and then prints the last field from that line ($NF) and the second field ($2). The last field is the interface name and the second field is the assigned IP address.

The column -t command formats the output into columns.

❯ inet
lo0        127.0.0.1/8
en0        192.168.6.39/22
utun8      100.101.18.109
bridge100  192.168.65.1/24


Neovim Paste and Indent


Today I learned that you can paste and match surrounding indentation at once. After selecting the line or block of lines to be pasted, use ]p instead of only p. Et voila.

I am embarrassed to think of the hundreds, thousands of copy-paste operations I’ve done that were immediately followed by selecting the newly pasted block and fixing its indentation. I need the read the friendly manual more.


Putting a Conditional Clause in an Ssh Config


Enough years ago that I no longer remember when I discovered this trick, I added the following clause to my .ssh/config file.

# Access GitHub even when port 22 isn't available
Host github.com
  HostName ssh.github.com
  Port 443
  user git

In a nutshell, this allows you to access GitHub over port 443, instead of the usual port 22. Various places block port 22 traffic; having this in your configuration file sidesteps that problem.

Until last week this worked perfectly. Then it stopped working, but only on my work laptop. Not on my personal laptop, not on the Linux admin workstation running in AWS, not from any of my collection of Raspberry Pies or the Intel NUC that is my IRC and mutt host, only from my work laptop.

Thanks to a GitHub repository, all my configuration files are shared between the various computers I use. The same .ssh/config worked everywhere but my work computer.

Recently my employer suffered an intrusion–we were hacked. Security has been tightened considerably. Including not allowing ssh traffic over ports that aren’t :22. As soon as I commented out the GitHub clause, all my git commands started working again.

Some searching and reading of the ssh man page and a little experimenting allowed me to create this slightly altered clause.

# Access GitHub even when port 22 isn't available
# Host github.com
Match user !<user> host "github.com"
  HostName ssh.github.com
  Port 443
  user git

The Match keyword allows you to place conditions on the directives that follow. The user and host keywords (must be lowercase) let me place a guard around the GitHub port 443 setup. If I am signed in as my work id, then the clause is skipped, meaning a normal ssh connection over port 22. For any other user the clause is used, to access GitHub. There are several other keywords that Match can operate against, allowing you to create some sophisticated conditional restrictions in your .ssh/confg file.


Do It Yourself Genius Playlist


For a long time Apple Music (nee iTunes) offered an option called “Genius Playlist”. You selected a track from your collection, and Apple generated a playlist of 25 titles that were somehow related to the seed track. I had 15 or 20 of these. It was my own personal radio station. One without ads or an annoying DJ talking over the intro or outro of a song.

I’m not sure when Genius Playlists were eliminated from Music, but I miss that option. So I set out to make my own. Once upon a time fifteen or more years ago, I remember reading an article where someone created a set of smart playlists that categorized tracks, and then a master playlist that used those category lists as its input.

What I have create are four category smart playlists:

  1. Never Played
  2. Not Played in 90 Days
  3. Not Recently Played
  4. Recently Played.

I also scrolled through the list of tracks and ticked the “favorite” star on several hundred tracks that I particularly like.

Never Played: Tracks that are favorites, and have a play count of zero.

Not Played in 90 Days: Tracks that are favorites, and that haven’t been played in the last 90 days, but have a non-zero play count.

Not Recently Played: Tracks that are favorites, that have been played less than 90 days ago, but more than 15 days ago.

Recently Played: Tracks that are favorites, that have been played in the past 14 days.

Each of these category lists is limited to 50 tracks are are selected randomly.

The master list draws from all four category lists. Where the category lists AND all the rules together-Favorite AND never played-the master list ORs the rules-Playlist is Never Played OR Playlist is Not Played in 90 Days OR ….

The master list is also set to only 25 tracks, randomly selected.

I understand that the Never Played playlist will eventually run dry. And I’m not completely satisfied with using date ranges for the rest of the lists. What would work better, but requires considerable work, would be to rate tracks from 1 to 5 stars, and build lists around ratings and play frequency. A long term project.