Git filters may clash with the CMake ExternalProject
update step.
The “download” step invokes checkout and the “update” step may stash and invoke the Git filters, causing the build to fail.
Solution:
Git pre-commit hook
instead of Git filters.
Users with Git filters need to disable the filters and preferably change the filters to pre-commit hooks if possible.
Jupyter notebook outputs can be large (plots, images, etc.), making Git repo history excessively large and making Git operations slower as the Git history grows.
Jupyter notebook outputs can reveal personal information with regard to usernames, Python executable, directory layout, and data outputs.
Strip all Jupyter outputs from Git tracking with a client-side Git
pre-commit hook.
We use Git pre-commit hook because Git filters can interfere with other programs such as
CMake ExternalProject.
The procps
watch
command allows running a command repeatedly on a Unix-like system such as Linux and macOS.
Typically the command is a very quick shell command watching temperature, file status, etc.
An alternative in general is a small standalone C program
watch.
On macOS “watch” is available via Homebrew.
Most Linux distributions have “watch” available by default.
HPC batch systems generally track resources used by users and batch jobs to help ensure fair use of system resources, even if the user isn’t actually charged money for specific job usage.
The
qacct command
allows querying batch accounting logs by job number or username, etc.
For example
qacct -d 7 -o $(whoami) -j
Gives the last 7 days of jobs.
“ru_wallclock” is the number of seconds it took to run the job.
The system temporary directory has long been used as a scratch pad in examples.
Over time, security limitations (virus scanners) and performance issues (abrupt clearing of system temporary directory) have lead major programs to use user temporary or cache directories instead of the system temporary directory.
To allow a for loop to make an arbitrary number of overlaid plots in a single axes, we may wish to endlessly cycle colors using
itertools.
This technique only makes sense up to a few dozen cycles depending on the
Matplotlib color palette
but it can be better than just ending a loop after the palette is exhausted.
importitertoolsimportmatplotlib.pyplotaspltimportmatplotlib.colorsasmplcolorscolor_cycle = itertools.cycle(mplcolors.TABLEAU_COLORS)
xy = [(x, x**1.2) for x inrange(20)]
# toy dataax = plt.figure().gca()
for (x, y), color inzip(xy, color_cycle):
ax.scatter(x, y, color=color)
print(xy)
plt.show()
If an external program needs a subdirectory to create and load multiple files, Python
tempfile.TemporaryDirectory()
creates a temporary working directory.
shutil.copytree
is used to recursively copy all files if the call to the external program succeeds.
frompathlibimport Path
importtempfileimportsubprocessimportshutilimportuuidfile = Path(f"~/{uuid.uuid4().hex}.txt").expanduser()
# toy filefile.write_text("Hello World!")
with tempfile.TemporaryDirectory(ignore_cleanup_errors=True) as f:
shutil.copy(file, f)
subprocess.check_call(["cat", Path(f) / file.name])
new_dir = file.parent / f"{file.stem}"print(f"\n{file} Solved, copy to {new_dir}")
shutil.copytree(f, new_dir)
Public Git repo
clone via HTTPS and push via SSH
is fast and generally effective for security.
For private Git repos do Git clone over SSH.
Optionally,
SSH Agent
avoids the need to constantly type the SSH password.
Git clone with
Git over SSH
by simply replacing “https://” in the Git repo URL with “ssh://”.
Be sure to remove the trailing “.git” from the URL if present.
For example:
On Unix-like platforms, CMake variable
CMAKE_DL_LIBS
is populated to link with target_link_libraries(), providing functions like “dlopen” and “dladdr”.
For some libdl functions it’s necessary to also define “_GNU_SOURCE” like:
On Unix-like systems, the concept of
run path
is the search path for libraries used by a binary at runtime.
For Windows there is no separate Rpath, just PATH is used–necessary .dll files must be on PATH environment variable at the time of running a binary.
For Unix-like systems life can be easier since the Rpath is compiled into a binary.
Optionally, using
$ORIGIN in Rpath
allows relocating binary packages.
For CMake, set all the time – no need for “if()” statements.
Exporting symbols for MSVC-based compilers is necessary to generate a “example.lib” corresponding to the “example.dll”.
To have the installed CMake binaries work correctly, it’s necessary to set CMAKE_PREFIX_PATH at configure time.
That is, the configure-build-install sequence for shared library project in CMake is like: