Testing the IMAJINN WordPress plugin beta

European village in low mountain valley in autumn with a stream running through it, oil painting, award winning, by Albert Bierstadt, insanely detailed and intricate, hypermaximalist, elegant, ornate, hyper realistic, super detailed

So, I’ve recently been made aware of the emerging world of AI-generated images. Obviously, I’ve not gotten in on the ground floor of this phenomenon, as the array of options is already pretty wide. It would appear (maybe?) that IMAJINN is the first in this sphere to facilitate the generation and insertion of these images within a WordPress plugin – specifically a Gutenberg block. While I don’t use Gutenberg much because I develop in Divi, I do happen to use it here on my blog and it is a good platform for content creation.

This particular image was created with the text: European village in low mountain valley in autumn with a stream running through it because that’s where I live (southern Alsace, France in the foothills of the Vosges mountains) and I wanted to see how it might compare to my reality. I chose the parameters “Oil Painting” for the style, Albert Bierstadt for the artist style and “Detailed & Intricate” for the style modifier. There are a bunch of choices for each of these parameters so lots to explore here.

I like the image but it doesn’t match my reality, which is probably to be expected since Bierstadt is more of a “romantic” painter in his style and romantic doesn’t equal reality all the time!

The beta program is accessible here: https://infiniteuploads.com/imajinn/ and comes with 100 free image credits (this one cost 6 credits).

Clockify -> Power Query -> Excel -> Dolibarr

Freelancer administrative conundrums

I have not always been a freelancer but now that I am, I also need to do the administrative stuff to keep the business running.  It’s not what I love doing.  What I love doing is building systems and troubleshooting.  So when my administrative process for billing/invoicing became too painful as I gained more clients, I decided to “troubleshoot” it and enhance it. 

I was already using Clockify (free) to track my time for different clients and projects. It works well for me. I was also already using self-hosted Dolibarr to invoice my clients on both sides of the Atlantic. It also works well for me. What was more annoying, however, was taking the export from Clockify, bringing it into a spreadsheet and then copying that for my Dolibarr-generated invoices.

I tried using coupler.io (free) to suck the data from Clockify into Google Sheets and then from there into Excel (which I prefer over Google Sheets). This was definitely better than a straight export from Clockify (client-by-client) that I would then copy into Excel and massage a bit – but relying on all the free versions of different services only got me so far. There were edge cases that meant more data massaging out the back end.

My target Nirvana

So what did I want to do anyway? I guess I wanted to be able to copy a table from a spreadsheet (that already had the right numbers and format in it for that month, for that client) and paste it into an invoice “note” in Dolibarr. I realized that I would need to do some kind of coding to use the Clockify api to get the data I wanted and then some kind of coding in Excel to format/massage that data.

I still have some fine-tuning to do with respect to formatting, etc. but achieving the “heavy lifting” was so satisfying at the end, (and fairly complex), that I thought I’d share my experience so that maybe, at least, one other person might have a model to work from that helps them fill in the conceptual gaps.

Which “glue” to use?

I love using glueware to create functioning systems/sub-systems that accomplish real work. It is often difficult to learn to use a new piece of glueware for the first time, but the results can be sooooo satisfying! Then the gates are open for subsequent use of the tool and the horizon of things that can be accomplished grows. Over the years, I’ve done this with TSO Clist, MVS Rexx, WAAPDSUT, SyncSORT, DOS Batch, VBScript, AutoIt, VBA, Bash scripts, PHP, etc.

I considered perhaps trying to go straight from Clockify to Dolibarr since they’re both online products, but the layover in Excel-land, does offer other benefits. It also seemed a bit of a bridge too far to get things directly into Dolibarr. Maybe in the future.

I figured that it would be VBA since that is integrated into Excel and I’ve used VBA before – but mostly to create “applications” and rarely with Excel.

But as I searched it looked as if Power Query, which I had never used and had only really heard about vaguely before, was probably the way to go. There was nothing outlining exactly what I was trying to do but a fair amount of StackOverflow-kind-of-posts about Power Query access to Clockify via its api to pique my interest.

Little did I know how powerful Power Query was!

The Solution

