patch/git apply – Hunk #hunkNumber FAILED at lineNumber (different line endings).

This error commonly issues with .patch files when the patch and target file use different line ending types (i.e. Windows/DOS/CLRF vs. Unix/LF):

touch .build/x64/status/clone
cd .build/x64/src/sshfs && for f in /cygdrive/c/github.com/sshfs-win/patches/*.patch; do patch --binary -p1 <$f; done
patching file sshfs.c
Hunk #1 FAILED at 365 (different line endings).

The unix2dos / dos2unix and commands can be used to perform conversion. One way to determine the line endings type is to open the files in a text editor like Notepad++ which can indicate the line endings type. But this can also be achieved using the unix2dos command’s -i / --info option:

dos2unix -i 00-passwd.patch
      36       0       0  no_bom    text    00-passwd.patch

The 36 indicates the number of lines that use DOS-style line endings. Here is a wrapper python script for this which prints out the line endings type:

import os
import sys
import re

if __name__ == '__main__':
    filename = sys.argv[1]
    infooutput = os.popen(f'dos2unix -i {filename}').read().strip()
    doslines = int(re.split(r'\s+', infooutput)[0])
    line_ending_type = 'Windows/DOS (CR LF)' if doslines > 0 else 'Unix (LF)'
    print(line_ending_type)Code language: JavaScript (javascript)

X410 – run WSL gui applications as native Windows applications

Software developers who work on Windows have likely heard of WSL, which stands for the Windows Subsystem for Windows. Essentially, it is a way to run Linux distributions within Windows somewhat like running a virtual machine (VM) but more seamless – or akin to running a Docker container. WSL provides support for GUI applications out-of-the-box with WSLg. The important thing to note about WSLg is that it is implemented using the RDP protocol, so GUI applications are essentially run via an RDP process running on the host Windows machine. Due to this implementation, the performance of GUI applications running on WSLg will not perform as well as would a native Windows application or compared to running the application on a regular Linux installation.

There are some really cool uses of WSL even outside of software development that may be useful for users who are somewhat technical. Some of these are from the interoperability provided with WSL:

  • Windows drive C:\ is mounted in WSL at /mnt/c
  • WSL filesystems can be accessed at \\wsl.localhost and can be mounted to network drives (for example I have \\wsl.localhost\Arch mounted as L:\)

Windows provides the ability to mount network drives using FTP or SMB – however, it doesn’t provide support natively for mounting network locations using SSH/SFTP. Linux has a FUSE filesystem called sshfs. With WSL, this means network locations can be mounted and accessed from Windows. Similarly, Windows does not natively support mounting external drives containing ext4 formatted partitions.

X410 is a really cool alternative to WSLg, which allows X-Window GUI apps to run like any other Windows application. Note that X410 does require the purchase of a license. The license I purchased is for perpetual for the version when I purchased, though updating to newer versions of X410 will require an additional purchase. Here is an example of Caja running in X410: Caja File Manager in X410

Notice how the Window appears like a normal Windows application would. For comparison, here is what Caja looks like in WSLg: Caja File Manager in WSLg

While it may not look like much of a difference, the advantage of X410 is not about the appearance but performance. The UI responsiveness running X410 is noticeably better than running in WSLg.

convert an .svg icon to .ico that contains all icon sizes

Requirements:

param(
    [Parameter(Mandatory=$true,Position=0)]
    [Alias("s")]
    $SvgFilename,
    [Parameter(Mandatory=$false,Position=1)]
    $IcoFilename = ""
)
if (-not [System.IO.Directory]::Exists("tmp")) {
    New-Item -Type Directory -Path tmp
}
$sizes = (16, 20, 24, 32, 40, 48, 64, 128, 256)
$filename = [System.IO.Path]::GetFileNameWithoutExtension($SvgFilename)

for ($i = 0; $i -lt $sizes.length; $i++) {
    $size = $sizes[$i];
    Write-Host $sizes[$i]
    Write-Host $filename
    inkscape -z -e tmp/${filename}_${size}.png -w $size -h $size -d 300 $SvgFilename
}

if ($IcoFilename.length -eq 0) {
    $IcoFilename = $SvgFilename.Replace(".svg", ".ico")
}
if (-not $IcoFilename.EndsWith(".ico")) {
    $IcoFilename = "${IcoFilename}/${filename}.ico"
}
Write-Host "Writing $IcoFilename"
convert tmp/${filename}_16.png tmp/${filename}_20.png tmp/${filename}_24.png tmp/${filename}_32.png tmp/${filename}_40.png tmp/${filename}_48.png tmp/${filename}_64.png tmp/${filename}_128.png tmp/${filename}_256.png ${IcoFilename}
Remove-Item -Path tmp -Recurse
Write-Host "Successfully wrote $IcoFilename"Code language: PHP (php)

Usage:

svg2ico.ps1 device-harddisk-usb.svg device-harddisk-usb.icoCode language: CSS (css)

MSBuild / dotnet – automatically update .csproj version with git commit/revision number via build targets

First, create a property called _VersionPrefix in your .csproj:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Library</OutputType>
    <TargetFrameworks>netstandard2.1</TargetFrameworks>
<strong>    <_VersionPrefix>1.3.1</_VersionPrefix></strong>
  </PropertyGroup>
Code language: HTML, XML (xml)

Next, you’ll need to install the dotnet-setversion global tool:

dotnet tool install -g dotnet-setversion

Finally, add the following build targets:

  <Target Name="SetGitVersion" BeforeTargets="PreBuildEvent">
    <Exec Command="git log -n 1 --format=%25%25h -- ." ConsoleToMSBuild="true">
      <Output TaskParameter="ConsoleOutput" PropertyName="GitCommit" />
    </Exec>
    <Exec Command="git rev-list --count $(GitCommit)" ConsoleToMSBuild="true">
      <Output TaskParameter="ConsoleOutput" PropertyName="GitRevisionNumber" />
    </Exec>
  </Target>
  
  <Target Name="UpdateCsprojVersion" AfterTargets="SetVersionSuffix">
    <Exec Command="setversion $(_VersionPrefix)-r$(GitRevisionNumber).$(GitCommit)"></Exec>
  </Target>
</Project>Code language: HTML, XML (xml)

Sysinternals Suite for Windows: a collection of CLI and GUI system utilities

Sysinternals Suite is a set of command-line and GUI tools for Windows.

Sysinternals Suite - Process Monitor UI

The default download (for x64/x86 CPUs) contains both 64- and 32-bit binaries. If you are using a 64-bit machine, you can run the following PowerShell script in your directory of the extracted zip files to have the default .exe file be a symlink to the 64-bit version rather than the 32-bit executable:

$files = (ls)
$x64s = @{}
$x86s = @{}
$x64sTox86s = @{}

for ($i = 0; $i -lt $files.Length; $i++) {
    $filename = $files[$i].Name
    if ($filename.EndsWith("64.exe")) {
        $x64s[$filename] = $true
    } elseif ($filename.EndsWith(".exe")) {
        $x86s[$filename] = $true
    }
}

foreach ($x64 in $x64s.Keys) {
    $x86 = $x64.Replace("64.exe", ".exe")
    if ($x86s.ContainsKey($x86)) {
        $x64sTox86s[$x64] = $x86
    }
}

foreach ($x64 in $x64sTox86s.Keys) {
    $x86 = $x64sTox86s[$x64]
    Remove-Item -Path $x64
    New-Item -Type SymbolicLink -Path $x64 -Target $x86
}Code language: PHP (php)

GCC / make – pcdPointXYZRGB2txt.cpp:12:24: error: ‘split’ is not a member of ‘boost’

If make fails due to

[ 13%] Building CXX object CMakeFiles/treeseg.dir/src/treeseg.cpp.o
./treeseg/src/pcdPointXYZRGB2txt.cpp: In function ‘int main(int, char**)’:
./treeseg/src/pcdPointXYZRGB2txt.cpp:12:24: error: ‘split’ is not a member of ‘boost’
   12 |                 boost::split(tmp1,args[i],boost::is_any_of("/"));
      |                        ^~~~~
./treeseg/src/pcdPointXYZRGB2txt.cpp:13:24: error: ‘split’ is not a member of ‘boost’
   13 |                 boost::split(tmp2,tmp1[tmp1.size()-1],boost::is_any_of("."));
      |                        ^~~~~
make[2]: *** [CMakeFiles/pcdPointXYZRGB2txt.dir/build.make:79: CMakeFiles/pcdPointXYZRGB2txt.dir/src/pcdPointXYZRGB2txt.cpp.o] Error 1
make[1]: *** [CMakeFiles/Makefile2:578: CMakeFiles/pcdPointXYZRGB2txt.dir/all] Error 2

This can be resolved by including the required header (source: boost::split in C++ library | GreeksForGeeks):

#include <boost/algorithm/string.hpp>

change Visual Studio Code application font

Changing the application font (not the text editor font, which can already be changed in settings) in Visual Studio Code can be done via an extension called Custom CSS and JS Loader. After installing the extension, edit/add the following line to settings.json:

"vscode_custom_css.imports": ["file:///C:/Users/nickcummins/Documents/VSCode-Custom.css"],

replacing nickcummins with your username. Then, create this VSCode-Custom.css on your filesystem containing the following:

.windows,
.monaco-workbench.windows {
    font-family: Arial;
}

.monaco-workbench .part > .content {
	font-size: 0.9em;
}

replacing Arial with the preferred font. Finally, re-open VS Code running as Administrator. Search for the command as shown in the screenshot, and click on it.

You’ll be prompted to restart VS Code. You should notice the new font being used when it re-opens. You can close the elevated instance of VS Code and re-open it as a normal user. 

archlinux-pkgbuilds – Arch Linux PKGBUILDs

I maintain a set of PKGBUILDs for the Arch Linux distro in a public GitHub repository: archlinux-pkgbuilds. Many of these are modified versions from the official Arch package repositories or from AUR packages, however some are not found in either. The modifications for existing packages are usually small fixes for issues building with the existing version or to build configured with different CMake variables.

Many of the packages are GIS applications, including

Some of the PKGBUILDs have not been built in several years. I will periodically update this list with recently built packages that are not available in the official repos or AUR.