How to install and Get Started with Ubuntu Desktop 18.04 LTS



Ubuntu is a distribution (or distros in short) of "GNU-Linux", just like RedHat, Fedora, SUSE, and Debian. In other words, it is a packaging of "Linux Kernel + GNU System Programs and Utilities".

Ubuntu is open-source and free ("free" as in "free speech", not as in "free beer"). Ubuntu is sponsored by Mark Shuttleworth, a south African entrepreneur who made his fortune in IT, via a company called Canonical Inc. The term "ubuntu" means "humanity towards others" in southern African language.

Ubuntu runs the GNOME desktop manager. It includes the OpenOffice suite, Firefox Web browser, Mozilla Thunderbird, Pidgin IM client, and a collection of tools and games. It uses Advanced Packaging Tool (APT) - Debian's high-level package management system - for managing the software on the system.

The first Ubuntu version was released in October 2004. Since then, there are two releases per year, in April (YY-04) and October (YY-10), e.g., 14.04, 14.10. Some version are marked as LTS (Long Term Support), which will be supported over the next 5 years, e.g., 14.04 LTS. LTS is recommended.

Ubuntu has many flavors: Ubuntu Desktop, Ubuntu Server, Ubuntu Cloud, Ubuntu Netbook, Ubuntu Core, Kubuntu, EdUbuntu, Xubuntu, and others.

Installing Ubuntu Desktop for Programmers/Developers

Ubuntu "Desktop" vs. Ubuntu "Server"

Ubuntu has many flavors, notably Ubuntu Desktop and Ubuntu Server. Ubuntu Desktop and Ubuntu Server are almost identical, except that the Ubuntu Server does not come with the Windowing system, i.e., no GUI applications. For programmers/developers, install the Ubuntu Desktop first; and then install the server packages (such as LAMP). For production, use the Ubuntu Server without the Windowing system.

Installing Ubuntu Desktop alongside an Operating System

There are various ways to install Ubuntu alongside an existing Operating Systems (such as Windows, Mac OS):

  1. Via a virtualization software such as VirtualBox or VMWare.
  2. Dual-boot (or multi-boot), with each OS running in its own disk partition.
Installing Ubuntu Desktop via VirtualBox or VMWare


Dual-Boot Windows and Ubuntu

The installation procedure changes over the Windows/Ubuntu releases. Follow the instructions in the Ubuntu download site, and google if you encounter problems.

The following procedure was tested on Windows 10 with Ubuntu Desktop 20.04 LTS in May 2020.

  1. Assume that you have an operational Windows OS.
  2. BACKUP!!!
  3. Download the latest Ubuntu Desktop LTS (Long Term Support) from (e.g., ubuntu-20.04-desktop-amd64.iso 2.5GB).
  4. Read the latest installation guides available in the same download page.
  5. Create a bootable USB stick (BIOS/UEFI compatible) using Rufus (a free and open source USB stick writing tool):
    1. Download the latest Rufus from (rufus-3.10.exe).
    2. Insert a free USB stick (at least 4GB) ⇒ Run Rufus
      • Under "Drive Properties":
        • In "Device" ⇒ Select the USB stick
        • In "Boot Selection" ⇒ choose "FreeDOS" for bootable
        • In "Partition Scheme" ⇒ MBR (default)
        • In "Target System" ⇒ BIOS (or UEFI-CSM) (default)
      • Under "Format Options":
        • In "Volume Label": enter "Ubuntu 20_04 LTS"
        • In "File System" ⇒ FAT32 (default)
        • In "Cluster size" ⇒ 4096 bytes (default)
      • Click on the word "SELECT" and select the Ubuntu disk image downloaded in the previous step (e.g., ubuntu-20.04-desktop-amd64.iso).
      • Push "Start" button.
  6. Free disk space to install Ubuntu:
    1. Right-click Start button ⇒ Command Prompt (Admin) to start the CMD shell ⇒ Enter "diskmgmt.msc" to run the Disk Management utility.
    2. Select a drive with free space (e.g., C:) ⇒ Right-click ⇒ Shrink Volume ⇒ Enter the amount to shrink (at least 20GB or 20000MB, more if you can afford e.g., 64GB or 65536MB) ⇒ Shrink ⇒ Reboot
  7. Disable Windows "Fast Boot": Control Panel ⇒ System and Security ⇒ Power Options ⇒ Choose "what the power buttons do" ⇒ Change settings that are currently unavailable ⇒ Uncheck "Turn on fast startup" ⇒ Save changes ⇒ Restart
  8. Change the boot order in your BIOS/UEFI setup to enable booting from USB: Power-On ⇒ Hit a hotkey to enter BIOS/UEFI Setup (ESC, F12, F10 or F2 depending on your computer) ⇒ Look for "Boot order" and check/change the settings.
  9. Now you are ready to install Ubuntu from the bootable USB stick. Read "Install Ubuntu" @
  10. Boot from the Bootable USB stick:
    1. In Boot menu ⇒ Using "tab" key to choose "Install Ubuntu"
    2. In "Keyboard Layout" ⇒ Choose your preferences.
    3. In "Wireless" ⇒ Connect to your wifi network.
    4. In "Updates and other software" ⇒ Use the defaults
    5. In "Installation Type" ⇒ choose "Something else" (so that you can customize your disk partition for Ubuntu).
    6. I installed Ubuntu in one single partition (without the swap partition as I have 16GB of RAM, also without a separate "home" partition).
      Select "free space" ⇒ Hit "+" button.
      In "Create Partition" menu, Set:
      • Size = all free space (default)
      • Type for the new partition = Primary (default)
      • Location for the new partition = Beginning (default)
      • Use as = EXT4 journaling file system (default)
      • Mount point = choose "/" (for root)
      Push "Install Now" button.
    7. Choose your region.
    8. Pick up a username and password for your administrator (superuser or sudo) account.
      • Your name = same as username (lowercase letters, digits, without space or special characters; root is already used)
      • Your computer name = your chosen computer name (e.g., myUbuntu)
    9. Remove USB stick and reboot.

Post Installation - Updating Software

Run the Software Update
// Update (Re-synchronize) your software list (or Package Index Files).
// This does not run any actual update.  
$ sudo apt update
// or "sudo apt-get update"
// Run actual upgrade
$ sudo apt upgrade
// or "sudo apt-get upgrade"

Alternatively, you can run "Ubuntu Software" ⇒ "Updates".

Disable the Guest Session Account in Login Screen (for Ubuntu 16.04)

LightDM keeps its configuration files in /etc/lightdm/lightdm.conf.d. To disable guest session account, create a configuration file called "50-no-guest.conf" with these lines:


You could use these commands:

sudo gedit /etc/lightdm/lightdm.conf.d/50-no-guest.conf
// Enter the above lines

Errors that I have encountered

Error: Windows 10 does not show up in the GRUB Boot menu after installing Ubuntu

Boot into Ubuntu. Start a terminal and issue these commands:

sudo update-grub
sudo grub-install /dev/[Windows Boot partition e.g., sda1]

The first command could fix the problem. The second command is used to manually add Windows partition into the GRUB boot menu.

How to disable default OS in GRUB boot menu

GRUB maintains its configuration in /etc/default/grub.

$ sudo gedit /etc/default/grub
// GRUB_TIMEOUT="10" specifies the default timeout.
// Set to -1 will make GRUB wait indefinitely.
$ sudo update-grub
Error: Time resets to UTC after boot

