Biting the apple: Switching from Apple to Linux/GNU


The decision to move to Linux/GNU had been lurking in my mind for a long-time. However, out of fear of wasting long-hours configuring, customizing and maintaining my system (which eventually did happen) this decision was continuously postponed. There was an attempt to switch to Linux/GNU when I completely wiped out my MacBook 12 inches, but it did not work out. Friends and colleagues who had used Linux/GNU before were also discouraging. Leaving the walled gardens of Apple into the unknown was a risky endeavour that could cut down on productivity and increase vulnerability to cyberattacks.

After 6 years with the MacBook and having tasted the forbidden fruit of programming, it was finally the time to get out of paradise.

The Hardware

The first step in switching to Linux was selecting the hardware. I did not want to compromise on the versatility and simplicity of an Apple hardware. At the same time, I did not want to have additional trouble when installing Ubuntu, so I limited my search to an Ubuntu certified hardware.

The Dell XPS 13 9300 (2020) was the best candidate in the market. The clean, compact lines put it on pair with MacBooksA must-do to achieve a nice, clean look is to remove all the stickers that Dell (and many other manufacturers) insist on sticking to the machine. Dell’s logo on the chassis is enough advertisement for me.. On top of that, the large number of good reviews were an indication that it would not let me down in terms of performance.

closed lid

Preamble

The primary goal was to install Ubuntu without DualBoot. Unless one buys the XPS Developer Machine which is only available in selected markets, it is necessary to purge Windows during the installation procedure.

The installation proceed as following:

  1. Update the firmware: preferably use Dell Update which comes pre-installed in WindowsIt is possible to update the firmware once Ubuntu is installed, and, indeed, this is a good maintainance practice. However, updating the firmware from Windows before getting acquainted with Ubuntu was a less intimadating experience.. Alternatively, update the latest firmware by visiting Dell’s support page. With luck most of the drivers will be up-to-date and the update will be fairly quick.In case one requires to determine the current version of the Bios in Windows system information > system summary > BIOS version/date

  2. Change the SATA setting to AHCI: access the system BIOS (F2 on bootAlternatively, see instructions here on how to boot to Bios from Windows.) and change the SATA settings to AHCI.It seems like one of the main benefits from changing from the IDE to the AHCI protocol is better performance on I/O. Check this video from Techquickie to learn more about the AHCI mode.

  3. Tweak Bios settings: while modifying the Bios, it is also useful to tweak a few other hardware settings. The Dell XPS 9300 comes with a feature whereby it turns on when the lid opens which is quite annoying when cleaning the computer. This option can be toggled off in the Power Management menu. Also, there is an option to lock the Fn keys such that the function keys operate normally without the need to press the Fn key. This is useful when booting the BIOS or GRUB without juggling with multiple keyboard keys.There are many other options in the BIOS which might be interesting from a security perspective which I still need more time exploring.

  4. Prepare the installation USB stick: download the latest Long Term Support (LTS) Ubuntu image, in this case Ubuntu 20.04 LTS. Create a bootable USB image.We can take advantage of the pre-installed Windows operating system to create the image with Rufus, see instructions.

  5. Install Ubuntu: restart the computer with the plugged USB stick, launch the boot loader (F12 on boot) and select the USB device to proceed with installation.

Installation and file system

The Ubuntu installation is guided by an intuitive GUI interface. A good option to avoid bloating your system with unnecessary applications is to choose the minimal installation.

During the installation process there are several disk options. In version 20.04 LTS, Ubuntu introduced a new file system, the Zettabyte File System (ZFS) which, according to Charles Fisher, is the only file system option that is able to protect data (against corruption), is proven to survive in most hostile environments and has a length usage history with well understood strengths and weakness.

Although at this point ZFS is offered as an experimental file system, the native ability to perform snapshots and to ensure integrity made me take this riskI am by far no specialist in file systems (and will probably never be one). My intention was to delineate my decision process for picking ZFS based on the resources available online. Any false conclusions are my own.. ZFS automatically performs snapshots of the system and user home folders, handling them independently. It allows one to recover the working state of the system without sacrificing personal files and vice-versa. Snapshots work like TimeMachine in MacOS and have already saved my day in a couple of occasions when a Linux update was unsuccessful or when I mistakenly removed personal files.

