Linux command line task management with jobs, BG, FG and nohup – multitasking

Often I see people waiting while their command is executing, impatiently tapping their desk until a file copy or command has finished.

They are often amazed when I show them that the Linux command line has a way of sending pending commands to the background, so you can continue on another task.

Below is a gif screencast which shows:

Continue reading “Linux command line task management with jobs, BG, FG and nohup – multitasking”

File won’t download from Microsoft Teams

My colleague and me wanted to share a 50MB zip file via Teams. Which looked fine, but MS Teams application would not do anything when I tried to download it.

I tried several things, opening the same location in Sharepoint, moving it to OneDrive, etc. but in the end the following worked for me:

  • Open MS teams in a browser (URL for convenience: https://teams.microsoft.com/)
  • Open the same chat in which the file was shared
  • Go to the Files tab
  • Download the file

I’m not sure why Teams app would not download, but atleast this worked for me.

Happy “Not trying to use USB sticks ever again” day to you all!

Log as well as see error and standard output in Linux Terminal

Quick snippet, as I was searching for this one today.

You can output both standard and error output to both screen and log file with the below command:

my_command.sh 2>&1 | tee my_command.log

Explanation:

  • my_command.sh
    • replace with your command (possibly including arguments)
  • 2>&1
    • redirects standard error to standard output, otherwise only standard output is written to file
  • | tee
    • my_command.log pipes the output to tee, which writes both to screen and file

Citrix Workspace (ICAClient) no sound/audio in Microsoft Teams

Since last week I am working with a virtual desktop (VDI) through Citrix Workspace (ICAClient) and noticed I can not use Teams to call or join meetings.

This message is displayed in Microsoft Teams:

There’s a problem with your connection.
Still connecting to remote devices. Calling isn’t available yet.

Cause: HDX Optimized audio does not work

If you want to skip straigt to the solution, click here: Solution: Change MSTeamsRedirSupport to zero

How to diagnose if the cause is the same as what I encountered

Log in to your VDI, play some sounds AND talk into your microphone to make sure your audio is actually working. Check this via the sound mixer, that’ll show a moving bar if it’s receiving sound by your microphone. Speakers should work when you watch a random youtube movie.

Next; Open MS Teams and click the “Three dots” settings menu, choose About, then Version. When your Workspace and Teams are expecting HDX to work but it didn’t, you will see this message: Citrix HDX Not Connected

MS Teams, Settings – About – Version: “Citrix HDX Not Connected”

Note: If it would be working, you would have seen Citrix HDX Connected

The third option is if Teams does not expect Citrix HDX to work, then it simply doesn’t show anything about Citrix HDX and tunnels sound over the regular sound channels. This is what we want to accomplish in the next chapter.

There is a registry entry MSTeamsReditSupport, which is set every time you connect to your VDI with Citrix Workspace. From what I understand; Citrix Workspace communicates to your VDI that it is capable to receive HDX optimized audio streams. Next to that MS Teams checks that registry setting when it is started to use/not use HDX optimized audio.

Solution: Change MSTeamsRedirSupport to zero

Change MSTeamsRedirSupport to 0 (zero) in registry. The exact location of this registry entry is here:
HKEY_CURRENT_USER\SOFTWARE\Citrix\HDXMediaStream\MSTeamsRedirSupport

It’s a bit tedious to open Registry Editor every time, so you can also create a registry entry file MSTeamsRedir.reg
In this file you can paste this content:

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\SOFTWARE\Citrix\HDXMediaStream]
"MSTeamsRedirSupport"=dword:00000000

Remember; You should run MSTeamsRedir.reg every time you connect to the machine or when you restart MS Teams.

Why is this a problem?

I do not know exactly, but I know that the HDX optimized socket on my laptop can not be reached contact the VDI and I tried searching for a solution for a couple of hours. I then became fed up with HDX optimized sockets and thought about buying a macbook to just make the damn thing work. After that short existential crisis I kept searching for a possible solution and was happy to find this registry setting.

