Paul Bradley • Solutions Architect & Software Developer


Published: • Updated:

Ubuntu Unleashed - My minimalist Ubuntu software development machine set-up.

A detailed write up explaining the tools and software I use on my main Ubuntu development machine.

Photo of a penguin looking at camera

Table of Contents
  1. Introduction
  2. Minimalist Install
  3. Developer Tools
  4. Code Editor and Extensions
  5. Web Browser
  6. Email
  7. Remote Desktop
  8. Screen Capture
  9. Video
  10. Backups
  11. Mounting iPhone storage

 Introduction

I switched to using Ubuntu Linux full-time as my main development machine in Feb 2020. Before that I had been using a mixture of Windows and OSX. Right before the switch I was using OSX on an ageing Mac Mini, and it was gradually getting slower and slower. Especially Docker, which would hang the computer for many minutes causing the fan to work overtime. The machine became useless.

I was going to switch to using a laptop that only had 4GB of ram, so I needed a operating system that would perform well with modest hardware. I choose Ubuntu 20.04, being an LTS (Long Term Support) release, as it would give me security updates till April 2030.

This article covers the minimalist set-up I use and the software tools I use within my daily job as a software developer.

 Minimalist Install

For the base install I used the Ubuntu 20.04 Server edition with no additional software components installed. I then install the tools I need to do my job. After updating and upgrading the base install, then I install xserver and the i3 tiling window manager. i3 is a very minimalist desktop targeted at advanced users and developers. I like the virtual desktops that i3 supports; I always have my web browser on desktop 1 and my code editor on desktop 2, and it’s very easy to switch between the two.

Beside the windowing system, I also install Thunar as my file manager and Gnome Terminal as my window onto the terminal. I also install nano as a basic text editor for editing configuration files. I just fined nano much easier to use than vim form the command-line.

sudo apt update
sudo apt upgrade
sudo apt install
            gnome-terminal
            i3
            lightdm lightdm-gtk-greeter
            lightdm-gtk-greeter-settings
            mesa-utils
            mesa-utils-extra
            nano
            thunar
            ubuntu-drivers-common
            wicd
            xorg
            xserver-xorg

 Developer Tools

I use makefiles all the time, so I install the build-essential meta package along with Git and my programming language of choice Go. I also install Evince an open source document viewer and xdg-open so that I can open files in their preferred application from the command-line.

As an AWS cloud architect I use the aws.amazon.com/cli/">Amazon Web Services Command Line Interface daily and is one of my essential developer tools.

sudo apt install
        awscli
        build-essential
        evince
        git
        golang-go
        xdg-utils

Programmer Fonts

I use the Inconsolata font as my primary font within my code editor. Before we can use it, we need to install it and refresh the fonts cache.

sudo apt install fonts-inconsolata -y
fc -cache -fv

Docker

sudo apt  install snapd
sudo snap install docker

Beside using Docker to build my own projects; I also use several Docker images in my day to day work.

 Code Editor and Extensions

While I sometimes use nano to edit text files from the terminal, my main go to code editor is Visual Studio Code. I’ve listed the extensions I install which compliment and enhance an already excellent code editor.

To install Visual Studio Code I first add the dependencies needed to install the software. I then add Microsoft’s repository key to the apt key store before adding the repository URL. Finally, we can install the software using apt install.

sudo apt install software-properties-common apt-transport-https wget
wget -q https://packages.microsoft.com/keys/microsoft.asc -O- | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://packages.microsoft.com/repos/vscode stable main"
sudo apt install code

On a clean install, I then use these commands to install the extensions I need.

code --install-extension alefragnani.Bookmarks
code --install-extension asciidoctor.asciidoctor-vscode
code --install-extension golang.go
code --install-extension hashicorp.terraform
code --install-extension humao.rest-client
code --install-extension matthewpi.caddyfile-support
code --install-extension smikitky.vscode-dicom
code --install-extension streetsidesoftware.code-spell-checker
code --install-extension torn4dom4n.latex-support
code --install-extension Tyriar.sort-lines

 Web Browser

For my main browser I use Firefox. It just performs much better than Chrome does on my modest laptop. I’ve also listed the extensions that I use.

sudo apt install firefox

Extensions

 Email

For sending and receiving email I use aws-mail.org/">Claws Mail. It’s a minimalist email client which is fast to use. I also use the aws-mail.org/plugin.php?plugin=bogofilter">bogofilter plugin which provides anti-spam capabilities for Claws Mail.

sudo apt install
        claws-mail
        claws-mail-bogofilter

 Remote Desktop

I mainly deal with Linux servers, accessing them via SSH in the terminal. However, we do have a couple of Windows servers and to access these I use remmina. Remmina is a remote desktop client for POSIX-based computer operating systems. It supports the Remote Desktop Protocol, VNC, NX, XDMCP, SPICE, X2Go.

sudo apt install remmina

 Screen Capture

As part of documenting the software I develop I need to include screen shots of the software. To do this I use flameshot a powerful, yet simple to use open-source screenshot app. Flameshot has commands you can use in the terminal without launching the GUI via a command line interface.

sudo apt install flameshot

 Video

 Backups

I don’t use anything fancy for backups. I use tar to create full backups and incremental backups and then upload the tar file to AWS S3 for off-site storage. I use a text file called backup_excludes.txt which lists the files not to include in the backup.

A full monthly backup uses:

ff = documents-full-2022-05.tgz
tar -cvz --file=$(ff) --exclude-from=backup_excludes.txt ./*
aws s3 cp $(ff) s3://bucket --storage-class STANDARD_IA

And daily incremental backups use:

pf = documents-part-2022-05-01.tgz
tar cvz --file=$(pf) --exclude-from=backup_excludes.txt --newer=2022-05-01 ./*
aws s3 cp $(pf) s3://bucket --storage-class STANDARD_IA

The backup_excludes.txt file looks like:

*.exe
*.gz
*.mp4
*.olm
*.tar
*.tgz
*.wav
*.zip
*/.git/*
*/main/*
.terraform/*

 Mounting iPhone storage

My work phone is an iPhone. Occasionally, I need to mount to the phone as a media device so that I can transfer the images off the phone onto my development machine. Sometimes I also need to copy documents off my development machine onto the iPhone.

To do this, we need to install libimobiledevice which is a cross-platform library written in C to communicate with iOS devices natively. We also need to install ifuse">ifuse which is a fuse filesystem implementation allowing access to the contents of iOS devices.

We also need to make a directory as the target mount point for the device. Once the directory is created we then need to set the permissions on the folder to allowing writing to the device.

# install prerequisite software
sudo apt-get install libimobiledevice-dev
sudo apt-get install ifuse

# make target directory & set permissions
sudo mkdir /media/iphone
sudo chmod 777 /media/iphone

With prerequisite software installed and the directory created, you can plug in you iPhone and select trust computer when prompted on your iPhone. Then from the Ubuntu terminal window you can pair the device and mount it against the target directory like:

idevicepair pair
ifuse /media/iphone

The device will then appear in your file manager of choice.


Updates