Scientific Computing

GDB debugger for macOS Apple Silicon

GDB debugger is not yet readily available for macOS with Apple Silicon CPU. It has long been possible to use a virtual machine with Linux for ARM64 to run GDB within the VM. The CLion package provides GDB, but with caveats such as using a particular compiler and libstdc++. What happens for us is when trying to use GDB, it doesn’t work:

gdb ./myexe
r

Don’t know how to run. Try “help target”.

In general, currently to use GDB on an Apple Silicon Mac, it seems a Linux VM is the best option–hopefully this changes.

Easy HDF5 / NetCDF4 / HDF4 Matlab interface

Using HDF5 / NetCDF4 / HDF4 from any language can be intimidating if directly using the low-level API. Interfaces have sprung up for popular languages that make HDF5 trivially easy to use, such as Python h5py.

The stdlib for Matlab provides functions making HDF5, NetCDF4, and HDF4 much easier to use in Matlab.

The “h5*” functions are for HDF5, “nc*” functions are for NetCDF4, and “h4*” functions are for HDF4. The functions are polymorphic, typecasting user data.

The h5*, nc*, and h4* functions work very similarly. For simplicity, we only show the h5* functions.

  • h5save() save a variable to a file
  • h5variables() list all the variable in a file
  • h5size() get the size (shape) of a variable in a file
  • h5exists() check if a variable exists in a file

C macro __CLASSIC_C__

The C macro __CLASSIC_C__ is defined when the compiler is in pre-ANSI (K&R) mode. This is a rather uncommon scenario. It might be used in retrocomputing with very old and unmaintained compilers such as the 1990s Bruce Evans’ C compiler (bcc).

#include <stdio.h>

int main() {

#if defined(__CLASSIC_C__)
  printf("K&R C\n");
#elif defined(__STDC__)
  printf("ANSI C\n");
#else
  printf("Unknown C\n");
#endif

return 0;
}

Reference: Compiler Macros wiki

Windows Command Prompt instant error on open

A botched program install, upgrade, or uninstall such as Anaconda Python can make a Windows registry mis-entry that causes many commands to fail. Simply trying to run “cmd.exe” COMSPEC instantly fails with:

& was unexpected at this time

or

Process exited with code 1

If this message occurs when just opening a new Command Prompt window, the problem may be in the Windows Registry. Check Registry Editor values:

HKCU\Software\Microsoft\Command Processor\AutoRun

and

HKLM\Software\Microsoft\Command Processor\AutoRun

Example 1

A system had a bad Autorun value:

if exist

This was corrected by emptying the Autorun value (or deleting the Autorun key).

Example 2

A system had a bad Autorun value:

if exist & if exist "%USERPROFILE%\miniconda3\condabin\conda_hook.bat" "%USERPROFILE%\miniconda3\condabin\conda_hook.bat"

It was fixed by correcting to:

if exist "%USERPROFILE%\miniconda3\condabin\conda_hook.bat" "%USERPROFILE%\miniconda3\condabin\conda_hook.bat"

C++ nodiscard attribute

C++17 and C23 added the [[nodiscard]] attribute to indicate that the result of a function call should not be ignored. However, a C++26 proposal to remove [[nodiscard]] from the language standard is under consideration.

Example: annotate function declaration in the header file with [[nodiscard]] attribute.

[[nodiscard]] int one();
int one() { return 1; }

GNU Data Language (GDL) GUI

GNU Data Language (GDL) can use GDLDE Workbench GUI for graphical development.

Download and install GDL.

The Windows installer includes GDLDE Workbench: gdlsetup-Windows-x86_64-standard.exe Simply install and look in Windows Start menu for “GDL Workbench”.

For macOS use gdl-macOS-x86_64-standard.dmg or build GDL from source.

For Ubuntu Linux:

apt install gnudatalanguage

Download and extract GDLDE for Linux.

Install JDK

Install JDK by:

  • Windows: winget install Microsoft.OpenJDK.21 (find exact version by winget search Microsoft.OpenJDK).
  • macOS: brew install openjdk
  • Linux: apt install default-jdk

Restart Terminal, ensure that echo $JAVA_HOME or PowerShell echo $env:JAVA_HOME is not empty.

Eliminate Python __pycache__ directories

Python can put all Python .pyc cache files under one system-wide directory by the PYTHONPYCACHEPREFIX environment variable.

  • Windows: set environment variable PYTHONPYCACHEPREFIX to %TEMP%
  • Linux: in ~/.profile add export PYTHONPYCACHEPREFIX=${TMPDIR}
  • macOS: in ~/.zshrc add export PYTHONPYCACHEPREFIX=${TMPDIR}

Pycache .pyc files can be set to NOT write anywhere with the PYTHONDONTWRITEBYTECODE environment variable.

  • Windows: set environment variable PYTHONDONTWRITEBYTECODE to 1
  • Linux: in ~/.profile add export PYTHONDONTWRITEBYTECODE=1
  • macOS: in ~/.zshrc add export PYTHONDONTWRITEBYTECODE=1

Python 3.12 Apple App Store conflict

LWN.net reports on changes to Python 3.13 urllib standard library. It was deduced that Apple rejected Python 3.12 apps due to a string in the Python stdlib that was rejected, regardless of code execution. There naturally was some very good discussion linked to in the LWN.net article that illustrates the conflict between closed commercial platforms with great financial might and open source software. The Python 3.13 patch has already been merged. A pull request backport patch for Python 3.12 has also been created, and illustrates the clean nature of the patch and new configure flag.

Github Actions dynamic job environment variables

GitHub Actions jobs can dynamically set environment variables with job scope using a run: step to write the variable to an environment file.

Append to PATH: All job steps after the “run:” stanzas have the new PATH value “~/.local/bin” appended. Windows defaults to PowerShell.

- name: set Unix PATH
  if: runner.os != 'Windows'
  run: echo "${HOME}/.local/bin" >> $GITHUB_PATH

- name: set Windows PATH
  if: runner.os == 'Windows'
  run: echo "${HOME}/.local/bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append

Any environment variable can be set in this way. Example: set environment variables “CMAKE_INSTALL_PREFIX” and “CMAKE_PREFIX_PATH” to “~/libs” for the following job steps:

- name: set Unix
  if: runner.os != 'Windows'
  run: |
    echo "CMAKE_INSTALL_PREFIX=~/libs" >> $GITHUB_ENV
    echo "CMAKE_PREFIX_PATH=~/libs" >> $GITHUB_ENV    

- name: set Windows
  if: runner.os == 'Windows'
  run: |
    echo "CMAKE_INSTALL_PREFIX=$HOME/libs" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
    echo "CMAKE_PREFIX_PATH=$HOME/libs" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append