Paolo Amoroso's Journal

Tech projects, hobby programming, and geeky thoughts of Paolo Amoroso

I bought a Lenovo Tab M10 Plus 3rd Gen 10.6” Android tablet to replace my old Lenovo Tab M8 HD 8” tablet. I picked this €189.00 Wi-Fi unit with 4 GB RAM and 128 GB storage:

Product box of Lenovo Tab M10 Plus 3rd Gen 10.6" Android tablet.

Motivation

The Tab M8 HD is on okay compact and light tablet with acceptable screen quality, but has a couple of issues that make it unsatisfactory for more than casual usage.

First, it's slow. Unbearably slow.

Every gesture or action comes with considerable lag. When the device boots up, it takes a lot of time to initialize and start all the processes before the system responds to user input. This is because of a combination of slow SoC and limited RAM, 2 GB for my Tab M8 HD. It's just not enough and the system is contantly swapping, with a major toll on latency.

Another issue is the 8” screen is not large enough to read wide, fixed layout documents and ebooks without workarounds.

I eventually got tired of the dog slow Tab M8 HD and its limitations and decided to replace it.

I wanted an affordable tablet with more RAM and noticeably better performance. In addition, I seeked a screen large enough to make A4 PDF documents, fixed layout ebooks, and programming ebooks with source code blocks comfortably readable, without adjusting the zoom or page settings of reading apps. Another important feature I was after is a software experience close to stock Android.

After overcoming some initial reservations about the weight and bulk of devices above 8”, I was eager to try a large tablet.

Reviews

My product research quickly homed in on the Tab M10 Plus 3rd Gen.

But at first something held me back, making me hesitate: the reviews were mixed, literally. Although the reviewers praised the design and finish, the great screen, and the price point, they expressed a wide spectrum of opinions over a feature I was very interested in, performance. Here are three representative reviews, from the most critical on performance (XDA Developers) to the most favorable (Android Police):

This range of opinions convinced me the performance of the Tab M10 Plus 3rd Gen was highly subjective. I deemed acceptable the risk of disappointment and went ahead with the purchase.

Hardware

I've been using the tablet for a few days and already love it. It finally comes with all I was looking for in such a device, adequate performance and screen real estate.

The design, material, and finish have a definitely premium look, especially at this price point. The screen is just gorgeous, bright enough and crisp. This is what the tablet looks like:

Lenovo Tab M10 Plus 3rd Gen 10.6" Android tablet.

Despite the size, the device feels less heavy than I expected and I can comfortably hold it for long sessions. Although I mostly use the tablet in portrait mode, the good balance and weight are making me use it more in landscape mode. The latter orientation is more natural than I thought and the large screen gives properly optimized apps enough room to take advantage of the additional area.

Performance doesn't disappoint. While the Tab M10 Plus 3rd Gen is no top of line device (why do reviewers pitch in benchmarks a budget tablet against a premium iPad, anyway?), it's way better and more responsive than the Tab M8 HD. Which is all I wanted. With the new tablet, lag is only occasional and with a short upper bound. I can finally pick up the device and use it right when the bootstrap ends.

Although most reviewers evaluate peformance by running demanding apps such as games or media editors, I actually mostly use reading apps like ebook readers, RSS feed readers, and web browsers. This may explain the subjectivity of opinions over performance.

For the kinds of apps I run, the tablet does really well. But it can handle more resource intensive processes such as 3D graphics simulations, for example the Celestia and GlobeViewer Moon astronomy apps.

Face unlock is usable, more responsive and accurate than the Tab M8 HD.

The cameras deliver barely serviceable results only with very good lighting, otherwise the slightest darkness produces a noisy mess. But the sensors are okay for the occasional video call or QR code scan.

Battery life is very good. A full charge gets me through at least three or four days of my typical usage.

Software

Lenovo delivers devices with mostly stock Android and little bloatware, which is among the reasons I went with the vendor.

The system software of the Tab M10 Plus 3rd Gen is indeed mostly stock Android 12 with a few extra apps for operating specific features, such as a notetaking app for the Lenovo Precision 2 pen or the Dolby Atmos options in the system settings. Android 13 is coming sometime in 2023.

I initially set up the home screen like this with the productivity, messaging, and astronomy apps I use most:

Home screen of Lenovo Tab M10 Plus 3rd Gen 10.6" Android tablet.

The reviews noted that, over the past few years, Lenovo dialed up the bloatware a bit. But, again, I accepted the risk. The tablet does come with some bloatware in the form of over a dozen preinstalled apps and games. But, to Lenovo's credit, all can be uninstalled, a one-time task of just a few minutes.

One more tweak is needed though. Tablet Center, a preinstalled Lenovo app that provides support and warranty information, issues occasional notifications promoting support plans. Turning off the app's notifcations removes this last annoyance.

