This page contains an overview of expected learning outcomes from all labs. It can be useful if you are searching for a particular topic but do not remember in which lab the topic was covered.

Lab #1

Go to lab page

Conceptual knowledge

  • explain why graphical user interface is not a fixed part of Linux
  • list several differences between various graphical interfaces available in Linux
  • explain in broad terms what is a Linux distribution
  • explain what can be understood under the term of unix family of operating systems
  • list a few types of assets that are typically needed for software projects
  • explain in broad terms what is a versioning tool
  • explain fundamental high-level operations of versioning tools

Practical skills

  • boot your own machine into Linux (either via USB, dual-boot or virtualized)
  • log in to a graphical Linux environment
  • log in to the faculty instance of GitLab
  • create a new project in GitLab
  • upload a new file to GitLab via its web user interface and create a commit from it
  • edit existing files in a GitLab project using its web interface
  • customize a selected graphical environment
  • create a basic GitLab issue in a given project

Lab #2

Go to lab page

Conceptual knowledge

  • list pros and cons of using a command-line interface vs a graphical one
  • explain the difference between a terminal (emulator) and a shell
  • explain what is a path to a file
  • explain difference between a relative and an absolute file path
  • explain what are shell (filename) wildcards
  • explain what are command-line options (switches)
  • explain usefulness of -- delimiter (when using wildcards on specifically named files)

Practical skills

  • start and close (exit) a terminal emulator
  • customize a selected terminal emulator
  • browse through a filesystem via text user interface tools (e.g. mc or ranger)
  • browse through a filesystem using commands ls and cd
  • use basic switches of the ls command such as -l, -h or -a
  • use wildcards to apply commands to specific subsets of filenames
  • run own Python programs from the command line
  • view contents of text files using the cat utility
  • view contents of binary files in hexadecimal using the hexdump utility
  • identify file type by using file utility
  • use (basic operations) of the built-in manual pages
  • use clipboards available in a graphical interface on Linux
  • use tab completion to effectively write file names and paths
  • use irregularly named files

Lab #3

Go to lab page

Conceptual knowledge

  • explain what is a script in a Linux environment
  • explain what is a shebang (hashbang) and how it influences script execution
  • understand the difference when script has or does not have executable bit set
  • explain what is a working directory
  • explain why working directory is private to a running program
  • explain how are parameters (arguments) passed in a script with a shebang
  • explain what is standard input and output
  • explain why standard input or output redirection is not (directly) observable from within the program
  • explain how execution of cat foo.txt and cat <foo.txt differs
  • explain how standard inputs/outputs of several programs can be chained together
  • optional: explain why cd cannot be a normal executable file like /usr/bin/ls

Practical skills

  • create a Linux script with correct shebang
  • set the executable script using the chmod utility
  • access command-line arguments in a Python program
  • redirect standard input and standard output of a program in shell
  • use standard input and output in Python
  • use the pipe | to chain multiple programs together
  • use basic text filtering tools: cut, sort, …
  • use grep -F to filter lines matching provided pattern

Lab #4

Go to lab page

Conceptual knowledge

  • explain what is a Git working copy (clone)
  • explain why there are two output streams: stdout and stderr
  • explain what is program exit code
  • explain differences and typical uses for the main five interfaces of a\ncommand-line program: command-line arguments, stdin, stdout, stderr, and exit code\n
  • optional: explain what is a file descriptor (from the perspective of a userland developer)

Practical skills

  • configure author information in Git
  • setup default editor in a shell (set EDITOR in ~/.bashrc)
  • clone a Git repository over HTTPS in shell
  • review changes in a Git working copy (git status command)
  • create a Git commit from command-line (git add and git commit commands)
  • upload new commits to Git server or download new ones to a working copy\n(assuming single user project, git push and git pull commands)\n
  • view summary information about previous commits using git log
  • optional: customize Git with aliases
  • redirect standard output and standard error output of a program in shell
  • set exit code of a Python script
  • use the special file /dev/null
  • use standard error output in Python
  • optional: customize shell script with aliases
  • optional: store custom shell configuration in .bashrc (or .profile) scripts
  • optional: customize prompt with the PS1 variable

