One of the key features in go is simplicity. As a result there are a number of utilities and data structures that are common in other high-level languages that do not come with the go stdlib.
One of them is a stack. Following is a very simple implementation of a stack that uses a slice to store the data.
The following is an implementation of a simple stack that takes any kind of pointer.
type Stack[T any] struct
→ Continue reading “Implementing a Stack in Go”
The GNU diff command on most Linux and UNIX systems will diff the contents of two files. With Bash, you can, using process substitution, take the output of any arbitrary command and process its input, or output, as a file descriptor. In this way, you can then use diff against the output of two commands as follows
diff <(cmd1) <(cmd2)
cmd2 will appear as a file name/file descriptor. The
< character indicates that the file descriptor should → Continue reading “Diffing the output of two commands”
If you want to dynamically define and export variable names in Bash here is the TLDR;
# Define the name of the variable
# Declare it and export it
declare -gx "$key"="some-value"
To then access that value via a dynamically generated variable name
# Create a variable that contains the variable name
# Read the value
Read the man page for
declare for more details and read this article for a really good explanation and further examples.→ Continue reading “Declaring, Exporting, and Reading Dynamic Variables in Bash”
Sometimes you will want to ensure that a file is sourced instead of executed. This ensures, among other things, that any environment variables that the script defines remain in your current shell after the script completes.
To do so, use the following to check whether the file was sourced or run in a sub-shell
(return 0 2/dev/null) && sourced=1 || sourced=0
Bash allows return statements only from functions and in a scripts top level scope IF it → Continue reading “How to check if a file is sourced in Bash”
I have no idea why, but for some reason I always have a hard time remembering the exact syntax for find when I want to prune some list of directories from a search.
Let’s say that you want to execute a find in a directory where there are a lot of
.git directories and you don’t want to search through the guts of the repo directories. With the following command we specify the prune predicate ahead of the search for → Continue reading “Pruning directories from find”
The TLDR; is to first use tr to replace all occurrences of any horizontal whitespace character with a single space, and then squeeze down any number of spaces to a single space and then define the delimiter for cut as a single space. The following example assumes that you want to see from the 5th column to the end of the line.
<do-something-to-generate-input| tr '[:blank:]' ' ' | tr -s ' ' | cut -d ' ' -f5-
The → Continue reading “Using cut with a delimiter of any amount of whitespace”
I finally was able to get Visual Studio Code set-up correctly to run and debug unit and integration tests for a Python 3.8 project that I am working on (I’ll add a link to that post here once it is up).
After making some changes to the code and adding a test I got the following error when trying to debug the test:
Test result not found for: ./mylibs/integration_tests/myclient_integration_test.py::MyClientIntegrationTest::test_happy_path
? An odd error message, to be sure.
After a little → Continue reading “VS Code “Test result not found for:” When Running Tests for a Python Project [SOLVED]”
The following should work with just about any version of Python. I am using it to compile, currently 3.10.x, on distros where those packages are not readily available for installation. The following is a quick how to on getting it compiled under both RedHat/CentOS/Almalinux and Debian based systems.
Download the Tarball for the Version You Want To Install
tar.gz archive for the version that you want to install from here. Verify the download and then save the → Continue reading “Compiling Python Under Linux”
I recently learned about the Bash built-in fc. It is a great tool that enables you to edit and re-execute commands from your bash history.
Oftentimes there is a command in your history that instead of just grepping through the history and then re-executing as-is you’ll want to make a modification or two. With fc you can first edit it in your favorite editor and then when closing the editor fc will execute the command.
For me, vim is my → Continue reading “Using fc to Edit and Re-execute Bash Commands”
I regularly use Python Invoke and Fabric for the automation of various tasks; from deploying code to developing my own set of tools for various projects. Following is an example on how to write a
launch.json launch configuration for vscode so that you can step through the tasks.py code and debug it.
Assuming that you have created a virtual environment and pip installed invoke into it. And, assuming that you have defined a task in your tasks.py file as follows:→ Continue reading “Creating a Launch Config in VSCode to Debug a Python Invoke Script”