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.
Table of Contents
↑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.
- LaTeX - I use LaTeX to write system documentation.
- ascii doctor - Used to write write corporate documents.
- PHP - for when I need to write PHP code.
- KindleGen - for when I want to compile HTML documents into a Kindle ebook.
- imagemagick - for when I need to convert images between formats.
↑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
- Bookmarks helps with navigating a large code base.
- golang.go provides rich language support for the Go programming language.
- hashicorp.terraform adds editing features for Terraform files such as syntax highlighting, IntelliSense, code navigation.
- humao.rest-client allows you to send HTTP request and view the response in Visual Studio Code directly. Great for API development.
- smikitky.vscode-dicom dumps DICOM tag contents. DICOM is a standard file format for medical images.
- Tyriar.sort-lines sorts lines of code.
↑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
- uBlock Origin - An efficient wide-spectrum content blocker. Easy on the CPU and memory.
- Bitwarden - I pay for a Bitwarden account to manage all my passwords.
- Grammarly - real-time suggestions to help with grammar, clarity, tone, and more. This is another service that I pay for, to help with my writing.
- AWS Extend Switch Roles - in my role as AWS architect, I need to switch quickly between many different AWS accounts. This extension lets me do that.
- Google Lighthouse - as a developer I’m keen on providing users of my software a great experience. Lighthouse is an open-source, automated tool for improving the performance, quality, and correctness of your web apps.
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
- kazam used to record simple one off videos
- ffmpeg used to convert videos between file formats
- handbrake to make backups of DVD’s
- kdenlive to edit videos for production
↑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
- 29.06.2022 Added notes about mounting iPhones.
- 14.05.2022 Added Visual Studio extensions used. Added remote desktop, screen capture, backups & video.