The default ZFS installation in Ubuntu is unencrypted. However, OpenZFS provides instructions to install a native encrypted ZFS by editing configuration files in the Ubuntu installer. The first step involves editing zsys-setup:

            # /usr/share/ubiquity/zsys-setup
# search for "zpool create", around line 216

# add the echo <ZFS-PASSWORD> in the beginning
# change <ZFS-PASSWORD> to your actual password
echo <ZFS-PASSWORD> | zpool create -f \
    -o ashift=12 \
    -O compression=lz4 \
    -O acltype=posixacl \
    -O xattr=sa \
    -O relatime=on \
    -O normalization=formD \
    -O mountpoint=/ \
    -O canmount=off \
    -O dnodesize=auto \
    -O sync=disabled \
    # add the 3 lines which determines encryption options
    -O encryption=aes-256-gcm \
    -O keylocation=prompt \
    -O keyformat=passphrase \
    -O mountpoint=/ -R "${target}" rpool "${partrpool}"

After the Ubuntu installation is completed, the second step consists of encrypting the swap memory as below:

            # swap is encrypted with cryptsetup
sudo apt install --yes cryptsetup curl patch

# the patch basically fix system boot given swap encryption, ensuring things get initialized in the right order
curl https://launchpadlibrarian.net/478315221/2150-fix-systemd-dependency-loops.patch | \
    sed "s|/etc|/lib|;s|\.in$||" | (cd / ; patch -p1)

# note the device, including the partition
swapon -v

# find the by-id name of the disk
ls -l /dev/disk/by-id/

# remove the swap entry from fstab, as we will configure via crypttab
sudo swapoff -a
sudoedit /etc/fstab
echo /dev/mapper/swap none swap defaults 0 0 | sudo tee -a /etc/fstab

# replace DISK-partN as appropriate from above
echo swap /dev/disk/by-id/DISK-partN /dev/urandom \
    swap,cipher=aes-xts-plain64:sha256,size=512 | sudo tee -a /etc/crypttab

Didrocks and Arstechnica provide useful guides to get started with ZFS and the command-line utility zsys. ZFS is a complex file system and it would be impossible to learn it in one go. Useful ZFS operations include:

  1. rewinding the system using ZFS history (accessible during the booting process);

  2. listing snapshots;

                > zsysctl show
    
  3. rolling back the user home folder;

                > sudo zfs rollback -r rpool/USERDATA/<username>@<snapshot>
    

Hardware tweaks

From the myriad of posts online, I was fretting about installing additional hardware drivers to ensure a good user experience. On the other hand, since my laptop was certified to work with Ubuntu, I did not expect to have to make that large number of adjustments. Indeed, after installation everything was operational, but I was quite disappointed with the trackpad experience which was slow and unresponsive.

Fortunately, some significant improvements to the Xorg driver for multitouch trackpads have been implemented by p2rkw/xf86-input-mtrack. Although there is a xf86-input-mtrack driver available via apt, the version in the Debian repository is outdated and not worth the installation. Therefore, I recommend installing this driver from source which was by far one of the most difficult parts of configuring Ubuntu for me. I hope the instructions below ease the process for others.At the time of installation, I was not aware of any alternative Personal Package Archive (ppa) which contained this driver. Nevertheless, installing from source was a worthy exercise.

To install from source, one needs to install the compilation dependencies via apt, namely, mtdev-tools and xorg-dev. Following that, one must download the repository and build the deb package ensuring that pkg-config is pointing to the correct path, /usr/lib/x86_64-linux-gnu/pkgconfigI had Linuxbrew installed on my system, and kept failing to build this driver because my pkg-config path was pointing to Linuxbrew. See further below on what is Linuxbrew and how I use it.. Install the built package with apt to ensure that the package manager is aware of our driver modifications during future system updates.

            > ./configure --prefix=/usr
# the flag avoids signing issues, though make sure you trust the codebase
> dpkg-buildpackage --nosign
# move to the parent directory and install the apt package
> cd ..
> apt-install xserver-xorg-input-mtrack_0.5.0_amd64.deb

Add users who intend to use the trackpad to the input group, sudo usermod -a -G input <username>, in order to enable them to do so. Otherwise, the trackpad will be frozen next time any of these users logs in.

To configure any trackpad attached to the computer add the settings to /usr/share/X11/xorg.conf.d. In Github, it is possible to find my trackpad settings for the Dell XPS 9300 trackpad and for the Apple Magic Trackpad 2. Note that the latter should be used in conjunction with the former, as the Apple Magic Trackpad 2 settings override only a few of the options of the Dell trackpad while using the latter’s settings in any other case. My favorite trackpad settings include 3-finger drag, smooth scrolling and fine-tuned acceleration.

Roles

I usually prefer to have two separate "human" users in my operating system, a normal user without sudo privileges for everyday use and another user with sudo privileges for system administrationNotice that this user, which is only created for convenience, is very much different from the root user which has a very specific role in Linux/GNU.. This avoids unintentionally issuing sudo commands and reduces the surface for malicious attacks.

This task can be easily accomplished. The first step is to create the target admin user. Since all of the information generated by this user should be of disposable nature, we can create its home folder in the /var directory which, among other things, is reserved for service-user home folders. We also add the admin user to the sudo group and the default groups created by Ubuntu during installation. Finally, we ensure that the UID and GID are between 100 and 500 which is a range of ids reserved for system users that, for instance, do not get listed by the GNOME display manager (gdm) in the login screen.

            # creating the superuser
> mkdir /var/<superusername>
> sudo useradd -r -s <path-to-preferred-shell> -d /var/<superusername> -K SYS_UID_MIN=100 -K SYS_UID_MAX=499 -K SYS_GID_MIN=100 -K SYS_GID_MAX=499 <superusername>
> sudo usermod -aG sudo,adm,cdrom,lpadmin,sambashare,dip,plugdev,input,lpadmin,lxd <superusername>

Once these steps are completed we have a superuser, able to execute sudo commands. The second step is to demote everyday users to normal users, that is, to remove their sudo privileges.

            > sudo deluser <username> sudo

Aesthetics, themes and system configuration

A big part of an operating system comes down to configuration and customization which ultimately define the daily experience. This is even more important when talking about Linux distros which are rather unapealling and feel outmoded out of the boxThough there are some exceptions that try to appeal to the general public with a clean interface and well-thought defaults such as ElementaryOS, ZorinOS, Pop!_OS. Ubuntu comes with some reasonable defaults and a decent desktop experience for a beginner Linux/GNU user like myself. Nevertheless it still leaves a lot to be desired compared to MacOS.

Aesthetics

My first reaction was to change the default theme. The default purple-orange colour scheme, the thick dark application borders and the wireframed fossa playing as the desktop background do have their appeal. But for me its of a nostalgic early 2000s cyber-cafe where the computer would automatically log you off after your session had expired. My goal was to make the computer feel more modern and inviting. The Dracula theme makes many good design decisions bringing the UI to the present. In addition to that the support for a wide range of applications (eg. GTK, Alacritty, Neovim, Zsh, etc.) means that it is very easy to achieve a unified and integrated environment with this theme.

The desktop environment in Ubuntu is provided by GNOME which uses GTK to provide the graphical user interface. Therefore, the first application to have its theme modified should be GTK as any modification to GTK will propagate to most of the apps in the desktop environment. Dracula provides all of the instructions to modify GTK, which are reproduced here for convenience:

  1. Download the theme from Github and extract the compressed directory to the themes directory ~/local/share/.themes/dracula

  2. Activate the theme via gnome-tweaks or with the terminal:

            > gsettings set org.gnome.desktop.interface gtk-theme "Dracula"
> gsettings set org.gnome.desktop.wm.preferences theme "Dracula"

In my opinion, the Dracula theme does not match the default orange Ubuntu Yaru icon themes. Therefore, I would also recommend to replace these with Yaru Colors. In my case, I followed the manual installation instructions since I only wanted the purple icon themes from this repo:

  1. Download the theme from Github

  2. Copy the purple icon pack to the icon themes directory ~/.local/share/icons/yaru-purple

  3. Enable the icon theme via gnome-tweaks or with the terminalI did not change the default dock dots color from the red default as I find that the original color provides a better contrast.:

            > gsettings set org.gnome.desktop.interface icon-theme 'yaru-purple'

The third step was to change the title bar size as the GTK default is large and gets on the way wasting valuable screen space. To shrink these edit ~/.config/gtk-3.0/gtk.css as following:based on a Stack Exchange answer

            /* ~/.config/gtk-3.0/gtk.css */
headerbar {
    min-height: 0px;
    padding-left: 2px;
    padding-right: 2px;
}

headerbar entry,
headerbar spinbutton,
headerbar button,
headerbar separator {
    margin: 0px;
    margin-bottom: 0px;
}

/* shrink ssd titlebars */
.default-decoration {
    /* let the entry and button drive the titlebar size */
    min-height: 0;
    padding: 0px;
}

.default-decoration .titlebutton {
    min-height: 0px;
    min-width: 0px;
}

window.ssd headerbar.titlebar {
    padding-top: 3px;
    padding-bottom: 3px;
    padding-right: 6px;
    padding-left: 6px;
    min-height: 0;
}

Following that, I installed the PowerLine fonts, These are pre-patched and adjusted fonts for usage with the Powerline status line plugin which provides an extensible and feature rich status line for tmux and neovim. To manage my new fonts, I also took the chance to install GTK+ FontManager with Snap.

Final adjustments to the theme and aesthetics were per-application basis. Whenever the Dracula theme for a certain application was available I installed it. Otherwise, minor adjustments were made here and there.

neofetch

UIX

The default UIX was not ideal. As reported above, the trackpad was rather slow and unresponsive which deteriorated the user experience. Apart from that, I wanted to emulate some of my favorite MacOS user interaction. Surprisingly, some of the interactions provided by GNOME were far superior than what is available in MacOS.

First, it is useful to install gnome-shell-extensions which provides some useful extensions to the desktop and a useful CLI for managing them. Extensions which I adopted include: desktop icons, Noa11ythis is an external extension that must be manually added to /usr/share/gnome-shell/extensions/ (removes the a11y icon/menu from panel), hide minimizedthis is also an external extension., removable drive menu, screenshot window sizer, Ubuntu app indicators, user themes and window navigator. In addition to that, I also toggled an additional setting using the CLI since this was not accessible via gnome-tweaks:

            > gsettings set org.gnome.shell.extensions.dash-to-dock click-action “minimize”

The second step was to fine-tune the system keyboard shortcuts. These can be accessed in the Settings application. GNOME provides very useful window switching capabilities which are far superior than those in MacOS. I anchored window manager keybindings on the <Super> key providing a streamlined switching experience. Key bindings can also be edited with dconf-editor, my current settings for the window manager dumped from dconf:

            [/]
begin-move=['<Super>m']
begin-resize=['<Super>r']
maximize=@as []
maximize-horizontally=['<Super>h']
minimize=@as []
move-to-workspace-1=@as []
move-to-workspace-down=['<Primary><Super>Right']
move-to-workspace-last=@as []
move-to-workspace-up=['<Primary><Super>Left']
panel-main-menu=@as []
raise-or-lower=['<Primary><Super>Down']
show-desktop=['<Super>d']
switch-input-source=['<Primary>semicolon']
switch-input-source-backward=['<Primary><Shift>semicolon']
switch-to-workspace-down=['<Primary>Right']
switch-to-workspace-up=['<Primary>Left']
toggle-fullscreen=['<Primary><Super>Up']
toggle-maximized=['<Super>Up']
unmaximize=['<Super>Down']

In addition to that, I introduced two special keybindings for rofi and gnome-screenshot

            [custom0]
binding='<Super>space'
command='rofi -combi-modi window,drun -show combi -modi "combi,file-browser,trans:~/.config/rofi/trans" -sidebar-mode'
name='Rofi'

[custom1]
binding='Print'
command='/usr/bin/gnome-screenshot --interactive'
name='Screenshot'