In "/etc/default/rcS":

# assume that the BIOS clock is set to UTC time (recommended)

Getting Started with Ubuntu

Read the Documentation available at

"Unity" Desktop

Ubuntu uses the "Unity" desktop, which is designed "to minimize distractions, give you more room to work, and help you get things done". I highlight some of the key features of Unity desktop here:

  • Launcher: On the left of the screen for you to launch commonly-used applications (similar to Windows' taskbar and Mac's dock). Apps that aren't currently running have translucent icon squares. When you start an app, the icon square pulses. When an app is running, the icon square becomes opaque. Small white triangles to the left of the icon square indicates the number of windows opened. Two triangles means that two windows opened. Three triangles means three or more windows. A small white triangle to the right of the icon square indicates the current app.
  • Dash: The top icon in the launcher (painted with the Ubuntu logo) for finding programs and files. It can also be started using the "super" key (or "Windows" key). The Dash is designed to make it easier to find, open, and use apps, files, music, and more. The various lenses (applications, files, etc.) at the bottom allow you to focus the search on a particular resource.
  • Panel: The bar on top of the screen is called the panel. When you move the mouse pointer over it, it shows the App Menus for the current application on its left. The panel also houses the Status Indicators on its right.
  • Status Indicators: comprising mail, battery, bluetooth, network, sound, clock, and system menus.
  • Overlay scrollbars: The scroll bars appear as thin orange strips at the right and bottom edge of the window to conserve space. You can move the mouse pointer over it to reveal the "Thumb Slider". You can click the top half of the thumb slider to scroll one page up; or click the bottom half to scroll one page down. You can drag the thumb slider to position the page.
  • HUD (Heads Up Display): HUD is a search-based alternative to traditional menus. It can be activated via the "alt" key. Instead of clicking and selecting from the menus, you can type the search phrase (such as "replace") to locate the menu item.
  • Workspaces: Ubuntu provides four workspace, by default. You can group your applications in different workspaces; and use the "Workspace Switcher" to switch between workspaces.

Using Terminal - MUST READ Before You Start Programming

Programmers use "Terminal" to issue commands, instead of the graphical user interface - which is meant for common users.

You MUST have knowledge on the File system and using the Terminal. Read "Programmer's Survival Guide for Macs and Ubuntu".

Applications and Utilities

LibreOffice: The default Ubuntu's productivity suite, which is a variant of OpenOffice (currently owned by Apache). It includes:

  • Writer: word processor, similar to Microsoft Word.
  • Calc: spreadsheet, similar to Microsoft Excel.
  • Writer: word processor, similar to Microsoft Word.
  • Impresss: Presentation program, similar to Microsoft Powerpoint.
  • Math: Math formula editor.
  • Base: Database application, similar to Microsoft Access.
  • Draw: Graphics application for creating images.
  • Dia: Technical diagram drawing editor, similar to Microsoft Visio.
  • Planner: Project management application, similar to Microsoft Project.

GEdit Text Editor: The GNU gedit is the default text editor in Ubuntu. [TODO] more.

Screenshot: Press PrintScreen key to capture the entire screen; alt+PrintScreen key to capture the current window. The images are captured in PNG. Alternatively, use the dash to search for "Screenshot". You can set the area of screenshot.

PDF Documents: Evince is the default PDF reader (you can also install the Acrobat Reader). To edit PDF document, you can install an extension called PDF Import to LibreOffice, or use programs such as PDF Editor (pdfedit).

PDF Printer: You can install CUPS PDF printer via:

$ sudo apt install cups-pdf

The default "printing location" is at ~/PDF. You can configure the printer setting via "System Setting" ⇒ Printers.

APT for Managing Software

Ubuntu adopts Debian's Advanced Packaging Tool (APT) for software package management of ".deb" package. Other Linux distros, such as Red Hat, uses RPM Package Manager.

APT can properly handle the dependencies. It automatically finds and downloads all the dependencies of the packages to be installed. It can also resume installation after an interruption.

APT Tools

There are a few sets of toots that can be used to interface with Debian's Advanced Packaging Tool (APT):

  1. apt-get/apt-cache: the older tool.
  2. apt: The newer tool (since Ubuntu 14.04) combines the most commonly used commands from apt-get and apt-cache. It is meant to be pleasant for end users.
  3. aptitude: supports both GUI and command-line.
  4. dpkg: The dpkg (Debian Package Manager) is the low level tool for installing, removing and providing information about '.deb' packages.

Read the manual pages via "man apt-get", "man apt-cache", "man apt" and "man dpkg".

apt vs. apt-get/apt-cache

The newer apt tool, which combines some of the most widely used features from apt-get/apt-cache, leaving aside obscure and seldom used features, is recommended. It can also manage "apt.conf" file. The following table compares the apt and apt-get/apt-cache commands

Task apt apt-get/apt-cache Function
Maintenance apt update
apt upgrade
apt full-upgrade
apt autoremove
apt-get update
apt-get upgrade
apt-get dist-upgrade
apt-get autoremove
Refresh repository index
Upgrade within the same release
Full upgrade to the latest release
Remove unwanted packages
Install/Remove Packages apt install <package>
apt remove <package>
apt purge <package>
apt-get install <package>
apt-get remove <package>
apt-get purge <package>
Install a package
Remove a package
Remove a package with configuration
Query apt search
apt show
apt list
apt-cache search
apt-cache show
Search for a program
Show package details
List packages with criteria (installed, upgradable, etc.)
  apt edit-source - Edit source lists

Upgrading (Maintaining) System

To perform software upgrade for your system:

  1. Refresh the software repositories index:
    $ sudo apt update
    // or
    // $ sudo apt-get update
    The update option resynchronizes your package index files from their sources. The list of available sources are fetched from /etc/apt/sources.list and /etc/apt/sources.list.d/. This command does not actually install any upgrades.
    Take note that 'sudo' is needed for most of the apt commands for writing to the system files and directories.
  2. Upgrade your software:
    // Upgrade within the same release
    $ sudo apt upgrade
    // or
    // $ sudo apt-get upgrade
    // Upgrade to the latest release
    $ sudo apt full-upgrade
    // or (for Ubuntu)
    // $ do-release-upgrade
    // or
    // $ sudo apt-get dist-upgrade
    The apt upgrade installs newer versions of installed packages, but does not remove or add packages or upgrade to the new release. It will not work if the newer version requires addition or removal of packages. On the other hand, the apt full-upgrade may remove or add packages to resolve dependencies, and install the new release.
    The apt upgrade is designed to install security and simple package upgrade. Use apt upgrade for your production system during normal maintenance!
  3. You can remove the unwanted packages via:
    $ sudo apt autoremove
    // or
    // $ sudo apt-get autoremove

Installing/Removing Packages

When you type a command to execute an application, such as "mysql" or "g++", which is NOT installed in the system, Ubuntu is smart enough to suggest packages that contain such command. For example,

$ ttt
The program 'ttt' is currently not installed. You can install it by typing:
sudo apt install ttt

Note: Starting from Ubuntu 16.04, Ubuntu has switched its prompting message to apt from apt-get.

Installing a Package: apt install

To install new software, use "apt install".

// Syntax:
$ sudo apt install <package>  // 'sudo' needed
// or
// $ sudo apt-get install <package>
// Example: Installing MySQL
$ sudo apt install mysql-server