Lab #5

Go to lab page

Conceptual knowledge

  • explain basic principles of network communication (in OS agnostic manner)
  • explain basic principles of asymmetric cryptography
  • explain in detail how asymmetric cryptography (public and private key)\ncan be used to authenticate a user\n
  • explain what is SSH and what functions it offers
  • explain what account types exist on Linux and how they differ (e.g. johndoe, root and nobody)
  • explain how differs execution of programs locally vs over SSH remotely
  • explain difference between using Git over HTTPS vs Git over SSH
  • explain basic access rights in Unix operating systems
  • explain what individual access rights r, w and x mean for normal\nfiles and what for directories\n
  • explain what is a set-uid bit
  • explain what is a process and how it differs from an executable file
  • explain difference of ownership of a file and a running process
  • optional: provide a high-level overview of POSIX ACLs

Practical skills

  • set PS1 variable to distinguish different machines
  • use ssh command to login to a remote machine
  • execute commands on a remote machine using SSH
  • use hostname command
  • transfer files over SSH using cat
  • setup password-less authentication on a remote Linux machine using a private/public key pair
  • setup publickey-based authentication to GitLab
  • use git clone (and pull and push) over SSH
  • view and change basic access permissions of a file
  • use ps to view list of existing processes (including -e, -f and --forest switches)
  • use htop to interactively monitor existing processes
  • optional: configure SSH shortcuts
  • optional: use basic functions of tmux terminal multiplexer

Lab #6

Go to lab page

Conceptual knowledge

  • explain what is an environment variable
  • explain how variable scoping works in shell
  • explain the difference between a normal and exported shell variable
  • explain how $PATH variable is used in shell
  • explain how changing $PATH affects program execution
  • explain how shell expansion and splitting into command-line arguments is performed
  • optional: explain why current directory is usually not part of $PATH variable

Practical skills

  • use Pandoc to convert between various text formats
  • set (assign) and read environment variables
  • compute mathematical expressions directly in shell using $(( )) construct
  • use command substitution ($( ))
  • use composition operands && and || in shell scripts
  • create and use shell functions
  • use subshell to group multiple commands
  • optional: read environment variables in Python
  • optional: create custom templates for Pandoc

Lab #7

Go to lab page

Conceptual knowledge

  • explain main differences between a project fork and repository working copy (clone)
  • explain what is a Git branch
  • explain what is a feature branch
  • explain what is branch merging in Git
  • explain what is a merge (pull) request and when it can be used
  • explain what is a Git remote
  • explain when Git merge conflict can arise and how it can be resolved
  • explain what is usually meant by upstream project (repository)

Practical skills

  • create Git branch locally using git branch
  • push new Git branch to remote server
  • create merge request from a feature branch in GitLab
  • switch between branches (git checkout)
  • merge Git branches locally using git merge
  • fix merge conflicts
  • setup Git remotes
  • optional: use the youtube-dl utility
  • optional: use VLC media player from command-line

Lab #8

Go to lab page

Conceptual knowledge

  • explain what is a linter and style checker
  • explain what kind of issues can be detected by style checkers
  • explain concurrency issues that can occur when using temporary files
  • explain how program exit code is used to drive control flow in shell scripts
  • explain what commands are executed and how is evaluated a shell construct if true; then echo "true"; fi
  • explain what considerations are important when deciding between use of shell vs Python

Practical skills

  • use temporary files securely in shell scripts
  • use control flow in shell scripts (for, while, if, case)
  • use read command
  • use getopt for parsing command line arguments
  • use . and source to load functions from different files
  • use and interpret results of ShellCheck
  • use scp to copy individual files to (or from) a remote machine
  • optional: use rsync to synchronize whole directories

Lab #9

Go to lab page

Conceptual knowledge

  • explain how and why is software distributed in the forms of packages
  • explain what is a regular expression (regex)
  • explain difference between the root account and other accounts
  • explain why doing non-administrative tasks with root account is generally discouraged
  • explain in broad terms how sudo can be used for system administration
  • understand the dangers of using sudo
  • explain what is a service (daemon)
  • explain life cycle and possible states of a service
  • explain what is a program log and how it can be managed
  • explain advantages of using automated functional tests

