Linux

Plank is a popular application launcher dock in Linux. By default, most application desktop entries do not provide any additional actions. Say we want to add an open ‘new window’ action to our desktop entry for pkgbrowser:

/usr/share/applications/pkgbrowser.desktop

Our desktop entry file looks as follows:

[Desktop Entry]
Name=PkgBrowser
GenericName=Package Browser
Comment=A utility for browsing pacman databases and the AUR
Exec=pkgbrowser
Terminal=false
Type=Application
Icon=pkgbrowser
StartupNotify=false
Categories=Qt;System;

Simply add the following to the end of the file. Of course, if your desktop entry already has a defined Actions property, you’ll want to add this new-window to it.

Actions=new-window;

[Desktop Action new-window]
Name=New Window
Exec=pkgbrowser

Now, right-clicking the desktop entry will appear as follows:

By default, any desktop entries that come from packages for your Linux distro will be overwritten during a package update. To prevent this from happening, you can made the file read-only using chattr:

sudo chattr +i /usr/share/applications/pkgbrowser.desktop

If the gcc version being used is incompatible with cuda version, there will be errors such as:

[ 68%] Building NVCC (Device) object src/nvtt/CMakeFiles/cuda_compile_1.dir/cuda/cuda_compile_1_generated_CompressKernel.cu.o
/usr/include/c++/10.1.0/type_traits(1396): error: type name is not allowed

/usr/include/c++/10.1.0/type_traits(1396): error: type name is not allowed

/usr/include/c++/10.1.0/type_traits(1396): error: identifier "__is_same_as" is undefined

3 errors detected in the compilation of "/home/nick/Code/Git/github.com/nvidia-texture-tools/src/nvtt/cuda/CompressKernel.cu".
CMake Error at cuda_compile_1_generated_CompressKernel.cu.o.Release.cmake:280 (message):
  Error generating file
  /home/nick/Code/Git/github.com/nvidia-texture-tools/cmake-build-release/src/nvtt/CMakeFiles/cuda_compile_1.dir/cuda/./cuda_compile_1_generated_CompressKernel.cu.o


make[2]: *** [src/nvtt/CMakeFiles/nvtt.dir/build.make:85: src/nvtt/CMakeFiles/cuda_compile_1.dir/cuda/cuda_compile_1_generated_CompressKernel.cu.o] Error 1
make[1]: *** [CMakeFiles/Makefile2:721: src/nvtt/CMakeFiles/nvtt.dir/all] Error 2
make: *** [Makefile:183: all] Error 2

See discussion on GitHub: CUDA Build error on Arch Linux and CUDA Compilers – nvcc compatibility chart.

This can be resolved by using an earlier version of GCC which is compatible with the CUDA version. In my example setting the following CMake variable resolved the issue:

	-DCUDA_HOST_COMPILER=/usr/bin/gcc-9

The default version of gcc in the Arch Linux repositories is now gcc10:

➜  ~ pacman -Qo /usr/bin/c++
/usr/bin/c++ is owned by gcc 10.1.0-2

This can result in errors during linking while building packages, such as:

[ 75%] Linking CXX executable ../../../../../bin/sst_conn_tool
/usr/bin/ld: ../../../../../lib/libadios2_core.so.2.6.0: undefined reference to `int adios2::format::DataManSerializer::GetData<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<unsigned long, std::allocator<unsigned long> > const&, std::vector<unsigned long, std::allocator<unsigned long> > const&, unsigned long, std::vector<unsigned long, std::allocator<unsigned long> > const&, std::vector<unsigned long, std::allocator<unsigned long> > const&)'
/usr/bin/ld: ../../../../../lib/libadios2_core.so.2.6.0: undefined reference to `int adios2::format::DataManSerializer::GetData<float>(float*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<unsigned long, std::allocator<unsigned long> > const&, std::vector<unsigned long, std::allocator<unsigned long> > const&, unsigned long, std::vector<unsigned long, std::allocator<unsigned long> > const&, std::vector<unsigned long, std::allocator<unsigned long> > const&)'

This issue can be resolved by compiling with an earlier version of gcc:

➜  ~ pacman -Qo /usr/bin/g++-9
/usr/bin/g++-9 is owned by gcc9 9.3.0-3