It lists all the dependencies. It also lists the recommended packages, and suggested packages (less important than recommended packages). It will install the dependencies automatically. But you need to explicitly install the recommended and suggested packages.

Reinstalling a Package

To reinstall a package:

// Syntax:
$ sudo apt install --reinstall <package>
// or
// $ sudo apt-get install --reinstall <package>
Removing a Package: apt remove/purge

You can use "apt remove" or "apt purge" to remove installed package. Beware that all the packages that rely on this package will also be removed, as they are no longer valid. For example,

// Syntax:
$ sudo apt remove <package>
// or
// $ sudo apt-get remove <package>

$ sudo apt purge <package>          // Also purge the configuration files in "/etc"
$ sudo apt remove --purge <package> // Same as above
// or
// $ sudo apt-get purge <package>

APT Configuration Files

APT's configuration is stored in /etc/apt.

  • /etc/apt/sources.list and /etc/apt/sources.list.d/: locations of software repositories to fetch packages. You can also configure via the GUI "Software Sources".
  • /etc/apt/apt.conf: APT configuration file.

APT stores temporary files in /var/cache/apt and /var/lib/apt. You can use command "apt clean" or "apt-get clean" to clean the cached .deb files.

Checking the Status of the Installed Packages

There are several ways to list information of installed packages:

  1. Use high-level apt tool (recommended), e.g.,
    $ apt list --installed
       // List ALL installed packages, one per line
    $ apt list --installed <package-name-pattern>
       // List all installed packages matching the pattern
    $ apt show <package-name-pattern>
       // Show details of packages matching the pattern
    $ apt search <regex>
       // Show all available packages whose names or descriptions matches the regex
  2. Use the apt-cache, e.g.,
    $ apt-cache show <package-name-pattern>
       // Show details for matching packages
    $ apt-cache search <regex> --names-only
       // Show all available packages whose name matches the regex, one per line
    $ apt-cache search <regex>
       // Show all available packages whose names or descriptions matches the regex
  3. Use low-level dpkg (Debian Package Manager) command with option:
    • --get-selections: List all installed packages
    • --list (or -l) <package-name-pattern>: List packages matching given pattern
    • --status (or -s) <package-name>: Report status of specified package
    • --listfiles (or -L) <package-name>: List files installed to your system from package-name
    • --search (or -S) <filename-search-pattern>: Search for filenames from all installed packages
    For example:
    $ dpkg --get-selections
       // List ALL installed packages, one per line
    $ dpkg --get-selections | grep apache*
       // List installed packages matching the pattern
    $ dpkg --list
       // List ALL installed packages, one per line. More columns that --get-selections
    $ dpkg --list | grep apache*
       // List installed packages matching the pattern
    $ dpkg --list apache*
       // List installed/available packages matching the pattern
    $ dpkg --status apache2
       // Show status of a particular package
    $ dpkg --filenames apache2
       // List all files for a particular package
    $ dpkg --search apache*
       // List all matched files

How to Install JDK on Ubuntu

Read "How to Install JDK on Ubuntu".

How to Install Eclipse on Ubuntu

Read "How to Install Eclipse for Ubuntu".

Tips and Tricks on using Eclipse

Read "Eclipse How-To".

How to Install NetBeans on Ubuntu

Read "How to Install NetBeans on Ubuntu".

How to Install LAMP (Linux-Apache-MySQL-PHP) Server on Ubuntu

How to Install Apache 2.4 on Ubuntu 20.04LTS

Step 1: Install Apache 2.4

Open a new Terminal and issue these commands:

$ sudo apt update
$ sudo apt install apache2
The following NEW packages will be installed:
  apache2 apache2-bin apache2-data apache2-utils libapr1 libaprutil1
  libaprutil1-dbd-sqlite3 libaprutil1-ldap liblua5.1-0
Step 2: Verify Installation
// Show all package related to apache
$ dpkg --get-selections | grep apache
apache2         install
apache2-bin     install
apache2-data    install
apache2-utils   install
// Show details of apache2 package
$ dpkg --status apache2
Version: 2.4.18-2ubuntu3.1

// List the files of apache2 package
$ dpkg --listfiles apache2

$ which apache2
$ whereis apache2
apache2: /usr/sbin/apache2 /etc/apache2 /usr/lib/apache2 /usr/share/apache2 /usr/share/man/man8/apache2.8.gz
$ man apache2

As shown in the above output, the Apache 2 server program "apache2" (called "httpd" in Apache 1) is installed in /usr/sbin (System Software Binaries).

Step 3: Configure Apache 2.4