Rofidmenu is an alternative to Rofi which was also considered. However, Rofi’s interface was more user-friendly and allows for themes that integrate well with the rest of the OS. is an invaluable utility wihout which my experience with Ubuntu would be deeply degraded. It is very similar to MacOS Spotlight providing a range of system shortcuts including window switcher, application launcher, file browser and much more. As opposed to Spotlight, Rofi is completely configurable and allows for an arbitrary set of commands to be passed to its search bar allowing for many use cases. With some work one can configure Rofi to one’s liking. I probably just scratched the surface of possibilities, but I am quite happy with my current configuration which emulates Spotlight very closely and is easily accessible with <Super>+<Space>This is a system keyboard shortcut which you can configure as explained above.. In addition to applications, windows and file-browser shortcuts, I managed to add a language translation service using the very compact script provided by soimort/translate-shell. At first, it was tricky to add the translation service to Rofi, but, at least, the application maintainers keep a very useful wiki page with the specs.

rofi demo

A final MacOS feature that I wanted emulated were hot corners. GNOME does not support all the hot corner available in MacOS, but it supports a single hot corner on the top left which for me is enough. This hot corner shows a desktop overview that lets me easily switch between applications, windows and desktops.

Software

In Ubuntu there is a variety of ways of installing software which makes it difficult for a beginner to wrap one’s head around. Down to basics, software must be installed where it can be found. Software that is out of the way is just a concatenation of random bites. That is, strings laying somewhere in your file-system that do not ever get executed by your operating system because it is not aware of those files. In MacOS and Windows the decision of how to, where to and whom should install software is taken out of the way of the average user.

With Linux one must be constantly aware of how to install new programs and libraries in the system. apt can be a great package management system, but the problem is that it only install system packages leaving very little room for experimentation. The DontBreakDebian wiki page is a great resource for learning more about package management and best practices in Debian. Their main advice is installing software from random websites is a bad habit. As a rule of thumb, this is a good advice as one does not want to expose oneself to malicious or buggy software. Software installed from Debian repositories are not only well-maintained from a security perspective, but also works well with the operating system and install properly satisfying some basic user expectation. With that being said, one must keep in mind that reality is usually nasty and unforgiving. Software installation runs against competing developer interests and it is necessary to leave a high-degree of experimentation especially on a machine geared for personal use and development.

Therefore, my approach to software management in Ubuntu is four pronged.

Apt for system critical software

Software provided by apt must be installed by the system administrator requiring superuser privileges. It must be well-integrated with the operating system and must satisfy some reasonable expectations about safety and compatibility. Given that software installed with apt requires superuser privileges, we can assume that during the installation process any part of the system can be exposed to malicious attacks and any information can be leaked out of the system. Preferably, we should use trustworthy sources, avoid growing the source list very large and follow Debian best-practices within reasonable effort.

Below you will find a non-exhaustive list of software installed at the system level. Ubuntu also provides an online catalogue which can be easily browsed for reference.

packagedescription

alacritty

a cross-platform, GPU accelerated terminal emulator, to switch default terminals sudo update-alternatives —config x-terminal-emulator (see system configuration above).

appimagelauncher

utility to easily manage AppImages (see GUI software below).

build-essential

a list of packages that are considered essential for building Debian packages, a must have for developers.

byzanz

GIF screencast creator.

cryptsetup

utility used to conveniently set up disk encryption, in my case it was used for encrypting the swap memory (see installation and file system above).

curl

cli tool and library for transferring data with URLs.

git

version control system.

gnome-screenshot

screenshot application for GNOME.

gnome-shell-extensions

extensions to extend functionality of GNOME shell, contains official GNOME shell extensions (see system configuration above).

gnome-sushi

a MacOS QuickLook replacement for Linux, not as well integrated with the system as the MacOS counterpart but good enough

gnome-tweaks

for easy GNOME customization (see system configuration above).

libtool

contains generic library support script.

patch

takes a patchfile and applies the listed differences to one or more original files.

protonvpn

a secure vpn cli client. Not technically installed with apt, but with the system python3.

rofi

a windows switch emulator that serves as a MacOS Spotlight replacement for Linux (see system configuration above).

trash-cli

support for moving items to the trash bin instead of removing them, not as fast as rm but safer.

tree

cli tool to display an indented directory tree in colour

xf86-input-mtrack

Xorg driver for multitouch trackpads (see hardware tweaks above).

xsel

cli tool to access X clipboard and selection buffers.

zsh

an improved shell experience, to switch default shells chsh -s $(which zsh)