Here is a step-by-step process to create a single sheet which corresponds to a Clockify workspace in an Excel 2019 workbook and to populate it with last month’s data (if it is the 1st-15th of the month) or this month’s to date data (if it is the 16th through the end of the month) rolled up to the task level (all the entries of a given task will be rolled up to one line item):

  1. Create a sheet in an Excel 2019 workbook. We’ll name it Parameters.
  2. In Parameters, create a table that looks like this:
  3. Name cell A2 StartDate and cell B2 EndDate
  4. What you see in A2 and B2 are not static strings but the result of formulas in each cell. Depending on what day of the month it is today, these forumlae return the beginning and ending dates of last month or the beginning date of this month and today. These are the dates that will be passed to Clockify to indicate the date range for which we are requesting time-tracking data.

    Populate StartDate with the following formula:
  5. Populate EndDate with the following formula:
  6. From the Data tab in Excel, access the pull-down menu from the Get Data icon and Launch the Power Query Editor:
  7. Once you’re in there, you’ll first need to change some privacy settings or your queries will fail and be blocked by the Formula Firewall with text like “Formula.Firewall: Query 'Query1' (step 'Source') references other queries or steps, so it may not directly access a data source. Please rebuild this data combination” that will stop the processing of the query. So you have to go to File > Options and settings >Query Options (like this)

Then you need to pick General > Privacy and select “Always ignore Privacy Level settings” (like this)

