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

Written by Paul Bradley

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.

 1sudo apt update
 2sudo apt upgrade
 3sudo apt install
 4            gnome-terminal
 5            i3
 6            lightdm lightdm-gtk-greeter
 7            lightdm-gtk-greeter-settings
 8            mesa-utils
 9            mesa-utils-extra
10            nano
11            thunar
12            ubuntu-drivers-common
13            wicd
14            xorg
15            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 Amazon Web Services Command Line Interface daily and is one of my essential developer tools.

1sudo apt install
2        awscli
3        build-essential
4        evince
5        git
6        golang-go
7        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.

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

Docker

1sudo apt  install snapd
2sudo 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.

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

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

 1code --install-extension alefragnani.Bookmarks
 2code --install-extension asciidoctor.asciidoctor-vscode
 3code --install-extension golang.go
 4code --install-extension hashicorp.terraform
 5code --install-extension humao.rest-client
 6code --install-extension matthewpi.caddyfile-support
 7code --install-extension smikitky.vscode-dicom
 8code --install-extension streetsidesoftware.code-spell-checker
 9code --install-extension torn4dom4n.latex-support
10code --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.

1sudo apt install firefox

Extensions

Email

For sending and receiving email I use Claws Mail. It’s a minimalist email client which is fast to use. I also use the bogofilter plugin which provides anti-spam capabilities for Claws Mail.

1sudo apt install
2        claws-mail
3        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.

1sudo 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.

1sudo 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:

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

And daily incremental backups use:

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

The backup_excludes.txt file looks like:

 1*.exe
 2*.gz
 3*.mp4
 4*.olm
 5*.tar
 6*.tgz
 7*.wav
 8*.zip
 9*/.git/*
10*/main/*
11.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 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.

1# install prerequisite software
2sudo apt-get install libimobiledevice-dev
3sudo apt-get install ifuse
4
5# make target directory & set permissions
6sudo mkdir /media/iphone
7sudo 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:

1idevicepair pair
2ifuse /media/iphone

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


Updates