Reading

The Tab M10 Plus 3rd Gen turned out to be perfect for the digital reading I do.

I tried several digital publications with a range of layouts and formatting. The default settings of the Google Play Books and Kindle apps are all it takes to comfortably fit A4 PDF documents and fixed layout ebooks on the screen, without zooming. The same goes with reflowable ebooks that contain wide source code blocks. Nearly all lines fit within the margins with no wrapping.

No reading settings adjustments are required, no workarounds.

The 10.6” screen of the device also helps with browsing websites and reading web content. The magic of responsive layouts nicely adapts the content and fills the large screen.

Conclusion

My experience with tablets began in 2012 with the original Nexus 7. After using other 7” and 8” tablets, the Tab M10 Plus 3rd Gen finally convinced me that, for the kind of reading-centered tasks I use these devices for, bigger is better.

The Tab M10 Plus 3rd Gen has all the features I wanted, exactly the way I wanted them. I nailed it.

#Android

Discuss... Email | Reply @amoroso@fosstodon.org

I'm writing this with a TedGen keyboard, a wireless unit with Italian layout I bought for my ASUS Chromebox 3. Here's the product which comes also with a wireless mouse:

TedGen wireless keyboard with Italian layout.

The mouse doesn't work well though as rolling the wheel causes periodic jerky movements of the pointer. I had to keep around my old Logitech M220 mouse.

The TedGen keyboard was essentially an impulse buy. I prefer short-travel chicklet keyboards and the TedGen's design caught my attention. Plus it takes up less desk space than my old Nilox Kt40W.

I've been using the keyboard for several weeks and I like it. The keys have a nice touch similar to that of laptop keyboards.

#chromeOS

Discuss... Email | Reply @amoroso@fosstodon.org

As a hobby programmer, my greatest skill gap is achieving good software design. There's very little useful literature on problem decomposition and the main way of learning design seems a byproduct of writing lots of code.

I hope discovering and reading A Philosophy of Software Design, a book by John Ousterhout of Tcl fame, will make a difference.

The book starts by defining complexity in software and explaining its effects on the evolution and growth of systems. Along with this it defines the module, a unit of system decomposition that helps reason about design issues. The remainder of the book provides some key red flags to spot complexity, and presents principles and coding practices that improve design while controlling complexity.

Although general, these principles are precise enough to be applicable and effective. The principles and the red flags gently funnel a system along a path through the design space that progressively shapes the system to reduce complexity.

The strength of A Philosophy of Software Design is the guidance it provides helps achieve good design even without highly structured processes or step by step instructions. Ousterhout acknowledges with humility the vastity of the endeavour and doesn't promise silver bullets or instant solutions.

Another thing I like is the few code samples are surprisingly short, clear, and effective at making a point. Although the code is in Java and C++, the material applies to any language.

#books #development

Discuss... Email | Reply @amoroso@fosstodon.org

I finished implementing the commands of Stringscope, the string listing tool I'm developing with Medley Interlisp.

After Sort, Reset, and Exit I wrote the code for Min Len, Find, and Get. I also added the new command Info to show in the prompt area some statistics about the strings. Coding the other commands gave me the idea and Implementing Info seemed easy, so I did it.

Now Stringscope looks like this, with the prompt area attached to the top side of the main window and the menu at the right side:

Window of the Interlisp program Stringscope with an advanced version of the command menu.

I renamed the menu item Set threshold to Min Len as the former was too wide and stood out. Min Len is more consistent with the documentation and code of Stringscope. In addition, I centered the items instead of aligning them flush left. This is the more idiomatic way most traditional Interlisp programs and system tools lay out menus.

To explain how the commands work I recorded a screencast that walks through the features and input validation of Stringscope.

I demonstrated the program by opening and interacting with two binary files, the DOCTEST.TEDIT document created with the TEdit rich text editor and the program's compiled executable STRINGSCOPE.LCOM. I also threw in some invalid data as input to show input validation in action.

After writing the code of the commands I realized Stringscope grew to support all the features I initially planned, plus a couple more I thought of along the way.

Medley Interlisp seemed overwhelming and intimidating at first but it was too much fun, so I pressed on using and studying the system. The effort paid off and now I can not only find my way around, but also create a small yet complete program with a GUI. This is a milestone to celebrate.

It's probably time to ship version 1.0 and start thinking of how to improve Stringscope and its design.

#stringscope #Interlisp #Lisp

Discuss... Email | Reply @amoroso@fosstodon.org

I completed the migration of my personal web site from Squarespace to Blot and it's now online at paoloamoroso.com.

After fleshing out the content I disconnected the domain from the old site and connected it to the new one. The content and its organization need improvement but, now that the infrastructure is in place, I can continue from there and make all the required tweaks.