Setting these CMake variables will result in using the gcc9 version of gcc, g++, gcc-ar, and gcc-ranlib:

        -DCMAKE_CXX_COMPILER=/usr/bin/g++-9 \
        -DCMAKE_CXX_COMPILER_AR=/usr/bin/gcc-ar-9 \
        -DCMAKE_CXX_COMPILER_RANLIB=/usr/bin/gcc-ranlib-9 \
        -DCMAKE_C_COMPILER=/usr/bin/gcc-9 \
        -DCMAKE_C_COMPILER_AR=/usr/bin/gcc-ar-9 \
        -DCMAKE_C_COMPILER_RANLIB=/usr/bin/gcc-ranlib-9 \

Notepad++ is undoubtedly one of the most popular code/text editors available for Windows. While it does not run natively on Linux (or macOS), many have ran it successfully with Wine. There is also a clone of Notepad++ called Notepadqq that runs natively on Linux that is written using the well-known cross-platform UI library Qt.

Screenshot tools for Linux and macOS generally produce image files in the .png file format. PNG is a lossless compression format, meaning that it can be compressed without losing quality, which is unlike another commonly used image format, JPG. There are 3 command-line tools which can be used to compress PNG files, pngout, optipng, and advpng.

➜  pngout terminator-terminal-window.png 
 In:   11405 bytes               terminator-terminal-window.png /c6 /f5
Out:    8790 bytes               terminator-terminal-window.png /c2 /f5
Chg:   -2615 bytes ( 77% of original)
➜  optipng -o7 terminator-terminal-window.png 
** Processing: terminator-terminal-window.png
800x266 pixels, 3x8 bits/pixel, RGB+transparency
Input IDAT size = 8715 bytes
Input file size = 8790 bytes

Trying:
  zc = 9  zm = 9  zs = 0  f = 0		IDAT size = 8140
  zc = 9  zm = 8  zs = 0  f = 0		IDAT size = 8140
                               
Selecting parameters:
  zc = 9  zm = 8  zs = 0  f = 0		IDAT size = 8140

Output IDAT size = 8140 bytes (575 bytes decrease)
Output file size = 8215 bytes (575 bytes = 6.54% decrease)

➜  advpng -z4 terminator-terminal-window.png 
        8215        7232  88% terminator-terminal-window.png
        8215        7232  88%

In the past, I’ve written about different remote desktop products/solutions, including NoMachine for remoting into traditional desktop machines, but also a few alternatives for accessing and controlling Android devices from a computer. Today I’d like to mention TeamViewer, a product free for non-commercial use that supports computer to computer, Android to computer, and computer to Android connections.

