Scientific Computing

Strip geotag location from photos

Strip most EXIF and IPTC headers from image:

exiftool -all= -photoshop:all= myphoto.jpg

A copy of the image _original is kept. The image is not recompressed so image quality is not affected.


Compare the metadata present on old and cleaned images using ImageMagick:

magick identify -verbose myphoto.jpg

magick identify -verbose myphoto.jpg_original

Not all headers can be removed, but it usually works.


Install Exiftool:

  • Linux: apt install libimage-exiftool-perl
  • macOS: brew install exiftool
  • Windows installer

Hugo page content variables

Hugo content Markdown files cannot use Hugo variables directly. The way to access variables (including site parameters, data sources, and front matter) from content Markdown files is to use Hugo shortcodes or to use a custom template for those content pages. However, areas inside code fences cannot use shortcodes. What I wanted to do was make examples of code inside code fences used on several pages on my site update with a version number. However, I don’t currently see a feasible way to do this with Hugo that wouldn’t be overly specific to the particular set of examples. It’s OK, I wanted to note this limitation I ran into. An alternative is to use find/replace across files like “sed” or the VSCode GUI.

GNSS-SDR on Windows

To run Linux programs on a Windows computer, normally Windows Subsystem from Linux (built into Windows by Microsoft) is generally the best / most performant way to run most Linux programs, especially programs relevant to data processing and geospace science in general.

The WSL Install Guide notes from Windows Terminal:

wsl --install

That will install Ubuntu. After a few minutes the Ubuntu WSL install will be complete. From Windows terminal type:

wsl

to start Ubuntu.

From there type

sudo apt install gnss-sdr

That installs numerous packages needed to run GNSS-SDR.

Then proceed to the first-run examples.

When building GNSS-SDR and examples, don’t worry about CMake warnings about missing packages, as long as the project builds.

macOS Network Interface priority order

The macOS network interface priority order determines which network interface (like WiFi, Ethernet, etc.) the system uses first when multiple interfaces are available. Set this priority order through the System Preferences or via the command line:

List all network services in priority order:

networksetup -listallnetworkservices

Set the network interface priority order with:

networksetup -ordernetworkservices "Service1" "Service2" ...

Replace "Service1", "Service2", etc., with the actual network service names.


Regarding WiFi SSID priority, macOS automatically scores based on several factors, including the user manually selecting a WiFi network.

8m 40 MHz and 4m 70 MHz ham bands in the USA

Several countries have created an 8 meter ham band near 40 MHz. The USA FCC has a proposed rulemaking RM-11843 to create an 8 meter ham band in the USA. A key conflicting user SNOTEL, which used meteorburst communications to connect very remote sites, has ceased use of the 40 MHz band. As commenters indicate, a rich surplus equipment market exists of military surplus radios and commercial equipment that can be used on the 8 meter ham band. Proposed bandplans allocate FM, CW, and digital modes.


This 8 meter band proposal stands in contrast to the 2014 proposal to make a 4m 70 MHz allocation as exists in numerous other countries around the world. The FCC summarily dismissed the 4m proposal due to incumbent TV channel 4 users. Use this link to query the FCC TV database for channel 4 users. For example, in 2025 there were about 10 full-power DTV licensees (including newly coming on air) across the USA on TV channel 4, an increase from 2014 licensees. Since other countries have allocations close to 70 MHz, the best option for USA ham in the 4m band may be to co-exist in the 72-76 MHz band, perhaps in-between the existing 20 kHz spaced channels. Since typical 4m radios cover 66 MHz - 88 MHz, for international DX, USA hams could receive on 70 MHz and transmit on 72-76 MHz channels. This would be akin to operations for international DX for USA hams in the 60 meter channelized band.

Compiling Fortran 66 programs

A general rule for compiling and running old code in any language is to first try to get it working for known input / output via emulation or virtual machine. Many old codes were made before linters and other correctness checks we’ve long taken for granted. The codes may use non-standard tricks to boost efficiency that haven’t been significant for decades.