Blot is a static site generator that can publish to a site a folder stored on Google Drive like in my case, on Dropbox, or a Git repository. I set the site to Blot's Magazine template which I like for its sans serif font but I'm using only pages, not blog posts.

#misc

Discuss... Email | Reply @amoroso@fosstodon.org

I'm having a lot of fun working on the commands of Stringscope, the string listing tool I'm developing with Medley Interlisp.

I implemented the Sort menu item with its subitems Ascending and Descending, as well as the Reset item. I added also the Exit item for quitting the program, a low-hanging fruit that just required calling the CLOSEW window manager function for closing the main window.

The main window of Stringscope, the command menu, and the prompt area now look like this:

Window of the Interlisp program Stringscope with an early version of the command menu.

The commands didn't require too much new code. I take it as a sign the foundation is solid, or at least not too shaky. And Interlisp's powerful menu system made things easier. But there's some code duplication I'm not satisfied with that will need refactoring.

The next commands to implement are the ones that take input from and output to the prompt area: Get, Find, and Set threshold.

#stringscope #Interlisp #Lisp

Discuss... Email | Reply @amoroso@fosstodon.org

I've begun migrating my personal website from Squarespace to Blot.

It's a small site of a dozen pages intended as a brochure with basic information on me, my activities and projects, as well as links to my blog and online profiles. Think of it as a glorified link in bio.

Motivation

I couldn't stand looking at my site anymore, I wanted out of it.

The polished details of a professionally designed template gave the site a marketing feel that doesn't represent me. Instead, I want a more lightweight, clean, and lean online home hinting it belongs to a genuine individual. It's okay if the site delivers the amateurish but authentic vibes of a hobby project.

Another motivation to migrate was cost.

At about €240 per year, Squarespace isn't cheap and its inflexibility adds to the cost. Once assigned to a site, a theme can't be swapped for another one without paying for an additional site to associate it to.

Why Blot

Prior to Squarespace I maintained the site with Weebly. Drag and drop site builders like them make it easy to arrange content or tweak the design but their rich-text editors introduce friction when working on what matters, text.

Using Write.as to publish this blog spoiled me in how productive and frictionless Markdown is. As a Squarespace alternative I wanted a Markdown-centric publishing platform that could be operated entirely online on chromeOS, integrating seamlessly with my cloud lifestyle.

Traditional static site generators support Markdown but are too complex to set up and maintain. And they may not be a good fit with the cloud.

I procrastinated researching an alternate site builder as googling for it involves highly targeted keywords that yeld lots of ads and SEO-optimized crap. Luckily, by chance I stumbled upon Kev Quirk's praise of Blot which I had heard about.

Checking out Blot and reading the documentation confirmed it could be the right tool, almost.

Blot is designed around blogs and, by default, the home page of the sites it makes displays a list of dated entries in reverse chronological order, as well as matching navigation elements. This isn't the right layout for an infrequently updated personal site.

An email exchange with Blot's developer David Merfield turned out a simple metadata tweak to remove any references to blog entries and customize the home page to my liking. All I needed was to mark the home page as a landing page. David's support is excellent and with a personal touch.

The toolchain

The tools I use to build and maintain the site are a byproduct of the way Blot works.

Blot is a static site generator that synchronizes the source files stored in an online folder on Google Drive, Dropbox, or a Git repository and publshes them to a site served from Blot's own infrastructure. My familiarity with Google Drive and its cloud-centric nature made obvious the choice of where to store the site folder.

I could edit the sources with Google Docs but its Markdown support is limited. Instead I use the beaufitul web-based Markdown editor StackEdit, which can save the files to and synchronize them with Google Drive.

Some tweaks to the site, such as configuring the navigation menu and URL redirects, go through the online dashboard on Blot's website.

Next steps

So far I set up the new site on a Blot subdomain, selected a layout based on a template I like, and began fleshing out the content. When it looks good, I'll disconnect my domain from Squarespace and connect it to the new site.

I hope to ditch Squarespace soon.

#Google

Discuss... Email | Reply @amoroso@fosstodon.org

As an amateur astronomer, Astrophotography mode is one reason I got my old Pixel 4 XL and my current Pixel 7 Pro.

But there’s another essential piece of gear for taking long-exposure photos of star fields or astronomical phenomena, a tripod. The one I bought for the Pixel 4 XL and now use with the Pixel 7 Pro is a Phinistec photo tripod, here with some of the included accessories:

Phinistec photo tripod with accessories: carrying pouch, smartphone adapter, Bluetooth shutter.

I do all my astrophotography from an apartment building in Milan, Italy, where I live. It’s a light-polluted urban area but these days I can’t wander around much.

