Ubuntu 16.04 LTS – debugging Wifi connections


Ubuntu 16.04 LTS could not connect to my Wifi network on either of 2 separate Dell laptops (the newer laptops have terrible keyboard layouts by the way. The one I’m using has shoe-horned a number pad to the right of the main keyboard. So there are 2 enter buttons. The Enter button on the right of the normal keyboard is tiny! There are also 2 sets of mouse buttons – one for the IBM style middle of the keyboard nipple and one for the trackpad. Crazy frankenstein monster.)


My Mac was fine connecting to the network.

Another wasted evening weekend due to Linux’s crappy Wifi networking.


ifconfig does not show gateway info.

Instead you need to do:

ip route | grep default


Here’s an example of the sort of advice people are getting to try and fix it:

Please do:
sudo apt-get purge bcmwl-kernel-source
Wifi should work again.
echo "options rt2800pci nohwcrypt=y" | sudo tee /etc/modprobe.d/rt2800pci.conf
sudo modprobe -rfv rt2800pci
sudo modprobe -v rt2800pci
Set your network manager settings to match the screenshots and the disconnects should stop and probably have a faster connection.

What a shit-show!


Dell’s advice?


Use `nm-tool` – a tool now deprecated and no longer supplied with Ubuntu.



`nmcli c` (more on this later)

lshw -c network

are the replacements.

Also useful:




is awesome. E.g.

nmcli device wifi list

will show you the Bars, Signal strength and Security.

And put an asterisk next to the connection you’re connected to.


nmcli networking connectivity

is not much use. It shows: `full` even if you can’t connect to the internet.


`nmcli monitor`

shows connection progress.

However it reports `connected` even if you can’t connect to the internet.





Install virtualbox on Ubuntu with UEFI Secure boot




 ┌────────────────────────────────────────────────────────────┤ Configuring Secure Boot ├────────────────────────────────────────────────────────────┐  
 │                                                                                                                                                   │  
 │ Your system has UEFI Secure Boot enabled.                                                                                                         │  
 │                                                                                                                                                   │  
 │ UEFI Secure Boot is not compatible with the use of third-party drivers.                                                                           │  
 │                                                                                                                                                   │  
 │ The system will assist you in toggling UEFI Secure Boot. To ensure that this change is being made by you as an authorized user, and not by an     │  
 │ attacker, you must choose a password now and then use the same password after reboot to confirm the change.                                       │  
 │                                                                                                                                                   │  
 │ If you choose to proceed but do not confirm the password upon reboot, Ubuntu will still be able to boot on your system but the Secure Boot state  │  
 │ will not be changed.                                                                                                                              │  
 │                                                                                                                                                   │  
 │ If Secure Boot remains enabled on your system, your system may still boot but any hardware that requires third-party drivers to work correctly    │  
 │ may not be usable.                                                                                                                                │  



Setting up virtualbox (5.1.38-dfsg-0ubuntu1.16.04.2) …
vboxweb.service is a disabled or a static unit, not starting it.
Job for virtualbox.service failed because the control process exited with error code. See “systemctl status virtualbox.service” and “journalctl -xe” for details.
invoke-rc.d: initscript virtualbox, action “restart” failed.
● virtualbox.service – LSB: VirtualBox Linux kernel module
Loaded: loaded (/etc/init.d/virtualbox; bad; vendor preset: enabled)
Active: failed (Result: exit-code) since Tue 2019-01-29 15:51:32 GMT; 2ms ago
Docs: man:systemd-sysv-generator(8)
Process: 10816 ExecStart=/etc/init.d/virtualbox start (code=exited, status=1/FAILURE)

Jan 29 15:51:32 w-dell systemd[1]: Starting LSB: VirtualBox Linux kernel module…
Jan 29 15:51:32 w-dell virtualbox[10816]: * Loading VirtualBox kernel modules…
Jan 29 15:51:32 w-dell virtualbox[10816]: * modprobe vboxdrv failed. Please use ‘dmesg’ to find out why
Jan 29 15:51:32 w-dell virtualbox[10816]: …fail!
Jan 29 15:51:32 w-dell systemd[1]: virtualbox.service: Control process exited, code=exited status=1
Jan 29 15:51:32 w-dell systemd[1]: Failed to start LSB: VirtualBox Linux kernel module.
Jan 29 15:51:32 w-dell systemd[1]: virtualbox.service: Unit entered failed state.
Jan 29 15:51:32 w-dell systemd[1]: virtualbox.service: Failed with result ‘exit-code’.
Setting up virtualbox-qt (5.1.38-dfsg-0ubuntu1.16.04.2) …
Processing triggers for libc-bin (2.23-0ubuntu10) …
Processing triggers for shim-signed (1.33.1~16.04.3+15+1533136590.3beb971-0ubuntu1) …
Processing triggers for systemd (229-4ubuntu21.15) …
Processing triggers for ureadahead (0.100.0-19) …
W: Operation was interrupted before it could finish

Natural Scrolling for Ubuntu 16.04 LTS

The touchpad can be automatically set up via Settings > Touchpad > Natural Scrolling.

However, plugging in a USB mouse is more difficult.

Enable system-wide inverse/reverse/natural scrolling on Ubuntu

In case it disappears:

1. Get your mouse device id by running the following in a terminal, you have to choose the right one:

xinput list

Take that number you got (just the number after “id=”) and replace “{device id}” with that number in the following command:

xinput list-props {device id} | grep "Scrolling Distance"