Practical skills

  • create and use simple regular expressions to filter text with grep
  • perform pattern substitution using sed
  • use getent to retrieve information about user accounts
  • use sudo to elevate privileges of an executed program
  • use a package manager to install or uninstall packages
  • use a package manager to perform a system update
  • use systemctl to start and stop services
  • use systemctl to ensure service is automatically started at machine boot
  • optional: use journalctl to view service logs
  • optional: use useradd to create a new user account
  • execute BATS tests
  • understand basic structure of BATS tests
  • optional: create simple BATS tests

Lab #10

Go to lab page

Conceptual knowledge

  • name several steps that are often required to create distributable software\n(e.g. a package or an installer) from source code and other basic artifacts\n
  • explain why software build should be a reproducible process
  • explain how it is possible to capture a software build
  • explain concepts of languages that are used for capturing steps needed\nfor software build (distribution)\n
  • explain what is a disk image
  • explain why no special tools are required for working with disk images
  • explain difference between normal files, directories, symbolic links,\ndevice files and system-state files (e.g. from /proc filesystem)\n
  • list fundamental top-level directories on a typical Linux installation and describe their function
  • explain in general terms how the directory tree is formed by mounting individual (file) subsystems
  • explain why Linux maintains separation of archiving and compression programs (e.g. tar and gzip)

Practical skills

  • build make-based project with default settings
  • create Makefile that drives build of a simple project
  • use wildcard rules in Makefile
  • optional: use variables in a Makefile
  • optional: use basic GNU extensions to simplify complex Makefiles
  • mount disks using the mount command (both physical disks as well as images)
  • get summary information about disk usage with df command
  • use either tar or atool to work with standard Linux archives
  • optional: use lsblk to view available block (storage) devices

Lab #12

Go to lab page

Conceptual knowledge

  • explain the difference between a normal SSH port forward and a reverse port forward
  • explain what are requirements (library dependencies)
  • explain fundamentals of semantic versioning
  • explain what are pros and cons of installing dependencies system-wide vs\ninstalling them in a sandboxed environment\n
  • provide a high-level overview of a sandbox environment
  • explain pros and cons of specifying transitive requirements vs specification\nof top-level ones only\n
  • explain pros and cons of using exact versions vs minimal requirements

Practical skills

  • use xargs program
  • use find with basic predicates (-name, -type) and actions (-exec, -delete)
  • use SSH port forward to access service available on loopback device
  • use reverse SSH port forward to connect to a machine behind a NAT
  • create a new virtual environment for Python using python3 -m venv
  • activate and deactivate virtual environment
  • install project dependencies in a virtual environment with pip
  • develop program inside a virtual environment (with projects using\nsetup.cfg and pyproject.toml files)\n
  • install Python project from its setup.cfg
  • optional: setup Python project for installation

Lab #13

Go to lab page

Conceptual knowledge

  • explain what is a container
  • compare container with a virtual machine and a process
  • explain in what situations can be leveraged container isolation
  • explain container life-cycle
  • explain why using virtual environments (or other types of sandboxin)\ninside a container is typically not needed\n
  • explain a difference between a running container and a container image

Practical skills

  • start interactive Podman container
  • start service-style Podman container
  • expose container ports
  • mount a volume into a container
  • clean unused containers and images
  • optional: use printing and scanning in Linux

Lab #14

Go to lab page

Conceptual knowledge

  • explain why use of nmap is often prohibited/limited by network administrators
  • explain what is a process signal
  • explain principles of continuous integration
  • explain advantages of using continuous integration
  • explain in broad sense how GitLab CI works

Practical skills

  • use nc for basic operations
  • use pgrep to find specific processes
  • send a signal to a running process
  • use nmap for basic network scanning
  • use ip command to query current network configuration
  • use ping and traceroute as basic tools for debugging networking issues
  • setup GitLab CI for simple projects
  • optional: use NetworkManager to set up static IP addressing
  • optional: fix corrupted file systems using the family of fsck programs
  • optional: use PhotoRec to restore files from a broken file system