I observe the sky from the apartment’s small balconies, which have the area of a medium-sized carpet. This constrains the camera holding gear I can use. I wanted a full-height tripod that can extend to at least waist level, not a tabletop tripod, as I can’t use tables or other elevated surfaces to set the photo equipment on.

The Phinistec tripod reaches a maximum height of 125 cm. It’s cheap, compact, and very light. It comes with a smartphone adapter, a Bluetooth remote shutter, a carrying pouch, and a Gopro adapter I don’t need.

Although the product specs mention compatibility only with iOS, the Bluetooth shutter works fine with Android. To pair it with your phone turn on Bluetooth discovery on the device, power up the shutter, and follow the prompts on Android.

The tripod is perfect for Astrophotography mode with the my Pixel. I can quickly set up the tripod and bring it to a balcony.

There’s a minor inconvenience, though. Even at full height, when pointing areas of the sky at high angular altitudes, viewing the phone’s screen is not much practical. I have to uncomfortably crouch or bend behind the screen.

#astronomy #Android

Discuss... Email | Reply @amoroso@fosstodon.org

I changed my RSS reader from Feedly to Inoreader.

The affordable Supporter plan I subscribed to is the lowest Inoreader tier but I chose it not because I want something cheap, it's just the plan happens to provide all the features I need. I left behind a lifetime Feedly Pro plan that allows me to use the product indefinitely at no cost.

Importing my feeds and folders from Feedly via the API was seamless and smooth.

Motivation

I had been using Feedly for ten years since March 13, 2013 when Google announced the shutdown of Google Reader. Over the years Feedly kept adding AI and enterprise features I didn't care about as an individual user. Although the Android app remained inadequate for a long time, Feedly is an okay product despite its frequent outages and performance issues.

I eventually grew dissatisfied with the reliability of Feedly and the company's drift away from the core RSS experience, which made me want to look for something new. A shameful new Feedly feature set the right timing to research a different newsreader.

I want a cloud RSS reader that synchronizes across platforms, particularly the web and Android. I had long heard great things about Inoreader, checked it out, loved it, and purchased a subscription.

First impressions

Inoreader has a clean and pleasant design with the right similarities to Feedly.

The general layout and the choice of keystrokes, mostly the same as Feedly, make the application immediately familiar and usable. Article presentation and formatting are better than Feedly's, which often doesn't render correctly certain page elements. For example, code blocks stand out nicely in Inoreader.

The web client is consistently fast and responsive. So far I haven't experienced the typical slowdowns and outages of Feedly.

What surprised me of Inoreader is text search actually works and instantaneously delivers accurate results. I hadn't seen these levels of search accuracy and performance in RSS readers since Google Reader. Compare this with Feedly's search, which takes several seconds and misses results I'm sure are there. Feedly search is an oxymoron.

A great Inoreader feature missing from Feedly is the ability to load the full text of the articles in partial feeds, it takes just a keypress. This alone is worth Inoreader.

The Chrome extension makes Inoreader double as a read later tool. My primary read later tool is Google Keep but I'm liking Inoreader's smooth workflow for saving and reading web pages.

The Android app has all the key features of the desktop version. For example, swiping down an article in a partial feed downloads the full text. Also, sharing to Inoreader a link to a website with an RSS feed prompts to subscribe to the feed or save the page for later. It's a no brainer, but the Feedly app doesn't support it.

Inoreader is making me rediscover RSS. Reading sessions felt like routine with Feedly, but Inoreader makes me eagerly anticipate sitting down and catching up with my favorite sources.

#blogging

Discuss... Email | Reply @amoroso@fosstodon.org

I'm enhancing Stringscope with a permanent command menu and a prompt area. The menu, an item of which holds a submenu, attaches to the right side of the main window, the prompt area to the top of the main window above the title bar. This is what the main window looks like now:

Window of the Interlisp program Stringscope with an early version of the command menu.

This way of arranging menus and secondary windows by attaching them to a main window is typical of Interlisp programs with a GUI. The system supports this design with functions like the ones I used, CREATEMENUEDWINDOW to create and attach a menu and GETPROMPTWINDOW for doing the same with a prompt window.

The menu comprises these initial items and subitems:

  • Get: reads the strings of a new file
  • Find: searches for strings matching a specific text
  • Sort: sorts the strings in the following order
    • Ascending
    • Descending
  • Set threshold: changes the minimum length of strings
  • Reset: redisplays the strings read from the current file

The prompt window is an area for displaying status messages and receiving user input such as the name of a new file to read.

So far the Stringscope code sets up the menu and the prompt window. The menu handling function, however, is just a stub that prints to the main prompt window the selected menu item.

The next step will be to implement the commands the menu calls.

#stringscope #Interlisp #Lisp

Discuss... Email | Reply @amoroso@fosstodon.org

Enter your email to subscribe to updates.