The following screenshots were taken on a macOS Sierra machine remotely logged onto a rooted Samsung Galaxy S4 Android tablet.

  1. Download the SDelete program provided by Microsoft onto your Windows Guest machine.
  2. Clean up unnecessary files and programs. One useful utility is WinDirStat.
  3. Run the following command in the terminal to write zeroes over unused disk storage in your Windows guest:
    sdelete64 -z c:
  4. Shut down your VM and run the following command on your Windows Guest VDI:
    VBoxManage modifyhd /misc/virtualbox-vms/Windows10/Windows10LargeDisk.vdi
  5. Create a new VDI with the new desired maximum size:
    VBoxManage createhd --filename /misc/virtualbox-vms/Windows10/Windows10Disk.vdi --size 92160
  6. Clone the existing VDI into the newly allocated one:
    VBoxManage clonehd /misc/virtualbox-vms/Windows10/Windows10LargeDisk.vdi /misc/virtualbox-vms/Windows10/Windows10Disk.vdi --existing

  1. Enroll in Apple’s Beta Software Program.
  2. Download a fresh copy of VMware Workstation Player for Windows or Linux from the official VMware site. The free trial of this product has no expiration if used for non-commercial purposes.
  3. You’ll need to unlock your installation of VMware to use Mac operating system as a guest following these instructions (external link).
  4. On a computer running an official/genuine instance of OS X, download macOS Sierra from the App Store:
    App Store - macOS Sierra
  5. Once the download completes, open the Terminal application, and either save a new file with the following contents,
     #!/bin/bash
    # Mount the installer image
    hdiutil attach /Applications/Install\ macOS\ Sierra.app/Contents/SharedSupport/InstallESD.dmg -noverify -nobrowse -mountpoint /Volumes/install_app
    
    # Create the macOS-Sierra Blank ISO Image of 7316mb with a Single Partition - Apple Partition Map
    hdiutil create -o /tmp/macOS-Sierra.cdr -size 7316m -layout SPUD -fs HFS+J
    
    # Mount the macOS-Sierra Blank ISO Image
    hdiutil attach /tmp/macOS-Sierra.cdr.dmg -noverify -nobrowse -mountpoint /Volumes/install_build
    
    # Restore the Base System into the macOS-Sierra Blank ISO Image
    asr restore -source /Volumes/install_app/BaseSystem.dmg -target /Volumes/install_build -noprompt -noverify -erase
    
    # Remove Package link and replace with actual files
    rm /Volumes/OS\ X\ Base\ System/System/Installation/Packages
    cp -rp /Volumes/install_app/Packages /Volumes/OS\ X\ Base\ System/System/Installation/
    
    # Copy macOS Sierra installer dependencies
    cp -rp /Volumes/install_app/BaseSystem.chunklist /Volumes/OS\ X\ Base\ System/BaseSystem.chunklist
    cp -rp /Volumes/install_app/BaseSystem.dmg /Volumes/OS\ X\ Base\ System/BaseSystem.dmg
    
    # Unmount the installer image
    hdiutil detach /Volumes/install_app
    
    # Unmount the macOS-Sierra ISO Image
    hdiutil detach /Volumes/OS\ X\ Base\ System/
    
    # Convert the macOS-Sierra ISO Image to ISO/CD master (Optional)
    hdiutil convert /tmp/macOS-Sierra.cdr.dmg -format UDTO -o /tmp/macOS-Sierra.iso
    
    # Rename the macOS-Sierra ISO Image and move it to the desktop
    mv /tmp/macOS-Sierra.iso.cdr ~/Desktop/macOS-Sierra.iso

    or run

    curl https://www.nickmcummins.com/make-macos-sierra-iso.sh > /tmp/make-macos-sierra-iso.sh

    and then execute it by running sudo chmod +x /tmp/make-macos-sierra-iso.sh && /tmp/make-make-macos-sierra-iso.sh. Once completed, you should see a file named macOS-Sierra.iso on your desktop.

  6. Now boot up VMware Player and create a new virtual machine using the File dialog. Using the iso disk image we just created, and with macOS 10.12 selected as the guest os, finish the setup for your new image.
    Guest Operating System - Select macOS 10 12
  7. You’ll need to erase the virtual hard disk medium as seen in the following screenshots. DiskUtility - VMware Virtual STA hHard Drive
    DiskUtility - Erase Hard Drive confirmation
  8. Now you will be able to proceed with the installation. Once completed, you should be all ready to enjoy your new macOS Sierra vm!
    Installation macOS Sierra
    macOS Sierra Screenshot

This basically involves two steps:

  1. Client-side support, aka adding the required decoding libraries on the local computer. See official documentation: Enabling the H.264 codec on the NoMachine client host. Here is an example of following the steps on my Macbook Air:
    
    brew update
    brew install ffmpeg && brew upgrade ffmpeg
    cd /usr/local/Cellar/ffmpeg/3.0.2/lib
    sudo cp libavcodec.dylib /Applications/NoMachine/Contents/Frameworks/lib
    sudo cp libavutil.dylib /Applications/NoMachine/Contents/Frameworks/lib
    

Setting a custom resolution to that of the guest monitor

Say you have two monitors physically connected to the server, supporting by default maximum resolutions of 1440x900 and 1600x900. If you are logging in to the remote server from a machine that has a larger display, it may be difficult to add the new resolution. I have attempted to follow dozens of similar instructions I found online, with little luck. The only thing that worked for me seems like a hack, but it works.

➜  xrandr  | grep -i primary 
DVI-D-0 connected primary 1440x900+0+0 (normal left inverted right x axis y axis) 410mm x 257mm

We’ll be using the scale option of randr to change our resolution in this case, i.e. (x resolution)(x scale factor) = (desired x resolution); (y resolution)(y scale factor) = (desired y resolution). You’ll want to use at least a few decimal places for non-truncating decimal numbers unless your scaling factor is a rational number:

xrandr --output DVI-D-0 --scale 1.3333333x1.33333333

Afterwards, you should see this represented if you run the initial xrandr command above.

➜ xrandr  | grep -i primary 
DVI-D-0 connected primary 1920x1200+0+0 (normal left inverted right x axis y axis) 410mm x 257mm