zoom

enterprise video-conferencing. Package downloaded from their website, then installed with apt.

Linuxbrew for user-level and development software

Debian advice about software built from source is that one should build, and run it as a normal user, no sudo. Their installation advice is to modify make files and/or use tools like stow to manage installed packages. It turns out that there is another solution which feels a bit like stow but infinitely better and more attuned to the present reality which is Homebrew. This package manager contains a large number of installation formulas for common open-source software making it very easy to install new software in the user space.

Support for Homebrew on Linux was introduced with Linuxbrew. This is a more recent development, but works like its MacOS cousin because Homebrew is merged into Linuxbrew roughly once per day. Unfortunately, I did face issues installing some software. Even though any formulae available in the core tap should install without any errors, it was not uncommon to experience installation errors after brew updates. For now it still feels, that the primary target audience for brew are MacOS users which means that brew is much more stable in that operating system. Another bummer, is that packages installed with brew are not integrated by design with system packages like X11. That means that some utilities installed with brew do not work well with the system.

With that being said, the beauty of brew is that managing software with it is sustainable and documented (no need to wonder how something was installed in your system). The community provides a lot of support as I was able to fix an outdated formula and contributed back to it with their help. Additionally, I maintain a tap for those formulas that are not officially supported by Homebrew such as pre-compiled binarieslinuxbrew does not support brew-cask at the moment.. Once one gets the hang of it, installing software for experimentation becomes second-nature.

To install linuxbrew one needs to ensure that its dependencies are installed in the system. Second, download it from the internet and place it anywhere in the executable path. Although the maintainers encourage the installation of linuxbrew in a separate home directory (/home/linuxbrew/.linuxbrew), I have concluded that my needs are better suited by placing the .linuxbrew folder in my own home directory (~/.linuxbrew) which highlights that all the software installed with this tool belongs and will be used exclusively by the user who owns my home directory. Finally, to ensure that applications installed with linuxbrew are visible to your desktop environment add the linuxbrew data directory to XDG_DATA_DIRS path by editing ~/.xsessionrcApplications installed with linuxbrew are added to $HOME/.linuxbrew/share/applications. To make terminal applications open with alacritty instead of GNOME terminal, I usually modify the following entries in the *.desktop file, Exec=alacritty -e <bin> %F and Terminal=false. In case, the application does not come with icons, I will manually add them to $HOME/Cellar/<formula>/<version>/share/icons/hicolor/:

            # ~/.xsessionrc
if [ -d $HOME/.linuxbrew ]; then
    export XDG_DATA_DIRS="$XDG_DATA_DIRS:$HOME/.linuxbrew/share"
fi

Second, add linuxbrew to your session $PATH by editing ~/.profile:

            # ~/.profile
if [ -d $HOME/.linuxbrew ]; then
    export PATH=$HOME/.linuxbrew/bin:$HOME/.linuxbrew/sbin:$PATH
fi

Below you will find a non-exhaustive list of software installed at the system level. Homebrew also provides an online catalogue of the core tap which can be easily browsed for reference.

packagedescription

asciidoctor

a step above pure markdown, a fast text processor and publishing toolchain. This post was completely written in asciidoctor.

ipython

an interactive python cli and kernel for jupyter.

jq

lightweight and flexible cli JSON processor.

julia

high-level, high-performance dynamic programming language for scientific computing. This formula is not in the core tap, it belongs to my personal tap.

jupyterlab

next generation jupyter server and browser

neovim

a hyperextensible Vim-based text editor. This post was completely written with neovim.

nmap

network mapper.

node

an asynchronous event-driven JavaScript runtime, designed to build scalable network applications.

openfortivpn

another VPN client, compatible with Fortinet VPNs.

pyenv

simple python version management (see experimental software below).

pygments

Python syntax highlighter, for highlighting source-code in the terminal and in other applications.

rbenv

simple ruby version management (see experimental software below).

texlive

TeX document toolchain.

tldr

an example driven manual pages, showing how commands are used in context.

tmux

a terminal multiplexer emulator.

wget

non-interactive cli for retrieving files using HTTP, HTTPS, FTP and FTPS

Snap, AppImage and Firefox add-ons for self-contained software usually of GUI-nature