A modern Fortran compiler that can compile Fortran 66 standard code without modification is Intel oneAPI. The -f66 flag enables Fortran 66 compatibility. A key behavior difference with Fortran 66 is that Do loops always run at least once. This behavior is not available in Gfortran. If one has the ability to use a virtual machine with unmaintained compilers like g77 and the -fonetrip flag, this behavior can be emulated. However, this behavior was simply not addressed in the Fortran 66 standard.

After correct operation is established, Fortran 66 code often needs adjustments to work with modern compilers. The Fortran Wiki has an excellent article on modernizing Fortran syntax.

Always make a copy of the file first. Sometimes 10,000+ lines will match so it can be tedious to check. Similar operations may be needed if a mix of tabs and spaces are used.

To move line numbers left, run this regex and replace with null (nothing):

^\s+(?=\d+\s)

To make code start in column 7, recall that fixed format (Fortran <= 77) code has line numbers in columns 1-5 of each line numbers After the prior operation, push the actual code right of column 6 by replacing this regex with appropriate number of spaces:

(?<=^\d+\s+)

Other compatibility notes:

  • $ can be used like a semicolon in CDC Cyber Fortran
  • put procedures in separate files for duplicated line numbers.

Matlab license toolbox names

Matlab has numerous factory toolboxes that are referred to in two distinct ways: “Product Names” and “Feature Names”. The “Product Name” is the official plain English name of the toolbox, while the “Feature Name” is a more specific identifier used within Matlab. For example, “MATLAB Test” is the Product Name, and “MATLAB_Test” is also the Feature Name. The mapping between names is not always just by replacement of spaces with underscores. To programmatically access the list of toolboxes Product Names, use the ver command in Matlab, which returns a structure array containing both the Product Names. Then extract the Feature Names from the structure.

versions = ver();
productNames = string({versions.Name});

for i = 1:numel(productNames)
  featureNames(i) = string(com.mathworks.product.util.ProductIdentifier.get(productNames(i)).getFlexName());
end

Matlab previous release documentation

Matlab documentation discloses in which Matlab release a function was introduced. Sometimes the documentation omits to say when a feature / option was added to an existing function. To avoid needless iterating and possible misapplications of a function in an older release, it’s useful to check the previous Matlab release documentation. After clicking on a specific release, one can search for functions within that release only.

Windows Hibernate enable / disable

Across operating systems, “hibernate” is a power-saving state that saves the current session to disk and powers down the computer, allowing for a quick resume later while not having the long-term battery drain of suspend mode that keeps the RAM powered. Sometimes as part of diagnosing problems or ensuring that a remote computer stays powered on, hibernate might be disabled. If restoring such a computer to personal use, or if experiencing issues where a laptop computer has a drained battery after a couple days of non-use, it may be useful to enable hibernate mode.

Check the current state of hibernate mode by running the following command in Windows Terminal:

powercfg /availablesleepstates

If hibernate is enabled, the output will include “Hibernate” in the list of available sleep states. To enable hibernate mode:

powercfg /hibernate on

However, the option in Control Panel → Power Options → Change plan settings → Change advanced power settings → Sleep → “Hibernate after” may not be available until making the following registry change:

REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Power\PowerSettings\238C9FA8-0AAD-41ED-83F4-97BE242C8F20\9d7815a6-7ee4-497e-8888-515a05f02364 /v Attributes /t REG_DWORD /d 2 /f

Reopen The Control Panel → Power Options → Change plan settings → Change advanced power settings, and the “Hibernate after” option should now be available.

Alternatively, enable the hibernate timer setting from the Terminal, where the values are in minutes:

powercfg /setACvalueindex scheme_current SUB_SLEEP HIBERNATEIDLE 43200
# 12 hours hibernate while plugged into AC power (or set to 0 for never)

powercfg /setDCvalueindex scheme_current SUB_SLEEP HIBERNATEIDLE 10800
# 3 hours hibernate while on battery (or set to 0 for never)

powercfg /setactive SCHEME_CURRENT
# Set the current power scheme to apply changes