Apache 2.4 keeps its configuration files in /etc/apache2 directory, which includes:

  • apache2.conf: The main configuration file, which includes ports.conf, mods-enabled/*.load, mods-enabled/*.conf, conf-enabled/*.conf, and sites-enabled/*.conf.
  • ports.conf: Defines the server's listening TCP port numbers. The default configuration defines port 80 for HTTP and port 443 for HTTPS.
  • sites-available/*.conf and sites-enabled/*.conf: for managing application web sites. All *.conf in sites-enabled are included in apache2.conf.
    To create a new site, you should create a configuration in sites-available; and use helper utility a2ensite to make a symlink to the sites-enabled (instead of duplicating the file). Similarly, use helper utility a2dissite to remove a site from sites-enabled (which removes the symlink).
    The "000-default.conf" provided (called "default.conf" in Apache 2.2), which is enabled by default, defines a virtual host:
    • Listening at port 80 (enabled in "port.conf").
    • DocumentRoot at "/var/www/html" (or "/var/www" in Apache 2.2).
  • mods-available/*.load|*.conf and mods-enabled/*.load|*.conf: for manage modules. Use helper utilities a2enmod or a2dismod to enable or disable a module via symlinking.
  • conf-available/*.conf and conf-enabled/*.conf: for additional configuration (such as phpMyAdmin). Use helper utilities a2enconf or a2disconf to enable or disable a configuration via symlinking.
  • envvars: defines the environment variables used by Apache 2, such as
    • APACHE_RUN_USER: www-data
    • APACHE_RUN_GROUP: www-data
    • APACHE_RUN_DIR: /var/run/apache2
    • APACHE_LOG_DIR: /var/log/apache2
    A special user www-data is used to run the apache server. This user www-data should have "r" permission to all the files in the public www directory and "rx" permission to its subdirectories. It should also have "rx" permission to all the parent-directories leading to the public www directory.
  • magic: defines the MIME types.
Step 4: Start/Shutdown Apache Server

Apache is installed as a service called "apache2" (configured at "/etc/init.d/apache2"). The Apache server is started automatically after the installation.

You can restart/stop/start and check the status of Apache via:

// service <service-name> start|stop|restart|reload|status
$ sudo service apache2 stop
$ sudo service apache2 start
$ sudo service apache2 restart
   // Stop and start the service
$ sudo service apache2 reload
   // Reload the configuration file without shutdown and restarting
$ sudo service apache2 status
   // Show the status of the service

// OR (same as above - run the script directly)
// /etc/init.d/<service-name> start|stop|restart|reload
$ sudo /etc/init.d/apache2 stop
$ sudo /etc/init.d/apache2 start
$ sudo /etc/init.d/apache2 restart
$ sudo /etc/init.d/apache2 reload
$ sudo /etc/init.d/apache2 status

// OR (same as above - use systemctl utility)
systemctl start|stop|restart|reload|status <service-name>
$ sudo systemctl stop apache2
$ sudo systemctl start apache2
$ sudo systemctl restart apache2
$ sudo systemctl reload apache2
$ sudo systemctl status apache2

Alternatively, you can use utility apache2ctl to start/stop the Apache server:

$ apache2ctl help
Usage: /usr/sbin/apache2ctl start|stop|restart|graceful|graceful-stop|configtest|status|fullstatus|help

$ sudo apache2ctl stop
$ sudo apache2ctl start
$ sudo apache2ctl restart

$ man apache2ctl

To check the apache process:

$ ps aux | grep apache
root      3950  0.0  0.0 319488 16160 ?        Ss   19:48   0:00 /usr/sbin/apache2 -k start
www-data  3954  0.0  0.0 319772  9028 ?        S    19:48   0:00 /usr/sbin/apache2 -k start
www-data  3955  0.0  0.0 319772  8816 ?        S    19:48   0:00 /usr/sbin/apache2 -k start

The apache parent process is started by root; the child processes are run by www-data.

Step 4: Accessing the Apache 2.4 Server

Start a web browser (such as Firefox) and issue URL http://localhost.

Take note that the default enabled configuration "000-default.conf" defines a virtual host listening at port 80 with DocumentRoot at "/var/www/html".

Resolving Warning Message "AH00558: apache2: Could not reliably determine the server's fully qualified domain name"

The default configuration "000-default.conf" does not define the 'ServerName' (commented out), which causes error message "AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using Set the 'ServerName' directive globally to suppress this message".

To resolve this warning message, set 'ServerName' to your server's domain name or IP address. Edit the "000-default.conf" (using graphical gedit or console nano editor (sudo nano 000-default.conf)) and restart the apache2 (sudo service apache2 restart).

Note: You can verify the configuration via:

$ sudo apache2ctl configtest

(Advanced) Working with the UFW Firewall

The Ubuntu's UFW (uncomplicated firewall) firewall is disabled by default. To check:

$ sudo ufw status
Status: inactive

You can enable UFW firewall via:

$ sudo ufw enable
Firewall is active and enabled on system startup
$ sudo ufw status
Status: active
$ sudo ufw disable
Firewall stopped and disabled on system startup
$ sudo ufw status
Status: inactive

If your firewall is active, it must allow HTTP and HTTPS to run a server. You can check your UFW Firewall application profiles via:

$ sudo ufw app list
Available applications:
  Apache Full
  Apache Secure

// Display the application profiles
$ sudo ufw app info "Apache Full"

$ sudo ufw app info "Apache"

$ sudo ufw app info "Apache Secure"

// Allow the "Apache Full" profile
$ sudo ufw allow in "Apache Full"
Rules updated
Rules updated (v6)

$ sudo ufw enable
Firewall is active and enabled on system startup

$ sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
Apache Full                ALLOW       Anywhere                  
Apache Full (v6)           ALLOW       Anywhere (v6)

// Allow a specific port number
$ sudo ufw allow 22/tcp
Rule added
Rule added (v6)

$ sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
Apache Full                ALLOW       Anywhere                  
22/tcp                     ALLOW       Anywhere                  
Apache Full (v6)           ALLOW       Anywhere (v6)             
22/tcp (v6)                ALLOW       Anywhere (v6)

(Advanced) How to Setup HTTPS for Apache 2.4 on Ubuntu 16.04LTS

Step 1: Enable the SSL module (which is not loaded by default):

$ sudo a2enmod ssl
// Check
$ ll /etc/apache2/mods-enabled
lrwxrwxrwx 1 root root   26 Jan 17 23:55 ssl.conf -> ../mods-available/ssl.conf
lrwxrwxrwx 1 root root   26 Jan 17 23:55 ssl.load -> ../mods-available/ssl.load

This command create symlinks for ssl.conf and ssl.load from "/etc/apache2/mods-available" to "/etc/apache2/mods-enabled". During startup, mods-enabled is loaded.

Step 2: Study the default SSL configuration file /etc/apache2/sites-available/default-ssl.conf. It defines a virtual host listening at port 443 (the HTTPS default port number) with these directives:

DocumentRoot /var/www/html
SSLEngine on
SSLCertificateFile    /etc/ssl/certs/ssl-cert-snakeoil.pem
SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key

During the installtion, a self-signed certificate "/etc/ssl/certs/ssl-cert-snakeoil.pem" was created based on your hostname, with the key file stored in "/etc/ssl/private/ssl-cert-snakeoil.key", as reflected in the above configuration. You can use this certificate (and hence this configuration) to run your HTTPS.

Read: "/usr/share/doc/apache2/README.Debian.gz" (using File Explorer).

  • If you need to recreate this certificate (e.g. after you have changed /etc/hosts), run:
    $ sudo make-ssl-cert generate-default-snakeoil --force-overwrite
  • If you want to create a certificate with different host name, you can use:
    $ sudo make-ssl-cert /usr/share/ssl-cert/ssleay.cnf /path/to/cert-file.crt
    This will ask you for the hostname and place both SSL key and certificate in the file /path/to/cert-file.crt. Use this file for the SSLCertificateFile, and you don't need the SSLCertificateKeyFile in this case as it also contains the key. The file /path/to/cert-file.crt should only be readable by root and suggested to keep in /etc/ssl/private. For example,
    $ sudo make-ssl-cert /usr/share/ssl-cert/ssleay.cnf /etc/ssl/private/my-apache-ssl.crt
       // In the common name, enter the server's DNS name or IP address. E.g,
       // Common Name (e.g. server FQDN or YOUR name) []:
    [Alternative, you can use OpenSSL to generate a private key file and a certificate. See "Create a Self-Signed Certificate"].
    The SSL key file should only be readable by root, the certificate file may be globally readable. These files are read by the Apache parent process which runs as root. Therefore it is not necessary to make the files readable by the user www-data.

Step 3: Activate the HTTPS site.

We shall use the default configuration file default-ssl.conf and the default certificate and key file.

To activate the SSL site:

// Run helper utility a2ensite to enable the site by symlinking to "/etc/apache2/sites-enabled"
$ sudo a2ensite
   // choose 'default-ssl'

// Check
$ ll /etc/apache2/sites-enabled
lrwxrwxrwx 1 root root   35 Jan 18 00:39 default-ssl.conf -> ../sites-available/default-ssl.conf
// Reload the configuration file (without restarting)
$ sudo service apache2 reload
// or restart (stop and start)
$ sudo service apache2 restart

Step 4: You can access the site with a web browser via https://localhost.


Warning Message "[warn] RSA server certificate CommonName (CN) ... does NOT match server name!?"

In the config file, add a ServerName directive right below the ServerAdmin under <VirtualHost>:

ServerName your-hostname-or-IPaddr
Switching between HTTPS and HTTP?

Switching between HTTPS and HTTP is not really needed, as HTTPS's overhead is not very high (other than the initial hand-shake). Otherwise, you need to pass session from HTTPS (login) to HTTP.

Creating Your own Configuration File

Clone the default-ssl.conf:

$ cd /etc/apache2/sites-available
// Duplicate from default-ssl 
$ cp default-ssl.conf my-ssl.conf
// Edit configuration (using console nano editor or graphical gedit if available)
$ sudo nano my-ssl.conf

Tailor the following directives:

// Set the root directory your webapp
DocumentRoot ......

// Define the permissions of the root directory
<Directory ...... >
// Check to ensure that SSL is on
SSLEngine on
// Set the certificate (no key file needed if you use make-ssl-cert)
SSLCertificateFile    /etc/ssl/private/my-apache-ssl.crt
# SSLCertificateKeyFile /etc/ssl/private/apache.key

If you are not using the default HTTPS port of 443, you need to add the port number to "/etc/apache2/ports.conf" and access the SSL site via https://localhost:port.

How to Install MySQL 5.7 on Ubuntu 16.04LTS

Step 1: Install MySQL

Open a new Terminal and issue this command:

$ sudo apt update
$ sudo apt install mysql-server
The following NEW packages will be installed:
  libaio1 libevent-core-2.0-5 libhtml-template-perl mysql-client-5.7
  mysql-client-core-5.7 mysql-common mysql-server mysql-server-5.7

The installer will prompt for the password for the MySQL root user. Set a password for root, and remember this password.

Step 2: Verify the MySQL Installation
// Show packages relating to mysql
$ dpkg --get-selections | grep mysql
mysql-client-5.7       install
mysql-client-core-5.7  install
mysql-common           install
mysql-server           install
mysql-server-5.7       install
mysql-server-core-5.7  install

// Check the details of a package
$ dpkg --status mysql-server
Version: 5.7.16-0ubuntu0.16.04.1

// List the installed files of a package
$ dpkg --listfiles mysql-server

// Check the location of "mysqld" (MySQL server deamon)
$ which mysqld
$ whereis mysqld
mysqld: /usr/sbin/mysqld /usr/share/man/man8/mysqld.8.gz
$ man mysqld   // Read the manual

// Check the location of "mysql" (MySQL command-line client)
$ which mysql
$ whereis mysql
mysql: /usr/bin/mysql /etc/mysql /usr/lib/mysql /usr/bin/X11/mysql /usr/share/mysql /usr/share/man/man1/mysql.1.gz
$ man mysql   // Read the manual

As seen from the above output, the MySQL server daemon "mysqld" is installed at "/usr/sbin" (System-Software Binaries). The MySQL command-line client "mysql" and utilities such as "mysqladmin" and "mysqldump" are located at "/usr/bin" (Application Software Binaries).

Step 3: Configure MySQL Server

MySQL reads the startup options from the files shown below, in the specified order (top files are read first, files read later take precedence) (Reference:

  1. /etc/my.cnf
  2. /etc/mysql/my.cnf
  3. SYSCONFDIR/my.cnf
  4. $MYSQL_HOME/my.cnf (server only)
  5. The file specified in --defaults-extra-file startup option, if any
  6. ~/.my.cnf
  7. ~/.mylogin.cnf (client only)

The installation default /etc/mysql/my.cnf includes directories /etc/mysql/conf.d/ and /etc/mysql/mysql.conf.d/. The /etc/mysql/conf.d/mysql.cnf is empty. Hence, the main configuaration file is /etc/mysql/mysql.conf.d/mysqld.cnf.

Browse through /etc/mysql/mysql.conf.d/mysqld.cnf:

user            = mysql
port            = 3306
basedir         = /usr
datadir         = /var/lib/mysql
log_error = /var/log/mysql/error.log
  • A special user called "mysql" is created to run the MySQL server.
  • The server runs on the default port number of 3306.
  • The data directory is located at /var/lib/mysql (owned by mysql:mysql).
  • The error log is located at /var/log/mysql/error.log.
Step 4: Start/Shutdown MySQL Server (mysqld)

MySQL is run as a service called "mysql" (configured at "/etc/init.d/mysql"), which is started automatically after boot. To start/stop/restart mysql, you could:

$ sudo service mysql start
$ sudo service mysql stop
$ sudo service mysql restart
   // Stop and start
$ sudo service mysql status
   // Show the status

MySQL server will be started automatically after the installation. You CANNOT start another instance! To check the mysqld process:

$ ps aux | grep mysqld
mysql     1113  0.0  0.3 484432 50024 ?        Ssl  18:33   0:08 /usr/sbin/mysqld
Step 5: Start/Stop MySQL Command-line Client (mysql)

To start a MySQL client:

$ mysql -u root -p
   // Enter the password for the root user you have set in Step 1

mysql> select user, host, authentication_string from mysql.user;
| user             | host      | authentication_string                     |
| root             | localhost | *1556A6F65259CE3FBEA8489096F7797B4E0D5BEC |
| debian-sys-maint | localhost | *4DAD7B857498382CA8EB2EEF56E0EF9269D9FF6B |
3 rows in set (0.00 sec)

mysql> exit

READ "MySQL" section.

(For Java Programmers) Install MySQL JDBC Driver
  1. Download the latest JDBC driver from ⇒ MySQL Connectors ⇒ Connector/J ⇒ Compressed TAR archive (e.g., mysql-connector-java-{5.x.xx}.tar.gz, where {5.x.xx} is the latest release number).
  2. Double-click on the downloaded TAR file (at ~/Downloads) to expand into folder "mysql-connector-java-{5.x.xx}".
  3. Open the expanded folder. Copy the JAR file "mysql-connector-java-{5.x.xx}-bin.jar" to JDK's extension directory at "/usr/local/java/jdk1.8.0_{xx}/jre/lib/ext".
    $ cd /usr/local/java/jdk1.8.0_{xx}/jre/lib/ext
    $ sudo cp ~/Downloads/mysql-connector-java-{5.x.xx}/mysql-connector-java-{5.x.xx}-bin.jar .
The mysql_secure_installation script

The installation provide a script /usr/bin/mysql_secure_installation to tailor the security options.

[TODO] more

How to install PHP 7 on Ubuntu 16.04LTS

To install PHP 7

$ sudo apt install php libapache2-mod-php php-mcrypt php-mysql
The following NEW packages will be installed:
  libapache2-mod-php libapache2-mod-php7.0 libmcrypt4 php php-common
  php-mcrypt php-mysql php7.0 php7.0-cli php7.0-common php7.0-json
  php7.0-mcrypt php7.0-mysql php7.0-opcache php7.0-readline

// Show all package related to php
$ dpkg --get-selections | grep php
libapache2-mod-php				install
libapache2-mod-php7.0				install
php						install
php-common					install
php-mcrypt					install
php-mysql					install
php7.0						install
php7.0-cli					install
php7.0-common					install
php7.0-json					install
php7.0-mcrypt					install
php7.0-mysql					install
php7.0-opcache					install
php7.0-readline					install
// Show details a package
$ dpkg --status php7.0

// List the files of a package
$ dpkg --listfiles php

PHP supports Apache interface and Command-line interface (CLI). PHP executable is available in "/usr/bin/php" (link to "/usr/bin/php5" via alternatives as shown below):

$ which php
$ ls -ld /usr/bin/php
lrwxrwxrwx 1 root root 21 Sep 24  2013 php -> /etc/alternatives/php
$ ls -ld /etc/alternatives/php
lrwxrwxrwx 1 root root 13 Sep 24  2013 /etc/alternatives/php -> /usr/bin/php7.0
$ man php7.0    // Read manual

You could try out the Command-Line (CLI) PHP via:

// Say hello
$ php -r 'echo "Hello, world!\n";'
Hello, world!
// Run phpinfo()
$ php -r 'phpinfo();'

The PHP configuration files are "/etc/php/7.0/apache2/php.ini" for the Apache interface; and "/etc/php/7.0/cli/php.ini" for standalone command-line interface.

Write a PHP script called "test.php" (place under Apache's base at "var/www/html") to run phpinfo() under Apache, as below.


Run the script via http://localhost/test.php. The output shows that the loaded configuration files are "/etc/php/7.0/apache2/php.ini" and "/etc/php/7.0/apache2/conf.d/*.ini". The "conf.d" contains links to "/etc/php/7.0/mods-available".

The Apache loads the PHP module via "/etc/apache2/apache2.conf" ⇒ "/etc/apache2/mods-enabled/php7.0.conf|php7.0.load" ⇒ "/etc/apache2/mods-available/php7.0.conf|php7.0.load".

How to install PhpMyAdmin

"PhpMyAdmin" is a PHP app running under Apache, which provides an GUI for managing MySQL. Run apt install to install phpmyadmin:

$ sudo apt install phpmyadmin
The following NEW packages will be installed:
  dbconfig-common dbconfig-mysql javascript-common libjs-jquery
  libjs-sphinxdoc libjs-underscore php-gd php-gettext php-mbstring php-pear
  php-phpseclib php-tcpdf php-xml php7.0-gd php7.0-mbstring php7.0-xml
Select 'apache2' in 'Server Selection'
Select 'yes' to use dbconfig.common to setup the database
Choose a password for MySQL user 'phpmyadmin'
$ whereis phpmyadmin
phpmyadmin: /etc/phpmyadmin /usr/share/phpmyadmin

You can access PhpMyAdmin via http://localhost/phpmyadmin.

PHP's configuration file for Apache is "/etc/phpmyadmin/apache.conf", which is included into Apache's main config file "/etc/apache2/apache2.conf" thru "/etc/apache2/conf-enabled/phpmyadmin.conf". In the configuration, an alias "/phpmyadmin" is defined which is mapped to phpMyAdmin's web pages at "/usr/share/phpmyadmin".

NOTE: If you did not select apache2 during the installation, make a symlink called phpmyadmin.conf in /etc/apache2/conf-available to /etc/phpmyadmin/apache.conf; and use a2enconf to enable the configuration.

$ cd /etc/apache2/conf-available
$ sudo ln -s /etc/phpmyadmin/apache.conf phpmyadmin.conf
$ sudo a2enconf phpmyadmin.conf
$ sudo service apache2 restart

IDE for PHP Program Development

You need an IDE for PHP program development. The popular PHP IDE are:

  • Eclipse PDT
  • NetBeans

How to install xDebug PHP Extension

A debugger is critical in program development.

On Eclipse PDT, you can use either xDebug or Zend Debugger. This section describes xDebug @

To install and setup xDebug for Eclipse PDT:

  1. Install xdebug extension for PHP
    $ sudo apt install php-xdebug
    The following NEW packages will be installed:
    $ dpkg --status php-xdebug
    Version: 2.4.0-1
    $ dpkg --listfiles php-xdebug
  2. Check the location of "" module, which is kept under "/usr/lib/php/20151012", where the number depends on the PHP version.
  3. The installation creates a configuration file "/etc/php/7.0/mods-available/xdebug.ini" with the following line (otherwise, create one):

    NOTE: in the previous version, you need to specify the full-path filename, e.g., "zend_extension=/usr/lib/php/20151012/".

    Include the following lines into "xdebug.ini" to enable remote debugging from Eclipse PDT:
    xdebug.remote_enable = On
    xdebug.remote_port = 9000
    xdebug.remote_host =

    Recall that Apache loads PHP configuration files "/etc/php/7.0/apache2/php.ini" and "/etc/php/7.0/apache2/conf.d/*.ini". To enable the above xdebug configuration file, create the following symlink in "/etc/php/7.0/apache2/conf.d" (already created for the latest version - check first):

    $ cd /etc/php/7.0/apache2/conf.d
    $ sudo ln -s ../../mods-available/xdebug.ini 20-xdebug.ini
    $ ls -l
    lrwxrwxrwx 1 root root   31 Sep 11 19:42 20-xdebug.ini -> ../../mods-available/xdebug.ini
  4. Check PHP configuration file "/etc/php/7.0/apache2/php.ini" for the following settings:
    ; Turn on the error display for development system, 
    ; but not for production system.
    display_errors = On
    ; Format error in HTML
    html_errors = On
  5. Restart the Apache2:
    $ sudo service apache2 restart
  6. Check the phpinfo() output to verify xdebug has been started. Create a PHP script called "test.php" with the following lines, and save under the Apache's base directory "/var/www" (or "/var/www/html"):
    Issue http://localhost/test.php, and search for xdebug (as shown below) to confirm that xdebug is activated. xdebug

Now, you can configure Eclipse PDT to work with "xdebug" for remote debugging of PHP programs: See "Eclipse PDT".

How to install Zend Debugger for PHP

[TODO] Need to Update

You can use either xdebug or Zend Debugger, but not both?!

NOTE: I have problems setting up Zend Debugger. I suggest you use xDebug (descried in the previous section).

  1. Download the Zend PHP debugger from
  2. Extract the tarball.
  3. Check your PHP version via "php --version".
  4. Copy the "" module from the corresponding PHP version folder into /usr/lib/php5. At the time of writing, PHP 5.4 is not supported!!!
  5. Edit the php configuration file /etc/php5/apache2/php.ini to append the below:
    ; The section name is optional, but it's always a good idea to add it,
    ; especially if you are not using a separate file
    ; This directive needs the full path to the Zend Debugger binary
    zend_extension =/usr/lib/php5/
    ; This directive allows Zend Debugger to start a debug session with:
    ; This directive allows Zend Debugger to expose itself
    ; upon request (this is used in some service functionality).
    ; The possible options are:
    ; never – do not expose (default)
    ; always – expose to whoever wants to know
    ; allowed_hosts – expose only if the request comes from an IP listed above
  6. Restart the Apache2 via
    $ sudo service apache2 restart
  7. Check the Apache's error log via
    $ tail /var/log/apache2/error.log
    If error "Failed loading /usr/lib/php5/ cannot open shared object file: No such file or directory" occurs, you need to install libssl.
    $ sudo apt search libssl0.9.8
    libssl0.9.8 - SSL shared libraries
    libssl0.9.8-dbg - Symbol tables for libssl and libcrypto
    $ sudo apt install libssl0.9.8
    Restart apache2 and check the Apache's error log.
  8. Check the phpinfo() output to verify Zend Debugger has been started.

How to install Firebug plugin for Firefox for debugging Client-side HTML/CSS/JavaScript

Start Firefox, select menu "Tools" ⇒ Add-ons ⇒ Search for "Firebug" ⇒ Install.

[TODO] Debugging JavaScript

How to Install Tomcat 7/8 on Ubuntu

Install via APT

Search for tomcat packages:

// Search for package containing the term "tomcat"
$ apt-cache search tomcat
    // tomcat7 and tomcat6 available

// Show the description of tomcat7
$ apt-cache show tomcat7 | less
    // Check the suggest packages

Install tomcat packages:

$ sudo apt install tomcat7
// Optional: Install some suggested packages
$ sudo apt install tomcat7-docs tomcat7-admin tomcat7-examples tomcat7-user

Define environment variable JAVA_HOME (?!)

To start/stop tomcat:

$ sudo service tomcat7 start
$ sudo service tomcat7 stop
$ sudo service tomcat7 restart

You can access tomcat via http://localhost:8080.

Install Manually

Step 1: Download

Goto ⇒ Download ⇒ Tomcat 8.0 ⇒ 8.0.{xx} (where {xx} denotes the latest release) ⇒ Binary distribution ⇒ Core ⇒ Download the "tar.gz" package (e.g., "apache-tomcat-8.0.{xx}.tar.gz").

Step 2: Install

Assume that it is to be installed under "/usr/local/tomcat".

$ cd /usr/local/tomcat
$ sudo tar xzvf /PATH/TO/apache-tomcat-8.0.{xx}.tar.gz
    // unzip into /usr/local/tomcat/apache-tomcat-8.0.{xx}

For security reasons, you should NOT run tomcat using root user. We shall create a non-login user called tomcat (in group tomcat) to run the server.

// Create a user called "tomcat" in group "tomcat"
$ sudo useradd -s /sbin/nologin -d /opt/tomcat/temp tomcat
   // -s <login-shell>: specify the login shell
   // -d <home-dir>

// Change ownership to user "tomcat" and group "tomcat"
$ cd /usr/local/tomcat
$ sudo chown -R tomcat:tomcat apache-tomcat-8.0.{xx}
   // -R: recursively for the sub-directories
$ sudo chmod -R 750 apache-tomcat-8.0.{xx}
   // -R: recursively for the sub-directories

[TODO] Test the permissions; change to adduser from useradd.

Step 3: Set Environment Variable JAVA_HOME

Check if the environment variable JAVA_HOME, containing the JDK installed directory, has been set. To verify:

$ echo $JAVA_HOME
[JDK installed directory]

If JAVA_HOME is not set, you can edit "/etc/profile":

$ sudo nano /etc/profile

Include the following line at the end of the file. I shall assume that JDK is installed in /usr/local/java/jdk1.8.0_{xx}. But you need to verify the location of your JDK installed directory!!!

export JAVA_HOME=/usr/local/java/jdk1.8.0_{xx}

Rerun the script:

$ source /etc/profile
// To verify:
$ echo $JAVA_HOME
Step 4: Configure Tomcat Server

You can start tomcat using the default configuration files provided. Read "Configure Tomcat Server" for the configuration options.

Step 4: Start/Stop Tomcat Server Manually

To start the Tomcat server, open a new "Terminal" and issue:

$ cd /usr/local/tomcat/apache-tomcat-8.0.{xx}/bin
// All the following commands can be used to start tomcat
$ ./
$ ./ run
$ ./ start
   // use "sudo" if permissions denied

If you will get an error "permission denied" on running the script, you need to set the script to be executable, via command "chmod uga+x *.sh".

Check for the Tomcat server's TCP port number from the console messages. The default is 8080.

To verify if the Tomcat server is started, start a browser and issue URL http://localhost:8080, suppose that Tomcat is running on the default TCP port number of 8080.

Also try URL http://localhost:8080/examples which shows the Servlet/JSP examples.

To shutdown the Tomcat server, you can simply press control-c on the tomcat console, or issue command:

$ cd /usr/local/tomcat/apache-tomcat-8.0.{xx}/bin
// All the following commands can be used to shutdown tomcat
$ ./
$ ./ stop
Step 5: Running Tomcat as a service

Create an initialization script called "tomcat8" under directory "/etc/init.d", with the following contents. Check your tomcat installed directory in CATALINA_HOME.

$ sudo nano /etc/init.d/tomcat8
export CATALINA_HOME=/usr/local/tomcat/apache-tomcat-8.0.12
start() {
stop() {
case $1 in
  start|stop) $1;;
  restart) stop; start;;
  *) echo "Run as $0 <start|stop|restart>"; exit 1;;

Set the permissions (executable):

$ sudo chmod 755 /etc/init.d/tomcat8

To start/stop the tomcat8 service:

// To start
$ sudo service tomcat8 start
$ sudo /etc/init.d/tomcat8 start  // same as above
// To stop
$ sudo service tomcat8 stop
$ sudo /etc/init.d/tomcat8 stop  // same as above

To start tomcat8 service automatically after boot:

$ sudo update-rc.d tomcat8 defaults
Step 6: Servlet API

To write Java servlets, you need to COPY the Servlet API JAR file ("servlet-api.jar") from "~/myProject/tomcat/lib" to the JDK's extension directory at "/usr/local/java/jdk1.8.0_{xx}/jre/lib/ext". You may need the superuser right.

[TODO] Does not work on latest JDK/Tomcat. Need to include servlet-api.jar in classpath to compile.

How to Install Postfix as a Send-Only Mail Server

Reference: Postfix @

Postfix is an MTA (Mail Transfer Agent), an application used to send and receive email.

To install postfix mail server:

$ sudo apt install postfix

To configure postfix, run:

$ sudo dpkg-reconfigure postfix

Read "postfix" @ for the configuration options.

The utility "sendmail" is installed in /usr/sbin/sendmail.

To send an email:

$ sendmail -v
Subject: test
This is a test message

The -v option requests for a mail delivery report, which is optional.

You should also install the "mailutils", for the "mail" utility.

$ sudo apt install mailutils

Try sending an email to a user at the localhost, via "sendmail local-username", you can then read the email by logging-in as the local-username, and run:

$ mail

The postfix configuration is kept in /etc/postfix/ Run "/etc/init.d/postfix reload" to reload the configuration.

Disable Incoming Mail

You can use the inet_interfaces directive in /etc/postfix/ to control what address Postfix listens on for incoming connections. If you set it to the following it will only listen on the loopback interface, which means that connections can only originate from that machine.

inet_interfaces = loopback-only

How to Install SSH Server

SSH (Secure Shell) is the secured version of the legacy telnet, which transmits everything including password in clear text.

Setting up an SSH Server - OpenSSH

Install openssh-server package. The SSH server daemon is called sshd. The SSH Server runs on TCP port 22, by default. The configuration file is kept in /etc/ssh/sshd_config.

The OpenSSH package comprises a suite of tools:

  1. sshd server,
  2. ssh client,
  3. sftp (secure ftp), which replaces ftp (file transfer protocol),
  4. scp (secure copy), which replaces rcp (remote copy).

The ftp (file transfer protocol), like telnet, is unsecured. sftp puts the ftp over the secured ssh connection. The legacy rcp (remote copy) was primarily used to copy a single file between machines. The scp replaces rcp by channeling the data over the secured ssh connection. sftp operates on many files; while scp works on a single file.

C/C++ Programming on Ubuntu

C Programming

Check if GNU C-compiler "gcc" is installed:

$ gcc --version
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609

If not, install "gcc" via:

$ sudo apt install gcc

Write the following hello-world program and save as "Hello.c" in a directory of your choice:

#include <stdio.h>
int main() {
   printf("Hello world from C!\n");
$ cd <your-c-directory>
// Compile the program
$ gcc Hello.c
// To run the program
$ ./a.out
Hello, world!
C++ Programming

Check if GNU C++ compiler "g++" is installed:

$ g++ --version
g++ (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609

If not, install "g++" via:

$ sudo apt install g++

Write the following hello-world program and save as "Hello.cpp" in a directory of your choice:

#include <iostream>
using namespace std;
int main() {
   cout << "Hello world from C++!" << endl; 
$ cd your-directory
// Compile the program
$ g++ Hello.cpp
// To run the program
$ ./a.out
Hello, world!

You could use Eclipse or NetBeans as C/C++ IDE. Read the "Eclipse How-To" or "NetBean How-To".

Ubuntu's Tips and Tweaks


  1. Copy/Paste Shortcut Keys:

    The default shortcut keys for copy/paste in Terminal are Shift-Ctrl-C and Shift-Ctrl-V. You can also use the mouse pointer to select texts, and click the "middle" mouse button (if you have one) to paste the highlighted texts. Ctrl-C, by default, is configured for interrupt signal (or break).

    To use Ctrl-C/Ctrl-V as copy/paste, I reconfigure Ctrl-J (or Ctrl-Shift-C) as the interrupt signal by placing this line in the "~/.profile":

    stty intr ^J
    Then, we can configure Ctrl-C/Ctrl-V as copy/paste via Terminal's menu "Edit" ⇒ Keyboard Shortcuts.
  2. Shortcut to launch Terminal: To configure a shortcut key to launch a Terminal, goto System ⇒ Preferences ⇒ Keyboard Shortcuts ⇒ Under Desktop category, choose "Run a Terminal" ⇒ Press the key you want to set as shortcut (e.g., ctrl-t).
  3. Command-line Interface (CLI) Consoles: You can press Ctrl-Alt-F1 to Ctrl-Alt-F6 to activate one of the 6 virtual command-line consoles (provided by getty/agetty programs). Press Ctrl-Alt-F7 to return to the GUI console. These command-line console is handy if your GUI console is having problem.

User Administration

  1. How to hide an user from the login Screen: One way is to set the UID to a number less than 1000 (UID less than 1000 are system users; 1000 and above for regular users).
    $ sudo usermod -u <uid> <username>
  2. How to Change the Display Name: The display name is kept in /etc/passwd. You can avoid editing /etc/passwd directly by using utility chfn:
    $ less /etc/passwd
    // Change user information
    $ sudo chfn <username>
    $ less /etc/passwd
    Note: You can check the integrity of /etc/passwd via utility pwck.
  3. How to change a username:
    $ sudo usermod -l <new-username> <old-username>
    This does not affect the file ownerships, as they are based on UID instead of username.
    You also need to move the home folder as follows:
    $ sudo usermod -d /home/<new-user-dir> -m <new-username>
  4. Show the user login history:
    $ last
       // from /var/log/wtmp
    $ last -f /var/log/wtmp.1
       // from older file
    $ last -num
       // number of lines
    Or, via Webmin ⇒ Users and Groups ⇒ Button "Display Logins by".

System Administration

  1. How to change the hostname: Your hostname is defined in two files: /etc/hostname and /etc/hosts.
    $ sudo gedit /etc/hostname
    $ sudo gedit /etc/hosts
  2. How to choose hostnames: Either functional names (which represents, in some encoded form, the purpose of the machine) or mnemonic names (which are drawn from some pre-existing human naming scheme and contained no implicit meaning about the machine's purpose, e.g., fruits, flowers, rivers, elements, stars, drinks, etc.). Human users seem to prefer mnemonic names over functional names.
  3. How to mount a drive automatically at startup: Instead of manually editing /etc/fstab, Dash "Disks" ⇒ Select the drive or partition ⇒ click icon "More Actions" ⇒ Edit Mount Options ⇒ set "Automatic Mount Options" to off ⇒ Set "Mount Options" to "Mount at startup" ⇒ set the "mount point" (e.g., /mnt/<drive-name>).
    Check /etc/fstab for the modifications.
  4. Show Disk Usage:
    • df (Disk File system) command: report file system and disk space usage. Try "df" and "df -h"
    • du (Disk Usage for EACH file) command: estimate file space usage.
  5. How to read Ubuntu files from Windows: Ubuntu uses Ext2 (or Ext3/Ext4) file system. To read Ubuntu files from Windows, install software such as "Paragon ExtFS for Windows" (Free for personal use) or "Ext2Read".
  6. sudo cd??: "sudo cd dirname" does not work, because cd is a shell built-in, not a binary. You could issue "sudo su" to switch to root, followed by "cd dirname".
  7. Shutdown from command-line: You can shutdown the machine from Terminal, or one of the 6 command-line console (activated via Ctrl-Alt-F1 to Ctrl-Alt-F6) using:
    // Shutdown
    $ sudo shutdown now
    // Restart
    $ sudo shutdown -r now
       // -r to restart
    $ sudo reboot
    Or, via Webmin ⇒ System ⇒ Bootup and Shutdown ⇒ Button "Reboot System", or "Shutdown System".
  8. How to set the Grub dual-boot to wait for enter key
    $ sudo nano /etc/default/grub
    # Set to -1 to wait for enter key
  9. Multiple Display: The display configurations are saved in ~/.config/monitor.xml. You can remove it to re-configure.
  10. Show date/time: via command "date".
  11. Ubuntu Software Updater vs apt: [TODO]

"Nautilus" File Manager

  1. Show directory path in File Manager: Press Ctrl-l to show path, ESC to show icons.
  2. How to show files in list view instead of icon view: Edit ⇒ Preference ⇒ choose "Views" tab ⇒ Default View ⇒ View new folders using ⇒ choose "List view". You can also choose the columns to be displayed under "List Columns" tab.
  3. View dot (hidden) files: Select "File" menu ⇒ Preferences ⇒ View ⇒ Show hidden files.
  4. Bookmark Folders (in the sidebar): Select the desired folder, click the "options" icon ⇒ Bookmark this location. The bookmarked folder will be shown in the sidebar.
  5. How to remove pre-set bookmarks from the sidebar such as Videos: Edit ~/.config/user-dirs.dirs, and comment out the unwanted ones. Create a file ~/.config/user-dirs.conf with a line enabled=false. Logout and sign-in again.


  1. Enable spell check: under "tool" menu ⇒ edit ⇒ preferences.

Accessing Remote Server

You can login to a remote server via command-line SSH, and transfer files via SCP. You can also use GUI client such as FileZilla.

SSH (Secured Shell)

A terminal-based command-line client for logging in to the remote server.

$ ssh <username>@<server-name>
// OR
$ ssh <server-name> -l <username>
SCP (Secure Copy)

A terminal-based command-line client for copying files between local machine and remote server.

$ scp <source> <dest>
   // <source>/<dest> format: <username>@<server-name>:<path-name>
Mount Folders of Remote Server on Nautilus File Manager

Select "Files" menu ⇒ Connect to Server ⇒ enter "sftp://server-name/path".

FileZilla FTP/SFTP GUI Client

To install:

$ sudo apt install filezilla
$ which filezilla

To launch FileZilla, type FileZilla from Dash. In host, use sftp://server-name; in port, use 22 for SSH.

(For Windows) WinSCP and Putty

WinSCP is a GUI SCP for Windows. Putty is a GUI SSH client.

Ubuntu Applications

Epub Reader - Calibre

To install:

$ sudo apt install calibre

You can launch Calibre from the dash.

VLC Media Player:

GIMP Image Editor: an image editing software like Photoshop. Can be installed from the Ubuntu Software.

BleachBit: For cleaning up the Ubuntu system.

Google Chrome:

Terminator: A multiple terminal consoles (to replace the terminal). Can be installed from the Ubuntu Software.


How to create desktop icons: Goto /usr/share/applications. Ctrl-C to copy an app and Ctrl-V to paste a shortcut on desktop.


  1. Ubuntu Mother site @
  2. Matthew Helmke, "Ubuntu Unleashed 2012 edition", 2012, Sams.
  3. Matthew Helmke & Amber Graner, "The official Ubuntu book", 7th ed, 2012, Canonical Inc. (For beginners.)