In my case:

xinput list-props 6 | grep "Scrolling Distance"

This will output something like below, remember that “Scrolling Distance” is case-sensitive. If nothing is outputted, you’ve chosen a wrong device id, go back to step 1 and choose another one:

Evdev Scrolling Distance (270): 1, 1, 1

So 270 is your property number, 1, 1, 1 is your scrolling distance, remember this to use later.

It is case sensitive unless you use -i in the grep command. Write down the numbers you find in the output from that command (in my case it was the number 1, shown three times and separated by commas). You will use the negative values of the numbers you get in your output. Also, make sure to write down the property number (it will be in parentheses in the output; in my case, it was (270) in Ubuntu and (273) in Fedora).

Note: If you get no output containing the property “Scrolling Distance” this method will not work for you and you will need to stop here and skip to an alternate way.

2. Create a natural scrolling config file by running the following command in your open terminal:

sudo touch /usr/share/X11/xorg.conf.d/20-natural-scrolling.conf

3. Now, config the natural scrolling profile by running the following command (you can use your favorite text editor instead of nano but I use nano):

sudo nano /usr/share/X11/xorg.conf.d/20-natural-scrolling.conf

In the file you have opened in your preferred text editor, paste the following (but be sure to change the numbers to the same comma-separated numbers you got from step 3; in my case, the number was 1 so in order to make the scroll inverse, I will change 1 to -1):

Section "InputClass"
        Identifier "Natural Scrolling"
        MatchIsPointer "on"
        MatchDevicePath "/dev/input/event*"
        Option "VertScrollDelta" "-1"
        Option "HorizScrollDelta" "-1"
        Option "DialDelta" "-1"

Save the file (Ctrl+O) and exit (Ctrl+X) the text editor. No need for a reboot. Just issue the following command (substituting the property number and the negatives of the numbers you got in the third step, and the device id you got from the second step):

xinput set-prop {device id} {property number} -1 -1 -1

In my case:

xinput set-prop 6 270 -1 -1 -1

Python: raise KeyError(key) from None


#!/usr/bin/env python3
import os
testing = os.environ['testing']

will generate:

Traceback (most recent call last):
  File "./my.py", line 3, in <module>
    testing = os.environ['testing']
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/os.py", line 669, in __getitem__
    raise KeyError(key) from None
KeyError: 'testing'

if the environment variable does not exist.


Instead use:

testing = os.environ.get('testing', 'False')

which lets you set a default.


aws_autoscaling_group – diffs didn’t match during apply. This is a bug with Terraform

happens when you have code like this:

resource "aws_autoscaling_group" "my_asg" {
  name                 = "my_asg"
  launch_configuration = "${aws_launch_configuration.my_launch_config.name}"
  min_size             = 1
  max_size             = 1
  availability_zones = "${var.availability_zones}"

  vpc_zone_identifier = ["${aws_subnet.public-subnet.id}"]

Seems you can’t mix availability_zones and vpc_zone_identifier.


CIDR to IPv4 converter

Handy converter: https://www.ipaddressguide.com/cidr

E.g. for the CIDR to IP Range using a CIDR Range of

means 64 IP addresses – the first being 0 and the last 33.


You can calculate this simply by adding up how many you need to get to 32 – i.e. 6.

Then 2^6 = 64.

So, the first would be and the last would be


Terraform: Error creating launch configuration: AlreadyExists: Launch Configuration by this name already exists

If you’re creating an ASG using an AWS Launch Configuration, you cannot use a name for the Launch Configuration.

The solution? Simply omit name from your launch configuration.



Launch Configurations cannot be updated after creation with the Amazon Web Service API.



Install multiple versions of Python


Ignore the top link on Google which takes you a process of using pyenv. It’s not until you’ve spent several hours painstakingly following the instructions that you find out it’s for some shell I’ve never used called Fish.

Just do:

  1. brew install python2
  2. brew install python3
  3. then to use Python 2, use python2 and for Python 3, use python3


i.e. DON’T DO:

  1. use pyenv
  2. make sure brew is up to date: brew update && brew upgrade pyenv
  3. pyenv install 3.7.2
  4. pyenv install 2.7.14
  5. Set the global version with pyenv global 3.7.2
  6. Set local versions (e.g. for legacy projects) with pyenv local 2.7.14



  • latest version of Python: https://www.python.org/downloads/
  • Blog post on pyenv: https://weknowinc.com/blog/running-multiple-python-versions-mac-osx



ERROR: The Python zlib extension was not compiled. Missing the zlib?

brew install readline xz

did not work for me.

This worked though:

CFLAGS="-I$(xcrun --show-sdk-path)/usr/include" pyenv install -v 2.7.14








Let’s say you want to find out the version of some software. It’s a fucking mess. The options tend to be:

<software name> -v

<software name> --version

<software name> -V

<software name> version

<software name> -version


Unfortunately they all vary. E.g.

Python understands --version and -V.

Whereas Ansible only takes --version.

ssh only understands -V whereas PHP understands -v and --version.

Finally, Java stands by itself with the odd -version.

And I still haven’t figured out how you get ls to tell you its version on the Mac: https://unix.stackexchange.com/questions/415415/option-to-output-version


Here’s what uses what: 


  • PHP


  • Ansible
  • awk
  • PHP
  • Python 2.7 and 3.x
  • Terraform
  • zsh


  • Python 2.7 and 3.x
  • ssh


  • kubectl
  • Terraform


  • Java