Tech Rant

Part of the problem with Tech is:

  • keeping so many things going in your brain at once
  • having to be an expert at so many things
  • the brain-crushing complexity

Example 1

I’m trying to figure out how docker port works. i.e. with this:

docker container run --rm -d --name web -p 8080:80 nginx

is 8080 on the host or the container?

E.g. I can run this: `docker port web`
80/tcp ->

but I’m not clear on the mapping so I check the docs:

which shows you an example:

7890/tcp ->

but does not explain what the line actually means.

Is it container to host or host to container?

Next doc is–p—expose

This explains that 80:8080is host -> container. Which would mean that  the initial mapping I used for nginxabove is mapping 80in the container to 8080on the host. i.e. the other way around.

Let’s test.

1. from the VM

Assuming nginx is outputting to 80 (seems reasonable!) then I’d get something back from 8080 on the host (i.e. in the VM – we haven’t even started with what’s happening on the actual host – i.e. my Mac!) so we should get some output on 8080  from the VM so

curl localhost:8080

(what’s the format for using curl – is it curl localhost:8080 or curl localhost 8080 – check some more docs:  – not unreasonable given that telnet doesn’t use a colon – i.e. you’d do telnet localhost 8080 –

which thankfully gives us some nginx output.

So, going back to:

`docker port web`
80/tcp ->

This is saying:

80 on containermaps to 8080 on host

Annoyingly, the other way round to the format used earlier (i.e. of host to container).

If I do docker ps I get:

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
3fa2a0b86bf6        nginx               "nginx -g 'daemon of…"   2 hours ago         Up 2 hours>80/tcp   web

i.e. `>80/tcp`

which even more annoyingly is the other way around! i.e. host -> container. I guess the way to remember it is that it’s host -> container unless you examine the container itself – e.g. using docker port web.


Some gotchas here:

  • curl localhost 8080 would give connection refused ‘cos curl by default will test on port 80 – given that we’ve got the command wrong it’s testing 80
  • if we’d tested using the container IP address. e.g.

docker container inspect web

gives  “IPAddress”: “”


that gives us nginx output. ‘cos we’re using the container IP address and port.


curl would give:
curl: (7) Failed to connect to port 8080: Connection refused


2. from the container

we need to execfrom the VM into the container. Another doc page:

docker exec -it web /bin/bash


curl localhost:80
bash: curl: command not found

So we need to install curl. More docs (‘cos it’s different on the Mac (I use brew), on Debian (apt) and CentOS (yum) to find out the OS.

cat /etc/os-release
PRETTY_NAME=”Debian GNU/Linux 9 (stretch)”

so we’re using Debian.

It should be apt-get but I get:

apt-get install curl
Reading package lists... Done
Building dependency tree
Reading state information... Done
E: Unable to locate package curl

More docs on how to install on Debian:

says apt install curlwhich gives me the same problem.

More docs – seems like you have to run apt-get update first.

And finally I can verify that, in the container,

curl localhost:80

outputs nginx content.


Note also: I’ve got Ubuntu in the VM and Debian in the container.

VM: my Vagrantfile uses = "ubuntu/bionic64"

Container: `docker container run –rm -d –name web -p 8080:80 nginx` uses a Debian based container.


Finally, I write a blog post so I can remember in future how it all works without having to spend an entire morning figuring it out. I open up WordPress and it’s using Gutenberg which I’ve been struggling with. Trying to disable it is a pain. This doesn’t work:

How to Disable Gutenberg & Return to the Classic WordPress Editor

Groan. I just pasted a link and don’t want the Auto Insert content feature however I can’t even be bothered to try and figure out how to disable the Auto Insert behaviour.

In the end, I posted a test post and went to All Posts and clicked Classic Editor under the post.

Another rant: WordPress’ backtick -> formatted code only occasionally works – very frustrating.


3. To close the loop let’s test from my Mac

As we’re using 8080on the host let’s forward to 8081 on the Mac. Add this to the Vagrantfile: "forwarded_port", guest: 8080, host: 8081

Another rant – trying to reprovision the VM with this gave me a continuous loop of:

 vm1: Warning: Connection reset. Retrying...
vm1: Warning: Remote connection disconnect. Retrying...

I couldn’t be bothered to debug this so just did `vagrant destroy vm1` and started again.

Then some more Waiting. e.g.

==> vm1: Waiting for machine to boot. This may take a few minutes…

Given how fast computers are it seems crazy how much Waiting we have to do for them. E.g. web browsers, phones, etc.

End of that rant.


So, testing from my Mac:


did not work.

I tried


which did work. Wtf?

vagrant port vm1
The forwarded ports for the machine are listed below. Please note that
these values may differ from values configured in the Vagrantfile if the
provider supports automatic port collision detection and resolution.

22 (guest) => 2222 (host)
8080 (guest) => 8081 (host)

I gave up here. Kind of felt that figuring out the problems here was a rabbit hole too far.


Example 2

You’ve got a million more important things to do but you suddenly find in your AWS console that:

Amazon EC2 Instance scheduled for retirement

Groan. This is part of an Elastic cluster.

So, should be a pretty standard process.

  • disable shard allocation
  • stop elasticsearch on that node
  • terminate the instance
  • bring up another instance using terraform
  • reenable shard allocation

but you find unassigned_shards is stuck at x.

So, now you’ve got to become an elasticsearch expert.

E.g. do a

curl -XGET localhost:9200/_cluster/allocation/explain?pretty

and work out why these shards aren’t being assigned.

There goes the rest of my day wading through reams of debugging output and documentation.


Example 3

Finding information is so slow.

E.g. you want to know why Elasticsearch skipped from versions 2.x to versions 5.x.

And whether it’s important.

So you Google. Eventually, hiding amongst the Release Notes is a StackOverflow page ( ) which says go look at this 1 hour 52 minute keynote for the answer.

Unless you’re an elasticsearch specialist, no-one wants to spend this time finding out that info (the answer, btw, is Elasticsearch: why the jump from 2.x to 5.x ).


Example 4

After you’ve spent days of time finding a solution, the answer is complex.

E.g. let say you have to do a Production restore of Elasticsearch.

Can you imagine the dismay you’d get when you have to face the complex snake’s nest contained here:

The preconditions start with:

The restore operation can be performed on a functioning cluster. However, an existing index can be only restored if it’s closed and has the same number of shards as the index in the snapshot.

and continue for page after page.

There is no simple command like: elasticsearch restore data from backup A


Instead you have to restore an index from a snapshot. How do you work out whether a snapshot contains an index?

Easy! Just search dozens of Google results, wade through several hundred pages of Elasticsearch documentation and Stackoverflow questions for different versions of Elasticsearch and Curator. E.g.

Query Google for:

restore index from elasticsearch snapshot –

and you get not much useful.


Funny – in the Stackoverflow the Answerer had the temerity to say:

I’m confused by your question as you have posted snapshot json which tells you exactly which indices are backed up in each snapshot.

I guess that exactly reflects the lack of understanding / empathy in the tech industry that someone can’t even make the leap to understand how to generalise the question to different indices and snapshots.

Example 5

Software that’s ridiculously complex to use.

E.g. take ElasticHQ – simple web GUI.

But how do you list snapshots?

Perhaps their documentation says something.


How about a search?

That returns 2 results. One about an API and another containing the word in code.

For anyone searching, it’s under Indices > Snapshots.

But if you’ve clicked on Indices, beware ‘cos you’re now in an infinite loop waiting for Indices to return.

Example 6: the acres of gibberish problem

Let’s say you’re learning a new technology.

The first thing you usually do is some Hello World system.

So, you try this with a Kubernetes pod. E.g.

apiVersion: v1
kind: Pod
    name: hello-pod
        zone: prod
        version: v1
    - name: hello-ctr
      image: hello-world:latest
      - containerPort: 8080

and do

kubectl create -f pod.yml
pod/hello-pod created

All seems pretty rosy? No!

kubectl get pods
hello-pod 0/1 CrashLoopBackOff 1 11s
kubectl get events
11m 1h 216 hello-pod.155efd191400c60a Pod spec.containers{hello-ctr} Warning BackOff kubelet, minikube Back-off restarting failed container
51s 1h 19 hello-pod.155efd16d4dc9482 Pod spec.containers{hello-ctr} Normal Pulling kubelet, minikube pulling image "hello-world:latest"
42s 2h 29 minikube.155ef9292a10de4f Node Normal NodeHasSufficientDisk kubelet, minikube Node minikube status is now: NodeHasSufficientDisk
42s 2h 29 minikube.155ef9292a10f24f Node Normal NodeHasSufficientMemory kubelet, minikube Node minikube status is now: NodeHasSufficientMemory
42s 2h 29 minikube.155ef9292a10fc29 Node Normal NodeHasNoDiskPressure kubelet, minikube Node minikube status is now: NodeHasNoDiskPressure
42s 42s 1 minikube.155f00647090c760 Node Normal NodeReady kubelet, minikube Node minikube status is now: NodeReady
41s 41s 1 hello-pod.155f00649a394f22 Pod spec.containers{hello-ctr} Warning Failed kubelet, minikube Failed to pull image "hello-world:latest": rpc error: code = Unknown desc = Error response from daemon: Get dial tcp: lookup on read udp> i/o timeout

Now you’re in acres of gibberish territory.

You’ve gone from trying to do a simple Hello World app to having to figure stuff out like:

  • NodeHasSufficientDisk
  • NodeHasNoDiskPressure
  • rpc error: code = Unknown desc = Error response from daemon

It’s the equivalent of learning to drive but, on trying to signal left, finding you have to replace the electrical circuitry of the car to get it working correctly.

This seemed to fix the problem:

kubectl delete pod hello-pod
kubectl create -f pod.yml


kubectl get pods
hello-pod 0/1 Completed 2 31s

Example 7: Complexity


Say I want to find out a version of a piece of software. This should be something even a beginner can do. E.g. it usually goes something like this:

app-name version

Now, however, it’s vastly more complex.

Let’s try helm version.

This is all real output I got.

Day 1:

helm version
Client: &version.Version{SemVer:"v2.11.0", GitCommit:"2e55dbe1fdb5fdb96b75ff144a339489417b146b", GitTreeState:"clean"}
Error: Get dial tcp connect: connection refused

Fortunately I know this is ‘cos I don’t have Kubernetes running on my local system which I can do with:

`minikube start`

Now, however,

helm version
Client: &version.Version{SemVer:"v2.11.0", GitCommit:"2e55dbe1fdb5fdb96b75ff144a339489417b146b", GitTreeState:"clean"}
Error: could not find a ready tiller pod

So, now, when you’re not even at the level of running a hello world app you’re having to debug why you can’t even find out the version of your application!

I could go on with this. E.g. see the post Kubernetes: helm

Kind of frustrating when, at the most basic level, you reach a completely impassable roadblock. E.g.

brew install kubernetes-helm
helm init
helm install stable/mysql

And then you get:

Error: no available release name found
Error: Get dial tcp i/o timeout

which you have to spend a day Google’ing a solution.

E.g. on Stackoverflow you get obscure stuff like:

kubectl create serviceaccount --namespace kube-system tiller
kubectl create clusterrolebinding tiller-cluster-rule --clusterrole=cluster-admin --serviceaccount=kube-system:tiller
kubectl patch deploy --namespace kube-system tiller-deploy -p '{"spec":{"template":{"spec":{"serviceAccount":"tiller"}}}}'
with no explanations why you need it or what it does and that doesn’t work anyway.
Day 3
This was a few days later. When I thought I’d sorted something simple like outputting the version.
helm version
helm version
Client: &version.Version{SemVer:"v2.11.0", GitCommit:"2e55dbe1fdb5fdb96b75ff144a339489417b146b", GitTreeState:"clean"}
Error: Unauthorized

Fortunately, I figured this out in a few minutes. But with less Kubernetes knowledge it could take you several days of effort – it shouldn’t take that long to work out what version of software you’re using.

By the way, this last one turned out to be because my default cluster turned out to be the one in EKS.

Need another example?

Ha ha. I could go on for days.

Let’s say you’ve committed some files using git. Now you realise you committed them on the wrong branch.

OK, if you were using Word or Google Docs, it would be pretty simple.

Select your changes, copy, Cmd Z until you got to the original state, paste.

With git it’s fucking complex.

I dare anyone with less than 3 years experience of git to do something this simple in under an hour.


More examples

offers a dashboard. Great!

Seems to be a single line install. But just before the single line install you read:

IMPORTANT: Read the Access Control guide before performing any further steps. The default Dashboard deployment contains a minimal set of RBAC privileges needed to run.

That sounds ominous. Whilst I assume I don’t need to worry about that as I’m just testing on a local minikube I should read on just in case.

I start scanning through

I get to:

Kubernetes supports few ways of authenticating and authorizing users. You can read about them here and here.

and I’m starting to worry about going down a rabbit hole here. Will I ever get this dashboard installed? Or will I just have to keep reading more and more documentation?

I decide to brave it and go with the single line install:

kubectl apply -f

and get:

The Deployment "kubernetes-dashboard" is invalid: spec.selector: Invalid value: v1.LabelSelector{MatchLabels:map[string]string{"k8s-app":"kubernetes-dashboard"}, MatchExpressions:[]v1.LabelSelectorRequirement(nil)}: field is immutable

which seems pretty obvious. Clearly the Kubernetes authors have spent a lot of time making sure their output error messages are nice, clear and to the point. I’m not sure why they couldn’t have included a few more paragraphs of gibberish just to make things more obscure.

I try the suggested URL anyway


and get:

Error: 'tls: oversized record received with length 20527'
Trying to reach: ''

Again, clearly plenty of time spent creating nice, clear debug output.


What’s the solution?

Ignore all of the detailed advice on the Kubernetes Dashboard github page – i.e.

and, kudos to the Kubernetes documentation team (they outdid themselves here), buried nicely in issue 2898 is the answer:

minikube dashboard

So, translating, what the Kubernetes team mean by:

The Deployment "kubernetes-dashboard" is invalid: spec.selector: Invalid value: v1.LabelSelector{MatchLabels:map[string]string{"k8s-app":"kubernetes-dashboard"}, MatchExpressions:[]v1.LabelSelectorRequirement(nil)}: field is immutable


The dashboard is already running. Access it using <put URL in here>.

Someone needs to work on a Google Translate engine that maps Kubernetes to English.


More examples

I want to run go on the Mac.

$ brew install golang
Updating Homebrew...
==> Auto-updated Homebrew!
Updated 1 tap (homebrew/core).
==> Updated Formulae

Warning: go 1.11.2 is already installed and up-to-date
To reinstall 1.11.2, run `brew reinstall go`
$ go
clang: error: no input files

Example 8: Latency

It shouldn’t take 10 seconds to load up a web page.

Every time you click on a link it’s another 10 seconds. Get to the wrong web page? Click back and go to the next. That’s half a minute.


Or printers.

E.g. I printed out a single page of A4. It took around 2 minutes. So, you end up context switching between what you’re doing and checking the printer. And you’re expecting it to fail.

Example 9: Stuff that doesn’t work

I’ve got 2 digital thermometers. Side by side.

One reads 18.4C, the other 17.5.

They’re probably both wrong. So the temperature could be 16C or 19C. Who knows.


Another example, I’ve got an HP printer. HP defined printers.

Yet, on my Mac, in order to print two documents (each with 2 pages), I’ve had to:

  • restart the printer
  • clear a paper jam
  • struggle to refit the USB cable (there’s only one way to fit it and with it at the back of the printer and the printer in an awkward position it’s tricky to see)
  • struggle to find the printer power button (see above)
  • struggle with the paper tray that wouldn’t fit back quite right
  • clear a second paper jam
  • wait for several minutes for the printer to power back on and re-initialize

Another time I kept getting the Printer Offline message so I tried:

  • restarting the printer
  • restarting the printer again
  • resetting the printer system (which wipes out all of your existing printers without any warning):
  • Then Add a Printer doesn’t show the Printer anywhere
  • Restart my Mac (something I really don’t want to do when I’ve got dozens of windows open with current state) – FWIW, this eventually solved the problem. Hopefully, I can just do this in future instead of spending half an hour reinstalling printers every time I want to print a page of A4
    • Btw, reinstalling the printer then failed saying Can't install the software because it is not currently available from the Software Update server. Solution was to try again a couple of times.
  • then the page printed out incorrectly (which turned out to be a problem with Pages. Printing it out from Preview worked)
  • except the colours were all wrong – the beiges I could see on screen came out as blues


To print out 1 page should not take an hour of fiddling about. Am I the only person in the world that thinks so???

I’ve got another HP printer, an HP DeskJet 2630. I don’t even use this any more ‘cos all it will print out are notices saying it can’t connect to its mothership to tell it the status of its ink cartridges. I find it ironic that that’s all it can print out.


  • uninstall the printer
  • install the printer
  • disconnect USB
  • power off the printer
  • power on the printer
  • connect the USB
  • send job to printer
  • wait
  • and wait
  • and wait
  • hear printer whirring
  • wait
  • check printer status menu
  • check printer dialog on mac
  • wait
  • wait
  • check printer dialog on mac
  • check printer status menu
  • check printer dialog on mac
  • wait
  • wait
  • go have a glass of wine
  • come back in 15 minutes
  • your print job hasn’t printed
  • repeat all the above steps several more times
  • get a 49 Error turn off then turn on
  • turn everything off then on
  • install firmware update ( )
  • repeat all the above


More stuff:

  • my mouse which some idiot has designed so that it power saves every x minutes. So I go to use it and it won’t move. I’m constantly having to remember it. Another layer of complexity that makes things difficult to use

Example 10: Web page insertions

You go to click on a Google result. And suddenly Google (and they’re not the only culprits) inserts something else into the page and you click on something else.

Example 11: Cookies

Accept this

Accept this

Accept this

Accept this

Accept this

Accept this

Accept this


Every single website you go to. Over and over and over again. Every day. Of Every month. Of Every Year.

Can’t there just be a one-time option on some website somewhere for me to donate $10 to a monkey to keep clicking “Accept this” on my behalf?


Example 12: Inconsistencies


kubectl version
Client Version: version.Info{Major:"1", Minor:"12", GitVersion:"v1.12.2", GitCommit:"17c77c7898218073f14c8d573582e8d2313dc740", GitTreeState:"clean", BuildDate:"2018-10-30T21:39:38Z", GoVersion:"go1.11.1", Compiler:"gc", Platform:"darwin/amd64"}
Server Version: version.Info{Major:"1", Minor:"10+", GitVersion:"v1.10.3-eks", GitCommit:"58c199a59046dbf0a13a387d3491a39213be53df", GitTreeState:"clean", BuildDate:"2018-09-21T21:00:04Z", GoVersion:"go1.9.3", Compiler:"gc", Platform:"linux/amd64"}
aws --version
aws-cli/1.16.57 Python/2.7.15 Darwin/17.7.0 botocore/1.12.47

Why can’t all command line tools use the same flags?

Some use double-dash, some don’t.

They can’t even output versions in the same way.


Aside from the fact they upgraded from 2.x to 5.x (see Elasticsearch: why the jump from 2.x to 5.x ) basic stuff like this version is wrong

i.e. curl -XGET 'localhost:9200'


“lucene_version” : “4.6”

Wtf – 4.6 doesn’t even exist!

Or more elasticsearch oddities like:

/usr/bin/curl -s -XGET
No handler found for uri

Example 13: Crap documentation

Over 90% of respondents to a recent GitHub survey said that one of the top problems with open source projects is incomplete or confusing documentation.

Kubernetes up & Running

E.g. page 16 (i.e. the very start – after the Introductory chapter) of Kubernetes up & Running suggests running:

docker build -t kuard-amd64:1 .

which doesn’t work.

Not only doesn’t it work but it’s incorrect (MAINTAINER is deprecated).

On the most basic example in the book, users have to debug why their 4 line piece of code isn’t working. And 2 out of the 4 lines are incorrect.


E.g. let’s say you want to just get a list of AWS Cloud Config Rules. We have:

aws configservice describe-config-rules

which outputs

    "ConfigRules": [
            "ConfigRuleState": "ACTIVE",
            "Description": "Checks whether ACM Certificates in your account are marked for expiration within the specified number of days. Certificates provided by ACM are automatically renewed. ACM does not automatically renew certificates that you import.",
            "ConfigRuleName": "acm-certificate-expiration-check",
            "ConfigRuleArn": "arn:aws:config:eu-west-1:631413792289:config-rule/config-rule-nlk65s",
            "MaximumExecutionFrequency": "TwentyFour_Hours",
            "Source": {
                "Owner": "AWS",
                "SourceIdentifier": "ACM_CERTIFICATE_EXPIRATION_CHECK"
            "InputParameters": "{\"daysToExpiration\":\"14\"}",
            "Scope": {
                "ComplianceResourceTypes": [
            "ConfigRuleId": "config-rule-nlk65s"
        { etc }, 
        { etc }

Starting off with the jq tutorial ( ),  there’s no JSON in the page until we get towards the bottom. And that doesn’t resemble our extract – e.g. ours has:

    "ConfigRules": [

and theirs has:

"parents": [

So, let’s give them the benefit of the doubt and try the Manual ( instead.

Note: if you’re not clear on the exact format of JSON then you might go to a site like hoping to get a simple explanation. I think my favourite section (right at the top of the page on the right) for beginners would be the sidebar which starts off with:



    '{' ws '}'
    '{' members '}'

    member ',' members

and has another 2 pages of gibberish. A perfect example of technical documentation – guaranteed to confuse beginner, intermediate and advanced.



Section 1: jq Manual (development version)

Hmm – not much of use there.

Section 2: Invoking jq

Or here.

Section 3: Basic filters

This starts looking more useful.

Identity Operator

Not clear why you’d want to use the Identity operator but at least it works. E.g.

aws configservice describe-config-rules | jq '.'

Object Identifier-Index

The simplest useful filter is .foo. When given a JSON object (aka dictionary or hash) as input, it produces the value at the key “foo”, or null if there’s none present.

so, given a JSON hash / dictionary looks like this:

{ "key1": "value1", "key2": "value2" }

then we should be able to pull out a key / value pair. EXCEPT we also have these [] items in our JSON. These are JSON arrays / list items –

Looking through the docs we can see:

Array/Object Value Iterator: .[]


To see me eventually get to the bottom of this see:

Using jq


Example 14 – make a simple thing impossible

And a difficult thing not just impossible but also ensure that it completely messes up your system as you struggle to do it.

And believe me, if one thing techies do well is to make simple things way, way beyond difficult.

Here’s an example.

I’d like my menu bar on all screens in Ubuntu 18.04.

On the Mac, you go to Settings > Displays and drag the menu bar to the screen you want it on.

On Ubuntu:

  1. top answer on Google – says use the Multi Monitors Add-On (with a suspicious second line that says something about a Multiple Monitor Panels Extension, which isn’t working properly in 18.04)
  2. so, clicking on the link takes us to a page with a Download menu saying cryptically “Shell version…”. I finally figured out they’re referring to the version of Gnome. More Google’ing points out that it’s in Settings > About
  3. Then a further drop down menu appears with “Extension version…”. I assume I just take the latest version (there will be some developer somewhere shouting out – of course not, you need the version before that – for some cryptic reason)
  4. This downloads. However, there are no further instructions!
  5. Clicking on the extensions home page mentions Installation from git. But not from this download.
  6. I open the Files app but can’t open a dot file (‘cos it’s hidden) – clearly more Google’ing required – some website mentions “Simply press Ctrl H” – simple, of course – maybe slightly simpler would be for a menu item
  7. Looking at the destination where it suggests copying the files I see an existing set of files. Looking at the version in multi-monitors-add-on.pot they seem to be the same – i.e. “POT-Creation-Date: 2015-01-23 22:29+0100\n”
  8. However, I don’t see the option either under Settings > Dock OR Devices > Screen Display

After an hour of trying to get this to work I think it’s probably easier to just stop wasting time about now.


Another example: trying to set up an Epson printer on Ubuntu 18.04.

I should not have to be reading up on Kerberos Authentication to set up my printer. However, the system dialog isn’t working correctly and I’m accessing the printer via CUPS to diagnose the problem. And some parts of the CUPS dashboard are asking for a username / password (which I’ve already entered) but no entry fields are provided.

I should not have to be reading stuff like this to print out a photo:

CUPS allows you to use a Key Distribution Center (KDC) for authentication on your local CUPS server and when printing to a remote authenticated queue. This document describes how to configure CUPS to use Kerberos authentication and provides links to the MIT help pages for configuring Kerberos on your systems and network.


Or jq. You should not have to spend a day figuring out how to parse a JSON file. E.g. see these questions all about outputting a second variable value on the same line (something that should be a trivial task):

Turns out outputting both variables on:

  • subsequent lines is hard
  • the same line is next to impossible


And another example:

Trying to resize a Terminator window on Unity for Ubuntu 16 is tricky. You have to somehow be almost pixel perfect to grab that corner of the window.

So, I tried seeing if there was a simpler / easier way of doing this. I found Alt + Space + r which lets you resize using the cursors. Not quite what I was looking for – I wanted to press a hotkey and then just drag somewhere in the general vicinity of the corner.

However, I then found Unity had somehow hung. The terminal had shrunk to one line (even worse than before) and now I was completely unable to resize it (using either my mouse or the keyboard).

And not only that – none of the other windows would respond. I had a white X for a cursor and was unable to escape out of it using Esc, right click.

The hardware power button still brought up the Power off / Restart icons but I was unable to click them.

Fortunately, Ubuntu crashed shortly after and I was able to log back in again.

A perfect example of a simple change completely wrecking your productivity.

I finally found Alt + middle mouse button + drag which was exactly what I wanted.


Example 15 – Google Photos – view Favourite photos

Here’s another simple example. I’d like to view all the photos that have been favourited in a Shared Album so that I can print them off.

The logical place to start would be Browser > Google Photos > Albums > <name of Shared Album>

However, the album isn’t there. It’s under Sharing (as someone shared it with me).

These cryptic icons aren’t very useful: 300w" sizes="(max-width: 338px) 100vw, 338px" />

After clicking about it it turns out you find Favourites by clicking on the (obvious! <- that’s being sarcastic) Chat icon which shows Activity (how is that related to Chat?!). Fortunately, the latest Activity (!) was the Favourites we’d done.

Clicking on the first Favourite (a tiny icon that’s almost impossible to see the details of the photo) and then clicking Right then takes you to the next photo (not the next Favourite!).

The only way of storing this photo to later print is to add it to a Print album. Now however you’re back in Albums. So, back to Sharing, find the Album, open Chat and navigate to the next photo.

If I try to add this to the recently created Print album, I find the Print album is now 4th in the list. Bizarre why it’s listing 3 other albums above this. Surely it should be in Date order or Alphabetical. It seems to be randomly listing them.



Example 16 – Stuff not working / being broken

  1. the usual 10 minute preamble to any productivity whilst you debug why your mouse / screen aren’t working cos some USB attachment has stopped working with Ubuntu 18. And don’t start me on the Mac or Windows – they’ve got enough problems of their own. Turns out I needed to do a complete Restart (including disconnecting the power cable) before the USB adapter was recognised again. And then, to even blog this post, you have to get past WordPress’ unintuitive UI. I have a long article and want to scroll it but can’t see a scroll bar to the right of the content. The scroll bar for the main content pane is to the right of the other UI panels. And then, to get to the Update button, you have to scroll your Content a few pages (which is bizarre). And then, when you do click Update it scrolls you to the top of your Content.


Leave a Reply

Your email address will not be published. Required fields are marked *