My emotions with Linux after figuring stupid things out which simply work on other OS’s

What I’ve tried and did not work:

1.) Run Citrix supplied hdxcheck.sh and see if you have all the libs installed, I tried installing all libs manually and in the end still had no HDX optimized sound in my VDI. You can run this command via the following path:
/opt/Citrix/ICAClient/util/hdxcheck.sh

2.) Install older version of Citrix Workspace, which didn’t use the HDX optimization and thus sound worked in all applications. I did encounter some bugs with full-screen not working properly on a bigger monitor. The version I used is linked below:
Download icaclient_19.12.0.19_amd64.deb via https://www.citrix.com/downloads/workspace-app/
Direct link to the download: https://www.citrix.com/downloads/workspace-app/legacy-workspace-app-for-linux/workspace-app-for-linux-1912.html

Sources:

Citrix.com: Enable optimization of Microsoft Teams

Citrix.com: How to collect Logs for Citrix Workspace app for Linux?

(Web-safe) Fonts blurry/bad/jagged/vague in Chrome

Chrome based browsers (Edge/Vivaldi/etc) and Chrome itself are great. But the font smoothing on my Linux laptop (Pop!_Os / Ubuntu) is not great. This comes into play when you’re visiting pages with web or web-safe fonts.

Web(-safe) fonts allow Web designers to use fonts that are not installed on the viewer’s computer.

The edges of the fonts look a bit jagged and the edges are vague. This is quite annoying, since the fonts are rendered perfectly in all other applications.

After a whole lot of searching I finally found the solution (for me). YMMV (Your miles may vary)

Solution: Disable Hardware acceleration in settings

Go to settings by clicking the three dots and then select settings.

In the settings, search for hardware