and press OK. Now you should not have this problem.

  1. Create a new, blank query via the New Query > New Source > Other Sources > Blank Query selection in the Ribbon:
  1. Launch the Advanced Editor in Power Query – this is where you can add code to access the Clockify API.
  2. Remove the bit of text already in the Advanced editor and paste this. It’s what I have in the Advanced Editor and you can use it by simply adding your Clockify API key and Clockify Workspace ID
     content ="{
       ""dateRangeStart"": """ & #"MyStartDate" & """,
       ""dateRangeEnd"": """ & #"MyEndDate" & """,
       ""detailedFilter"": {
         ""page"": ""1"",
         ""pageSize"": ""200"",
         ""sortColumn"": ""DATE""
       ""sortOrder"": ""ASCENDING"",
       ""exportType"": ""JSON"",
       ""rounding"": ""false"",
       ""amountShown"": ""EARNED"",
       ""billable"": ""true""
     Source = Json.Document(
                     Web.Contents(url,    [Headers=    [ #"X-Api-Key"="YourClockifyAPIKeyGoesHere"
     timeentries = Source[timeentries],
     #"Converted to Table" = Table.FromList(timeentries, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
     #"Expanded Column1" = Table.ExpandRecordColumn(#"Converted to Table", "Column1", {"description", "timeInterval", "amount", "rate", "projectName", "clientName"}, {"description", "timeInterval", "amount", "rate", "projectName", "clientName"}),
     #"Expanded timeInterval" = Table.ExpandRecordColumn(#"Expanded Column1", "timeInterval", {"duration"}, {"duration"}),
     #"Renamed Columns" = Table.RenameColumns(#"Expanded timeInterval",{{"duration", "Time (sec)"}}),
     #"Inserted Division" = Table.AddColumn(#"Renamed Columns", "Division", each [#"Time (sec)"] / 3600, type number),
     #"Inserted Rounding" = Table.AddColumn(#"Inserted Division", "Round", each Number.Round([Division], 2), type number),
     #"Renamed Columns1" = Table.RenameColumns(#"Inserted Rounding",{{"Round", "Hours (dec)"}}),
     #"Removed Columns" = Table.RemoveColumns(#"Renamed Columns1",{"Division"}),
     #"Inserted Division1" = Table.AddColumn(#"Removed Columns", "Division", each [rate] / 100, type number),
     #"Renamed Columns2" = Table.RenameColumns(#"Inserted Division1",{{"Division", "Rate"}}),
     #"Inserted Multiplication" = Table.AddColumn(#"Renamed Columns2", "Multiplication", each [Rate] * [#"Hours (dec)"], type number),
     #"Renamed Columns3" = Table.RenameColumns(#"Inserted Multiplication",{{"Multiplication", "Amount"}}),
     #"Removed Columns1" = Table.RemoveColumns(#"Renamed Columns3",{"Time (sec)", "amount", "rate"}),
     #"Renamed Columns4" = Table.RenameColumns(#"Removed Columns1",{{"clientName", "Client"}, {"projectName", "Project"}, {"description", "Task"}}),
     #"Reordered Columns" = Table.ReorderColumns(#"Renamed Columns4",{"Client", "Project", "Task", "Hours (dec)", "Rate", "Amount"}),
     #"Grouped Rows" = Table.Group(#"Reordered Columns", {"Client", "Project", "Task"}, {{"Hours (dec)", each List.Sum([#"Hours (dec)"]), type number}, {"Amount", each List.Sum([Amount]), type number}}),
     #"Sorted Rows" = Table.Sort(#"Grouped Rows",{{"Client", Order.Ascending}, {"Project", Order.Ascending}, {"Task", Order.Ascending}}),
     #"Changed Type" = Table.TransformColumnTypes(#"Sorted Rows",{{"Amount", Currency.Type}})
     #"Changed Type"

So, in this code, you’ll need to furnish the following two identifiers:

  • YourWorkspaceIDGoesHere – This is found embedded in the URL of your Clockify session. So, for example, you signin to Clockify and go to the Setting screen for a given workspace. Your URL looks something like this: https://clockify.me/workspaces/*******************/settings#settings. This part: ******************* is your Workspace ID. Copy it from the URL and replace the text YourWorkspaceIDGoesHere in the code.
  • YourClockifyAPIKeyGoesHere – This is found in your Clockify user profile that you can get to by hovering over your picture in the upper right hand of the screen, clicking on Profile and then scrolling down to the API section near the bottom:
How to find your Clockify API key

Copy this text and replace the text YourClockifyAPIKeyGoesHere in the code.

  1. When you’ve modified your code, click on Done and you should see Power Query processing to grab your Clockify data and process it. Hopefully you’ll have the results you want/need.

    You can modify the massaging of the data to do all sorts of things that suit your situation. In the Query Settings in the right-hand pane of Power Query, you’ll see all the steps of the query broken down. You can remove them one-by-one from the bottom up to see what the results are and to apply what you want/need.
  2. I would suggest that you rename your query to match that of your Workspace name to avoid confusion:
  1. When you have what you want/need from your query, you can put it in your Excel sheet. So with that query selected in Power Query, click on the Close and Load button to load that query into your Excel sheet:

You should then see it in your Excel sheet (it may take a bit of time to actually load):

  1. This should load into a new worksheet (it does for me). Just for convention’s sake, I’d rename this worksheet to match the Clockify workspace name.

Once you have this working correctly, you can duplicate existing queries in Power Query, making it fairly easy to add new Clockify Workspaces to this process. Hopefully this has been helpful for you.

Replacing Caldera Forms with Forminator

Forminator gets my vote to replace Caldera Forms


Towards the end of March, we found out that Caldera Forms would be discountinued at the end of 2021.  Caldera was not the most popular WordPress forms plugin out there, but it sure should have been.  As far as what you got for free, I don’t think anything else really compared.  Ninja Forms was close and it was Ninja forms that bought them and told us that they’d be keeping Caldera around.  It’s not that I think that they were insincere but from my vantage point, it sure sounded naive.  The market for WordPress forms plugins is already pretty glutted so I couldn’t see how there was enough distinction between the two products to make them both viable – and apparently they see it now too.

So I went out searching for what plugin I could use to replace the Caldera Forms that I’d already created on different sites.   I was wanting to find another free alternative, but I’d used things like conditional processing and multi-page/step forms and lots of fields, etc.  Ninja Forms did come close but where it didn’t work, the price for paid options jumps significantly (typically around $50/per add-on/per site).

I looked at: Ninja Forms, Fluent Forms, Formidable Forms, WP Forms, Cognito, Form Maker, Smart Forms and Forminator.

I did not look at Gravity Forms because they don’t have a free option.  I did not look at Contact Form 7 because they don’t have a drag ‘n drop builder (and the 3rd party plugins that purport to offer it don’t create a great WYSIWYG experience (IMHO).  Contact Form 7 + extra free plugins does create a compelling option in some respects – but not really when you consider…

Forminator (by WPMU DEV)

I’d say that I still prefer Caldera but Forminator is a very compelling choice.   If you’re needing to switch from Caldera and free functionality is important to you, I’d say look no further than Forminator.  There simply is not (at least in my searching) anything that comes close to what Forminator offers for free.  The other options were all limited in some way or another.  In fact, WPMU DEV makes their money on a subscription model to their services and plugins.  Their hook is a freemium model on some of their plugins but some of their plugins are completely free.  Forminator is one of those.  That means that they are offering for free a plugin that has premium features.  It also means that their business model is not limited to selling their forms plugin (like Caldera was).  It’s more diversified.  While WPMU DEV has retired plugins before, Forminator has a roadmap, so one could hope that that speaks of longevity.

I use Divi on all the sites where I used Caldera and I used the Divi Supreme Lite plugin on them because it has a Caldera Forms module.   This made styling the form so much easier. I’ve already written Divi Supreme, lobbying to have them replace their Caldera styling module with one for Forminator.  I’ve already replaced one Caldera Form that had been styled using the Divi Supreme module and it was annoying to have to use other methods of styling and not have as much flexibility.  So the conversion is not all smooth sailing but I still feel that this is the right choice given the options available.

Baby steps with Gutenberg

(thank you Wikipedia)

So I’ve just installed WordPress 5.0 on my multi-site installation.  No errors, no apparent problems so far.  I can soon delete my installation backup. I have a bit of time today so I thought I’d dip my toe into the wild new world of Gutenberg.

I’ve been used to, and enjoy working with a couple of different visual post/page builders (Vantage, Divi).  I’m also at home with the classic editor in both visual and text (HTML) modes.  But Gutenberg is the future, so I might as well get used to it – and maybe even embrace its workflow and strong points.

In general, I’m not a fan of interfaces that “hide” functionality to “unclutter” things or to make them more “elegant”. I’d prefer knowing that all my tools are there and I can see them.  Often I don’t trust an interface that “looks simple”.  My experience is that most interfaces that “look simple” are simple and even simplistic. It’s not always true and I truly appreciate an interface that is not intimidating to the neophyte but packs all the functionality that I need in ways that are easy to discover and access.  I have the impression that I (and other “functionality freaks”) are under-served by most interface designers.  It seems like a gap between designers and power users – an unfortunate gap.

First “bug” – As I’m typing this off the top of my head (you noticed?), I’m pausing to reflect.  While I pause, the auto-save functionality kicks in and moves my cursor to the beginning of my paragraph!  (Edit: fixed – see final thoughts below) This is exceedingly annoying.  I hope it’s not a feature.  At any rate, if I were a big-time content creator and ever stopped to pause and reflect on my work, I’d be seriously up in arms about this one.

That being said, I’m generally enjoying the experience in Gutenberg so far. I also want to try and move with the Gutenberg intent as opposed to simply bringing my understanding of another way of doing things to this experience and opposing change.  I want to push against the Luddite tendencies of my upper-middle-age!

Final thoughts:

  • The annoying “cursor jump” is seriously annoying
    • Edit 2019-01-19 – The annoying cursor jump was a function of a plugin conflict. I found some GitHub posts that mentioned different plugins that were the source of this behavior. In my case it was the Pods plugin. I wasn’t using it and when I disabled it, the problem went away. Here’s the thread: https://github.com/WordPress/gutenberg/issues/12942#issuecomment-455704147
  • The Gutenberg beard game is strong and enviable!

RegEx to remove chords from ChordPro files

Hey, quick post here to show you what I had to learn the hard way.

Problem: someone sends you a song in ChordPro format (or other formats that basically use ChordPro notation, like from OnSong or SongBook, etc.)  It has all the chords in it but you also or you only need the lyrics (without chords!)

Removing them can be tedious.

Solution: If your editor supports Regular Expressions (regex) for search and replace, you can do the following:

Search string:


Replace string:



  • I only tested this with Notepad++
  • The syntax for the replace string might vary between editors.  This is for Notepad++, where each numbered place-holder in the replace string corresponds with one of the (.*) groupings
  • This removes one chord per line.  This is not a real problem.  If you do a “replace all” you replace one chord in all the lines and clicking that button several times will have done the trick fairly quickly.

Multiple files: While not tested, Notepad++’s “Find in Files” tab on the search/replace dialog should do the trick or equally the “Replace in all opened files” button on the Replace tab of the search/replace dialog.

Install Midnight Commander on any? hosting account

The opportunity – your hosting account offers you shell access! 😀

The problem – they don’t have Midnight Commander installed! 😥

The background (skip to the solution!)

Ok for some of you, none of this is a problem.  You don’t have shell access on your shared hosting account – most don’t.  For others, you have shell access and Midnight Commander is installed already – great!  For other, you live and breathe for the Linux command line and your intimate knowledge of command syntax and Linux “innards” means you can create a symphony with your keyboard.

I, however, am not a Linux “heavy” and my shared hosting account with O2switch (which I think is a REAL deal, given what you get and the price you pay) provides shell access but no Midnight Commander.  I have done some Linux server management in a mixed platform environment and appreciate what Linux brings to the table but I’m a Windows guy and a visual person.  Consequently, when I see that I have shell access, I’m glad to have the ability to do certain things that simple ftp access doesn’t give me.  On the other hand, given ONLY a command line, my productivity plummets.  Don’t get me wrong, I appreciate what can be done with a command line.  I once worked on a mini computer where the only access was the command line for commands, navigating and editing.  I loved it – but I was young and that was my job.  I could afford to learn on the job and really get good and fast.  Now I’ve got too many fish to fry to learn another environment when I’m not in it all the time.  So for those of us who live MOSTLY in a non-Linux environment, a visual environment helps a LOT.

The problem (when the sys admins won’t install Midnight Commander for you) is that Midnight Commander doesn’t have a set of pre-compiled binaries sitting around for you to run.  It depends heavily on system libraries and thus is typically dynamically linked for the distribution where it will run or is compiled from source into the environment where it will run.  By default it installs in directories to which a shared hosting client doesn’t have access.   Even the ONE statically-linked pre-compiled binary which I found on the internet did not work except when running from a directory to which I didn’t have access! 🙄

My issues were mostly in two areas:

  1. Navigation – the basic need for a file manager – the felt need for which things like Norton Commander came into existence!
  2. File Editing – I had access to vim and nano and neither of these are what I’d call “intuitive”.  I’m not calling them “powerless”

I searched high and low and couldn’t find a solution.  I thought I’d try and compile it from source.  The compilers are NOT available to client accounts so I needed to compile elsewhere and then copy the executable binary to my hosting account and see if that would work.  I couldn’t easily figure out what distribution O2switch used for their servers as none of those discovery commands worked.  I finally asked them and they let me know that it was a CentOS derivative. So I installed a CentOS distro in a VM on my Windows machine.  Not that I did everything right but that was one of the hardest distros to work with.  Then I tried to see if I could compile and then static link on a Ubuntu distro in order to have a fully static-linked binary that, theoretically, I could drop in and run. I’d never compiled on a Linux machine so there were things that made sense from days compiling on IBM mainframes but there was a lot that I didn’t get and I was really going around in circles.

I looked for other ncurses-based file managers and/or editors.  I got Ranger to work, but it was WAY different than what I was used to while it helped me navigate a little bit, it still required a knowledge of a set of commands (it has a vi-based interaction) that I simply didn’t have and that were NOT intuitive from my background.  I tried to get the Diakonos editor to work (written in Ruby), but I don’t know Ruby at all and I barely got anything to run and the system-dependencies it had required that I try to make an older version run…blah, blah, blah – just a mess!

So I finally went to the mailing list of the Midnight Commander project to ask the experts.  I found THE resource that I needed in Erdmut Pfeifer on that list.  He gave me the foundation for…

The Solution!

Read the details of my conversation on the mailing list on this thread.  That will give you more background on what I did and especially on the solution that Erdmut was able to give me.  Here is the essence of his answer to me:

You don’t necessarily need to create a statically linked version to get
it to run on a different box. just pack up all required shared libs (use
ldd” to find out which) plus the dynamic loader itself. The dynamic
loader is normally invoked indirectly via the system, but nothing keeps
you from calling it directly, passing it the name of the dynamically
linked binary to run and the directory where the packed-up libs reside –
see “man ld.so” for details (“ld.so” is the generic name of the dynamic
loader, the actual name on today’s 64-bit boxes is typically
ld-linux-x86-64.so.2, which itself is a symlink to ld-<version>.so).
The loader is a statically linked binary, and thus doesn’t need any
libs itself.
As I found myself needing something like this rather frequently, I’ve
put together a little Perl script which automates these steps.

So I got his script (which you can find in the thread on the mailing list) and it worked!  I had to keep tweaking some things to get it just right for my environment, but I got it to the point where I could ssh to my shell session and then type “mc” and I was in an environment that I knew and I could be productive.

Here are the steps I took to make it work in the O2switch environment. YMMV in other environments!  (check the comments below to see where people have gotten this to work).

Also this was back in September 2016 so I’ve forgotten a bit of what I did and some of my notes are not as helpful to me at the moment, but I think they’ll get the persistent folks going in the right direction.

  1. I followed Erdmut’s directions in the thread (so theoretically you don’t have to, but it might be good to review it if you run into problems)
  2. Used mc from CentOS 6.8 package installation (it’s version
  3. Added /usr and /etc parts (oops – I don’t totally remember what this means!  I think it’s creating a /usr and /etc structure in my local “mc” directory, which I named “mymc”, and copying in the files from the package installation that would normally be in the root “/usr” and root “/etc” directory structures in a typical system-wide installation)
  4. Ran strace -o ~/ztrace.txt -e trace=file ./mc and reviewed the file not found output to see what needed to be fixed (Unfortunately, I can’t help you with what needs to be fixed in your environment.  However, I just did this on Bluehost and lo and behold, just running this strace actually brought up Midnight Commander! ~/ztrace.txt WAS created and has lots of No such file or directory lines but it still works.  So perhaps certain functions won’t work.  Hard to say at this point.)
  5. cp ~/mymc/etc/mc/Syntax ~/mymc/etc
  6. cp ~/mymc/etc/mc/mc.lib ~/mymc/etc
  7. cp ~/mymc/etc/mc/mc.menu ~/mymc/etc
  8. cp ~/mymc/usr/share/mc/skins ~/mymc/etc
  9. cp ~/mymc/etc/mc/filehighlight.ini ~/mymc/etc
  10. cp ~/mymc/etc/mc/mc.keymap ~/mymc/etc
  11. cp ~/mymc/usr/share/mc/mc.hint ~/mymc/etc/mc.hint.  (the "." at the end is important!) (this brings the prompt)
  12. cp ~/mymc/usr/share/mc/mc.hlp ~/mymc/etc/mc.hlp. (the "." at the end is important!)
  13. cp ~/mymc/etc/mc/mc.ext ~/mymc/etc
  14. cp ~/mymc/usr/share/mc/syntax ~/mymc/etc
  15. Tried to redo mcedit, mcview symbolic links (this still isn’t working yet – i.e. I don’t have the “mcedit” and “mcview” commands.  The editor and viewer work just fine but I can’t access them via “mcedit” and “mcview”)
  16. Below, I’m including a zipped up version of “~/mymc” which may work right out of the box.  I have it unzipped into the root of my home directory.  I would suggest doing the same.  It is all contained in a folder mymc so you won’t be scattering a zillion files at your root.
  17. Make symbolic link to ~/mymc/mc so that I can run ./mc to start (might not have to do this if you do the following)
  18. Place the following in ~/.bashrc so that I can simply type “mc” to start
    export PATH
  19. had to change putty’s translation settings to ISO-8859-1:1998 (Latin-1, West Europe) to make the lines correct.  This is dependant on what your server’s settings are.  It’ll likely be either UTF-8 or ISO-8859-1:1998 (Latin-1, West Europe)

Here’s a zipped copy of my directory “mymc” with everything you need (normally) to run Midnight Commander as an O2switch client.  You’ll have to do the path work afterward to make it more easily executable. It may work for other environments. Please let me know if it does!

Download here ==> mymc.zip

2020-05-09 Edit: Got this working on Bluehost!

Lenovo Flex 4 1480 Signature Edition ideapad 80VD0007US review

For those who can’t wait:   4.5/5

So far so good – I really like this machine (despite the detailed “cons” section below) and I’ve used it fairly extensively for two months now.  It’s not perfect, but I feel like for the money, it’s an exceptional value.  I got it for $600 at Micro Center online in November of 2016. I had budgeted more, but I was looking for some very specific specifications/features. While I might have gotten a few other things with more money, I’m really quite pleased with this purchase. In fact, I might have had to pay a considerable amount more to get all the different features that I got on this machine.

I’m a freelance IT professional and my activities are extremely varied – programming, web development, server maintenance, network debugging, computer repair, light graphic design, etc.  Additionally, my leisure is often centered around a computer as well – like simple video watching, email writing (in a bilingual French/English context), light digital audio work, light photo/video work, etc.  Until this machine, I’d usually be on our desktop computer, but my wife is increasingly needing that for her creative projects and my old ASUS Eeepc netbook, reluctantly rendering what service it could (still running XP), was screaming for relief.

My basic criteria were:

  • Windows 10 Laptop
  • 12-14 inch screen
  • i5 or better processor
  • 8Gb RAM
  • 256Gb SSD
  • Windows 10


  • Connectivity – All (3) USB 3.0 ports, HDMI, RJ45, SD Card Reader – As an IT technician, I sometimes need to have connectivity to two different networks at a time, and sometimes I need to connect and don’t have WIFI. So having both WIFI and wired connections are important and I don’t want to be carrying around dongles for RJ45 or have some low-bandwidth RJ45 adaptor.
  • Laptop, tent and tablet modes – This is important for me not so much as affording a real tablet experience but because I use this machine for at least two tablet-type tasks:
    1. As a big Kindle to read e-books – it’s actually a little big/heavy for that, but really not too bad.  I can also boost the character size nice and big and with the decent-sized screen, I still get quite a bit of text on one page.
    2. To replace paper chord charts/sheet music – When playing music, I used to lug lots of notebooks around ’cause I can’t remember the chords or words for a song when it’s not in front of me, nor the songs in a playlist when I can’t see all the titles.  I used my netbook for this but since it didn’t do the 360-degree screen swivel, I had to adjust all the music stands and it looked a bit funky.  Now, I can put this machine into tablet mode and fire up Songbook and say goodbye to heavy bags of paper!
  • SSD – I’ve never had an SSD drive in a machine before.  I think I’m in love!  I know it’s not ONLY the SSD drive that affects the speed, but I know that increasingly a spinning hard drive will be THE bottleneck in most situations.
  • Boot time – insanely fast
  • Backlit keyboard – While this wasn’t on my “basic list” of requirements, I can’t tell you how much I love having it. My house is not very “luminous”, shall we say, and, of course, I bought the machine in November.  The days are short, the nights are long and the keyboard is LIT! It will always be on my basic list of requirements from now on.
  • Touchscreen – again, I might have done without this, but with it, and the folding back screen, I can use this as a tablet.  There are other times where having the touchscreen is nice too – a quick pinch to zoom things, for example.
  • Full HD – My netbook was getting annoying with so many popup dialogs going beyond the screen boundaries.  That being said, I’d say that 1920 x 1080 is probably the minimum you’d want in screen resolution.  I could, frankly, use more but with a 14-inch screen, higher resolution would probably mean some really tiny text!
  • Fingerprint reader – again, not on my basic requirements list but it’s my second laptop I’ve owned that has it, and I REALLY love it.  Really speeds things up!  Also, I had created my machine user account as a local account and it had a fairly basic and easy to remember password.  As soon as I signed into the Windows Store for the first time however, my machine login was annoyingly converted to a Windows Live login (where I have a strong, random password).  So the fingerprint reader came in quite handy.
  • Ability to determine whether function keys work primarily as F1-F12 or the various function keys – as an IT-guy, I’m used to using F1-F12 as the primary use of those keys.  Increasingly, you have to jump through hoops to use those keys and the other functions are the primary use of the keys.  I like that Lenovo lets you choose which are the primary keys and which are secondary.
  • Build quality – I had hoped to have a business-class, metal-chassis machine but at this price range, it just wasn’t there.  That being said, I’d say that the build quality on this machine is excellent.  I’ve seen MUCH worse on consumer-grade machines.
  • Fast charge – the battery charge time is rapid.
  • Gen 7 i5 processor – This is a Kaby Lake processor.  I saw that in the CPU benchmarks, the i5 Kaby Lake out-performed i7 processors in other machines I was looking at.  Yeah, some day it’ll be old, but it’s nice to come in on this little performance boost.
  • Microsoft Signature Edition of Windows 10 – no bloatware.  There are a few Lenovo apps, but nothing really useless or redundant.
  • The Fan is quiet – if the CPU gets going, the fan WILL come on, but it’s not annoying at all.
  • Keyboard – for typing, I find the keyboard to be comfortable with good travel and feedback.


  • Right shift key – This has been talked about a LOT.  It truly is an unimaginable engineering error.  Additionally, when you see the margins between the edge of the keyboard and the edge of the machine, they COULD have given it a larger keyboard and arranged things differently.  I’m a QWERTY touch-typer but I type fairly regularly with an AZERTY layout since I live in France and work on computers here.  I tried initially to work with the bizarre placement and size of the right shift key.  It did not work.  So I installed KeyTweak and switched the up arrow and the shift key and now I’m very happy.  YES, it’s not perfect, but it really does work.  If you’re a real writer…well…maybe this will be a deal breaker, but for me, this is an acceptable workaround.  That does not change the fact that it’s an insane user experience error on the part of Lenovo.
  • Power supply – This is the other insane engineering flaw of this machine.  If you’re staying in North America, you can live with (but not easily) the included power supply.  If you’re traveling abroad, just plan now on buying an aftermarket adaptor.  I got this one and it’s great.  I can’t say enough bad about this adaptor.  I tried to leave a scathing review of it (not profane but VERY negative) on the Lenovo Shop site, but they refused to publish it.  Sure it charges fine, but it’s fairly short and ALL the weight and ALL the bulk of the adaptor is literally on the plug.  Even in a typical North American 2-outlet wall plug, putting it on the bottom plug can make it awkward for some plugs on the top.  Simply NOT thought-through on the part of Lenovo.
  • Track pad tap feel – The track pad feels like quality and the sensitivity seems to be quite good, but there is an annoying “feedback” when you tap it – kind of like something is “loose”.  I don’t think anything IS loose – nevertheless, it’s a “give” under your finger that’s pretty annoying.  It’s probably because the left/right click buttons are not separate buttons but integrated into the trackpad itself, meaning that it has to have some “give” in it to function.  I guess I would have preferred separate buttons.
  • Trackpad click noise – I’m very comfortable with using a trackpad.  I don’t have the need for an external mouse, etc.  That being said, there are times when you have to do a physical click.  On this trackpad, you can left-click and double left-click with tapping so you don’t need to physically depress the trackpad left-click zone most of the time.  BUT you DO have to right-click physically and I find that the noise and effort required in an otherwise very smooth and quiet experience to be annoying.  I do type rather heavily (old IBM terminal keyboard habits die hard), however when I make the effort to type more quietly, I still can’t do anything about that right-click noise.  Very annoying.
  • Battery Life – it’s “ok” but nothing to really shout about.  I can and do work a fair amount without the adaptor, but I certainly wouldn’t think of going anywhere without it as I can’t count on THAT much autonomy.
  • Accelerometer slow to react – When I convert to tablet mode (fold the screen back), or change the orientation of the machine from landscape to portrait or vice versa, the wait time for the screen to change is NOTHING like what I’m used to on my phone or my wife’s iPad – not even close.
  • Lenovo Yoga Mode Control – the process that turns off the keyboard when you put the machine in tablet mode is called “Yoga Mode Control” (ymc.exe).  I’ve noticed that when I switch back to regular laptop mode, ymc.exe will often just chew up CPU like nobody’s business.  It’s pretty annoying and I went out and found a utility called ServiceTray that would allow me to easily manage the service if I needed to stop/start it.  People complain about this on the forums.  Not sure that Lenovo has fixed it yet.
    (Edit: I’m not seeing this problem anymore – perhaps fixed)
  • Not a metal chassis – Not a big deal – yet.  We’ll just have to see how it wears over time.
  • Caps-lock notification icon delays typing – the caps lock key (which is also somehow annoyingly positioned in relation to the left-shift key – I can too easily hit the wrong one) displays a pop-up icon that overlays the screen when you use the key.  Depending on the flow of your typing, it can interrupt the flow.  Quite annoying and I don’t know if there is a way to adjust it.
  • Speakers – By this, principally I mean the volume – it isn’t overwhelming, and sometimes that’s not good!  We tried to watch a movie together once that we were streaming from Amazon.  The volume simply wasn’t sufficient to understand the dialog.  We had to switch to sharing a pair of ear buds!  There can be lots of variability in media volume levels and your machine needs to be able to compensate for that with strong volume levels.  This laptop does NOT have that.  Most of the time, in my personal use, I can get by just fine, but that little extra that you need for certain situations is missing. As for the quality of the sound, it’s ok – but I’m certainly not expecting audiophile quality or even booming bass from these tiny speakers.  Since you flip your screen around, your orientation to the speakers changes depending on the mode, so one needs to take that into consideration as well.
  • Combo headphone-mic jack – So far it’s not been a real issue, but I guess I’d have preferred separate jacks for microphone and headphones.  This will take more use to see if there are really any disadvantages to it (or advantages for that matter).