Software that falls in this category are analogous to software installed in MacOS from the Apple’s App Store or from Apple Disk Images (.dmg). Ubuntu comes with Snap pre-installed. Snap packages are self-contained and work across a range of Linux distributions. This type of application is analogous to the applications installed via Apple’s App Store. On the other hand, AppImage is analogous to Apple Disk Images and also constitute self-contained applications. A good addition to AppImage is appimagelauncher which provides better desktop integration, discoverability and update management.

While apps installed via AppImage do not need superuser privileges and are only installed in the user’s home directory, snap packages require administrator privileges. However, since Snap install softwares isolated from the operating system there is some degree of security involved.Wikipedia lists a number of criticims against Snapcraft, so I might reconsider using Snap in the future.

packagedescription

Canonical livepatch

apply critical kernel patches without rebooting, ensuring that the system remains secure.

Dbeaver

universal interactive database tool.

Font manager

simple font management application for GTK desktop environments (see system configuration above).

Gimp

open-source graphics editor for image manipulation and image editing.

Inkscape

open-source vector graphics editor used to create vector images.

LibreOffice

open-source office suite.

OnePassword

password manager, Firefox add-on.

Pcloud

Cloud storage for safely storing and sharing documents. It allows me to synchronize files across different devices with different operating systems and client-side encryption. Unfortunately, so far it has created sync conflicts more often that I would have liked which caused me to lose data.

Qgis

open-source geographic information system application that supports viewing, editing and analysing geospatial data.

VLC

open-source multimedia player and framework that plays most multimedia files as well as DVDs, Audio CDs, VCDs, and various streaming protocols.

Zathura

minimalistic and space saving document viewer that mainly focuses on keyboard interaction

Zotero

cross-reference manager and research assistant. It was installed directly from their website, by downloading the compressed directory, placing it in ~/Applications and linking it to the desktop environment ln -s $HOME/Applications/Zotero/zotero.desktop $HOME/.local/share/applications/zotero.desktop. The following add-ons were added to Zotero: ZoteroBetterBibtex, ZoteroQuickLookIt was necessary to add a small hack to to make it work with gnome-sushi which consists of adding a bash script, ~/.local/bin/gloobus-preview, to trick the add-on to think gloobus-preview is installed. and ZotFile.

~/.local/bin, pyenv, rbenv (and similar tools) for development, self-developed and highly-experimental software

~/.local/bin hosts unprivileged software that is developed or audited by myself on a highly experimental and ad-hoc fashion. In general, there is no expectation that software in this path will work or be fully functional, but I still keep this path in my executable path for development purposes. On the other hand, tools like pyenv and rbenv serve to manage language specific environments and make executables available when required while working on specific projects. For instance, pyenv is lightweight enough to allow me to have different working versions of python installed in my path. It even allows me to install conda-based python whenever working on a remote server such that I have complete control of my python environment without the need for sudo privileges.

Conclusions

Given some reasonable programming experience, switching to Ubuntu is not as intimidating as it might seem. Rather, it is an illuminating experience that thought me a lot about GNU/Linux, package management and system administration. In addition to that, it provides the user more control over the complete experience. With Ubuntu and certainly with other barer Linux-distros, one needs to own their choices. In many cases, there is a great deal of uncertainty given the high-levels of complexities of the operating system and one needs to make compromises when aiming at multiple objectives. In other cases and out of practicality, one just trusts a random tutorial on-line. Of course, precautions are taken, but it is necessary to be humble. Ultimately, this contributes to make oneself a better programmer, because programming is not only about writing code but is also about knowing the system, deployment strategies and configuration. Ralph Ammer shares some thoughtful insights about the rising complexity of technologies we use arguing that we need to know things better if we want to be better. There is inherent risk to leave all our choices to experts.

There are many on-line guides about how to get started with Linux/GNU and Ubuntu. This article is by no means an authoritative or a final prescription on how to get this done. Rather, this article should be taken as a contribution to this universe of tutorials. I have only provided a series of first impressions and advices on how I got started with Ubuntu. I encourage you to choose for yourself what works best. Ubuntu out-of-the box is already good enough, but just do not limit yourself as the possibilities are vast.