(You can click this link to go there directly: chrome://settings/?search=hardware)
(If you use chrome, click here to go there directly: chrome://settings/?search=hardware)

Flip the switch next to Use hardware acceleration when available and click Relaunch

Wonderful! Click Relaunch to view beatifully rendered web fonts

After the relaunch my fonts were rendered perfect.

Examples:

Hardware acceleration disabled, bask in the glory of clean fonts!
Hardware acceleration enabled, fonts edges are vague !

Pop!_Os: NVidia gpu card very slow (or not working) Linux

So after a long while I wanted to get back to CS:GO on my Thinkpad X1 Extreme with hybrid Intel/Nvidia GPU, and the performance was horrible!

Long story short: (re)install the Nvidia drivers to get the Nvidia card working.

First: Testing if the NVidia card is active

You can test if you are actually using the NVidia card by running this command:

 ~  glxinfo|egrep "OpenGL vendor|OpenGL renderer"
OpenGL vendor string: Intel Open Source Technology Center
OpenGL renderer string: Mesa DRI Intel(R) UHD Graphics 630 (Coffeelake 3x8 GT2) 
 ~  

You can see in the example above that Intel means that you’re still using the Intel onboard graphics card for all your OpenGL stuff (including games like CS:GO)

And Intel GPU is not good for gaming.

Note: If it actually says NVIDIA in your output then don’t continue with the solution below.

Solution: (Re-)Install the NVidia driver

Check if you have the driver currently installed:

dpkg -l |grep nvidia

Notice: If the package is installed on your system then the package name is preceded by ii

There should be driver package named nvidia-driver-xxx installed. Where xxx is the version number.

In my system it looks like this:

~  dpkg -l |grep nvidia                         
ii  libnvidia-cfg1-470:amd64                470.57.02-1pop0~1627044105~21.04~f9815ed                             amd64        NVIDIA binary OpenGL/GLX configuration library
ii  libnvidia-common-470                    470.57.02-1pop0~1627044105~21.04~f9815ed                             all          Shared files used by the NVIDIA libraries
rc  libnvidia-compute-435:amd64             440.31-1pop1~1573485407~19.04~af08493                                amd64        Transitional package for libnvidia-compute-440
rc  libnvidia-compute-455:amd64             460.67-1pop0~1616430777~20.04~71e1ad1                                amd64        Transitional package for libnvidia-compute-460
rc  libnvidia-compute-460:amd64             465.31-1pop0~1623777959~20.10~a3ca7f3                                amd64        Transitional package for libnvidia-compute-465
rc  libnvidia-compute-465:amd64             470.57.02-1pop0~1627044105~20.10~f9815ed                             amd64        Transitional package for libnvidia-compute-470
ii  libnvidia-compute-470:amd64             470.57.02-1pop0~1627044105~21.04~f9815ed                             amd64        NVIDIA libcompute package
ii  libnvidia-compute-470:i386              470.57.02-1pop0~1627044105~21.04~f9815ed                             i386         NVIDIA libcompute package
ii  libnvidia-decode-470:amd64              470.57.02-1pop0~1627044105~21.04~f9815ed                             amd64        NVIDIA Video Decoding runtime libraries
ii  libnvidia-decode-470:i386               470.57.02-1pop0~1627044105~21.04~f9815ed                             i386         NVIDIA Video Decoding runtime libraries
ii  libnvidia-encode-470:amd64              470.57.02-1pop0~1627044105~21.04~f9815ed                             amd64        NVENC Video Encoding runtime library
ii  libnvidia-encode-470:i386               470.57.02-1pop0~1627044105~21.04~f9815ed                             i386         NVENC Video Encoding runtime library
ii  libnvidia-extra-470:amd64               470.57.02-1pop0~1627044105~21.04~f9815ed                             amd64        Extra libraries for the NVIDIA driver
ii  libnvidia-fbc1-470:amd64                470.57.02-1pop0~1627044105~21.04~f9815ed                             amd64        NVIDIA OpenGL-based Framebuffer Capture runtime library
ii  libnvidia-fbc1-470:i386                 470.57.02-1pop0~1627044105~21.04~f9815ed                             i386         NVIDIA OpenGL-based Framebuffer Capture runtime library
ii  libnvidia-gl-440:i386                   470.57.02-1pop0~1627044105~21.04~f9815ed                             i386         Transitional package for libnvidia-gl-470
ii  libnvidia-gl-470:amd64                  470.57.02-1pop0~1627044105~21.04~f9815ed                             amd64        NVIDIA OpenGL/GLX/EGL/GLES GLVND libraries and Vulkan ICD
ii  libnvidia-gl-470:i386                   470.57.02-1pop0~1627044105~21.04~f9815ed                             i386         NVIDIA OpenGL/GLX/EGL/GLES GLVND libraries and Vulkan ICD
ii  libnvidia-ifr1-470:amd64                470.57.02-1pop0~1627044105~21.04~f9815ed                             amd64        NVIDIA OpenGL-based Inband Frame Readback runtime library
ii  libnvidia-ifr1-470:i386                 470.57.02-1pop0~1627044105~21.04~f9815ed                             i386         NVIDIA OpenGL-based Inband Frame Readback runtime library
rc  nvidia-compute-utils-460                460.73.01-1pop0~1620243205~20.10~9a91ef9                             amd64        NVIDIA compute utilities
ii  nvidia-compute-utils-470                470.57.02-1pop0~1627044105~21.04~f9815ed                             amd64        NVIDIA compute utilities
rc  nvidia-dkms-460                         460.73.01-1pop0~1620243205~20.10~9a91ef9                             amd64        NVIDIA DKMS package
ii  nvidia-dkms-470                         470.57.02-1pop0~1627044105~21.04~f9815ed                             amd64        NVIDIA DKMS package
rc  nvidia-driver-460                       460.67-1pop0~1616430777~20.10~71e1ad1                                amd64        NVIDIA driver metapackage
ii  nvidia-driver-470                       470.57.02-1pop0~1627044105~21.04~f9815ed                             amd64        NVIDIA driver metapackage
rc  nvidia-kernel-common-460                460.73.01-1pop0~1620243205~20.10~9a91ef9                             amd64        Shared files used with the kernel module
ii  nvidia-kernel-common-470                470.57.02-1pop0~1627044105~21.04~f9815ed                             amd64        Shared files used with the kernel module
ii  nvidia-kernel-source-470                470.57.02-1pop0~1627044105~21.04~f9815ed                             amd64        NVIDIA kernel source package
ii  nvidia-settings                         470.57.01-0ubuntu0.21.04.1                                           amd64        Tool for configuring the NVIDIA graphics driver
ii  nvidia-utils-470                        470.57.02-1pop0~1627044105~21.04~f9815ed                             amd64        NVIDIA driver support binaries
ii  screen-resolution-extra                 0.18build2                                                           all          Extension for the nvidia-settings control panel
ii  xserver-xorg-video-nvidia-470           470.57.02-1pop0~1627044105~21.04~f9815ed                             amd64        NVIDIA binary Xorg driver
 ~  

Re-Install the driver package by installing the latest nvidia-driver-xxx package to your system with the following command:

sudo apt install nvidia-driver-xxx

Accept the additional packages and after the installation, reboot your system. You should now have the correct output when you run the glxinfo command in the first paragraph.

glxinfo|egrep "OpenGL vendor|OpenGL renderer"

Example output:

~  glxinfo|egrep "OpenGL vendor|OpenGL renderer"
OpenGL vendor string: NVIDIA Corporation
OpenGL renderer string: NVIDIA GeForce GTX 1050 Ti with Max-Q Design/PCIe/SSE2
 ~ 

Screencasts on Ubuntu

For a colleague I just made a screencast of a problem we were discussing. I was trying to use the minimum amount of tools in Gnome/Ubuntu and wanted to share the proces with you all.

Goal: Create a screencast recording of my desktop with narrated (recorded) audio at the same time.

If you are very curious and want to see the result immediately, look at the video below:

“Apache Kafka files store data without encryption”

I use Pop!_OS 21.04, which is based of Ubuntu. In Pop!_OS I use Gnome with Wayland.
All the instructions below will work with Ubuntu and any Ubuntu based distribution as well.

This howto is divided in several sections:

  • Desktop (Video) recording
  • Audio recording
  • Putting the video and audio recording together

Additional tools used in the video:

  • Show the webcam (guvcview)
  • Written annotation on a page (xournal++)
  • Written annotation on screen (Draw On You Screen)

Video recording:

Since I want to use the most simple method, my approach is to use the built-in screen cast ability in Gnome.

Press Ctrl+Alt+R to start the screen cast recording.

When the recording is in progress, you see a red filled circle in your notification area:

When you press Ctrl+Alt+R again, the circle disappears and the recording is saved to the Videos folder in your home folder:

Note: This video file is without audio.

Audio recording

As the most simple solution I used the builtin Sound Recorder in Gnome:

Press “Record” to start your recording and click “Done” when you would like to end your recording. You can see me pressing the buttons in the recorded screen cast.

Important: You need to press the screencast start keyboard command Ctrl+Alt+R and the Record button at the same time, or your video and audio will be out of sync.

When you stop the recording, the Ogg Vorbis file will be saved in the default location in your home folder, which is: ~/Recordings.

Combine the video and audio

Right now you have two separate files, not really useful when they are not combined.

To combine them, I used the following command:

ffmpeg -y -i Videos/Screencast\ from\ 05-12-2021\ 02:51:06\ PM.webm -i Recordings/Clip\ 5 -map 0:v -map 1:a -c copy file.webm

Explanation of the command:

ffmpeg
 this is the command itself
-y
 overwrite output files without asking
-i {file location}
 input file + file location
 Note that there are two input files (video & audio)
-map
 Designate one or more input streams as a source for the output file. The number is the first (0) or second (1) input file. The map itself shows what we are using in the output. In this case it is 0:v to use the video for the first input file and 1:a to use the audio of the second input file
-c copy file.webm
 Specify the output file, in this case it will be copied to file.webm in the same directory as where you run the command.

The result is what happens here:

GIF recording of putting the video and audio together (Recorded with Peek GIF Recorder)

This is the minimum necessary to create a screencast!

For example, you can send this webm video output file to people over email / file share / whatever you’d like. You can also upload it to Youtube, which can process the output file and you are done to spread some knowledge!

Add some extra spice to your screencast

To add some engagement with whoever will view your screencast, you can show your own webcam in the screen. You can use the built in program Cheese

Another option is to use guvcview, which has a cleaner interface (no buttons on the webcam output window)

Install with sudo apt install guvcview , start the program with guvcview.

Then select your video input device. You can minimize the settings pane so that you’re left with only the video of your webcam for the introduction/conclusion of your video.

Annotation

For annotation I use Xournalpp (xournal++) which helps me in drawing with my XP-Pen drawing tablet. I think it makes the screen cast a bit more entertaining compared to showing plain text but you can decide for yourself.

You can also use a Gnome Extension called Draw on You Screen by Abakkk, with this extension you can do annotations directly on the screen and thus show your thoughts / comments / pointers on screen directly.

Note: I don’t use this extension in my example video though.

Conclusion

I hope this blog post helps you in creating screen casts with the simplest possible tools. Good luck and hope to see your videos around on the web!

Update HP Proliant Microserver BIOS without Windows

I wanted to update my MicroServer Gen8 bios to the latest version but the download site on HPE only showed .EXE files. Since I’m only running Linux on my machines it was not possible to execute that file.

You can however update the BIOS via ILO (Integrated Lights Out) if you extract the BIOS file from the executable.

First download the .EXE from the HPE site: https://support.hpe.com/hpsc/swd/public/detail?swItemId=MTX_e9bfdf20809a426cb16ef9cd81

(Currently the latest version is SP99427.exe. If you want to be sure you’re using the latest BIOS then click the tab “Revision History” to see if there are newer BIOS files available)

Extract the contents of the executable. Have a look at the directory structure below and extract the file marked "CPQJ06xx.xxx"(where “x” might change depending on versions)

.
├── How to Use.txt
├── logo.gif
├── README.1ST
├── rev_hist.txt
├── ROMPaq Flat Files
│   ├── CPQJ0613.684
│   ├── CPQSRVR2.CPU
│   ├── README.1ST
│   ├── Readme.txt
│   └── ROMPAQ.EXE
├── ROMPaq USB Key
│   ├── CPQJ0613.684
│   ├── CPQSRVR2.CPU
│   ├── HPEUSB.exe
│   ├── Readme.txt
│   └── ROMPAQ.EXE
├── Start_files
│   ├── colorschememapping.xml
│   ├── filelist.xml
│   └── themedata.thmx
└── Start.htm
3 directories, 18 files

Then log in to ILO and navigate to the page “Firmware” via the Menu Option “Administrator”

At the bottom of the page select “Browse” to select the CPQJ06 file and then click Upload.

Let the upload complete and reboot your Microserver. When you start the microserver it displays the BIOS version and date in the first line.

You can also see the version in the ILO overview page.

Create a Java path entry for all users

I install Java on all my machines and used to add the java path and home variables to the user (or my user) bash profile but every time I added another user this is a manual step.

Until I found this small trick. Add a system wide profile path setting by creating a file in:

/etc/profile.d/filename

All files in profile.d are added to every users login. Much cleaner than adding it to every user’s profile.

This is the contents of my file:

/etc/profile.d/java-path.sh

export JAVA_HOME="/opt/java"
export PATH=$JAVA_HOME/bin:$PATH

These variables are set next time you log in with any user on that system.

Install Python without Admin rights (windows)

Appearently it’s quite simple to install python on a windows machine, even if you don’t have admin rights.

Remember, this only works if you downloaded the MSI installer version.

Open a command line in the same folder where you downloaded the python installer (Click here for the Python download page)

Execute this command on the CLI:

msiexec /a python-2.7.16.amd64.msi /qb TARGETDIR=C:\python27

Replace the version with your downloaded version