Skip to content

Instantly share code, notes, and snippets.

View mara004's full-sized avatar

mara004

View GitHub Profile
@mara004
mara004 / run_with_args.py
Last active May 3, 2025 21:37
Wrap a python module's CLI entrypoint with argfiles support
#! /usr/bin/env python3
# SPDX-FileCopyrightText: 2025 mara004 <[email protected]>
# SPDX-License-Identifier: BSD-2-Clause
import sys
import shlex
from pathlib import Path
from importlib import import_module
from importlib.metadata import entry_points
@mara004
mara004 / ghostscript_ffi.py
Last active April 14, 2025 01:06
PDF rendering with Ghostscript, revisited (ABI bindings, in-memory approach)
# Four lines intentionally left blank
# SPDX-FileCopyrightText: 2025 geisserml <[email protected]>
# SPDX-License-Identifier: MPL-2.0 OR GPL-3.0-or-later
# Note that Ghostscript is AGPL-licensed, so this code is altogether affected by copyleft
# Written with Ghostscript 9.56.1 on Fedora.

UNIX famously uses fork+exec to create processes, a simple API that is nevertheless quite tricky to use correctly and that comes with a bunch of problems. The alternative, spawn, as used by VMS, Windows NT and recently POSIX, fixes many of these issues but it overly complex and makes it hard to add new features.

prepare() is a proposed API to simplify process creation. When calling prepare(), the current thread enters “preparation state.” That means, a nascent process is created and the current thread is moved to the context of this process, but without changing memory maps (this is similar to how vfork() works). Inside the nascent process, you can configure the environment as desired and then call prep_execve() to execute a new program. On success, prep_execve() leaves preparation state, moving the current thread back to the parent's process context and returns (!) the pid of the now grownup child. You can also use prep_exit() to abort the child without executing a new process, it similarly returns the pid

@mara004
mara004 / dvd_rip.sh
Last active March 24, 2025 22:28
DVD ripping
# see also https://wiki.ubuntuusers.de/DVDs_manuell_rippen/#Komplette-Spur-rippen
lsdvd /dev/sr0 # to show available tracks and their length
mplayer dvd://n -dvd-device /dev/sr0 # to preview a track -- where n is the track number (1-based)
mplayer dvd://n -dvd-device /dev/sr0 -v -dumpstream -dumpfile filename.vob # to rip track
@mara004
mara004 / interesting_windows.md
Last active December 27, 2024 23:32
Interesting Windows(-only) software
@mara004
mara004 / labelling.py
Last active January 9, 2025 23:09
Enumerate data using letters rather than numbers
# SPDX-FileCopyrightText: 2024 geisserml <[email protected]>
# SPDX-License-Identifier: MPL-2.0
from string import ascii_uppercase as ALPHABET
N_CHARS, ORD_A = len(ALPHABET), ord("A") # 26, 65
def idx_to_label(i):
count, remainder = divmod(i, N_CHARS)
char = ALPHABET[remainder] # chr(remainder + ORD_A)
@mara004
mara004 / deferred_imports.py
Last active April 12, 2025 00:49
Various attempts at deferred ("lazy") imports. None of these seems particularly satisfying, though. Missing PEP 690...
# SPDX-FileCopyrightText: 2024 geisserml <[email protected]>
# SPDX-License-Identifier: Apache-2.0 OR BSD-3-Clause OR MPL-2.0
import sys
import importlib.util
def v1_deferred_import(modpath):
# FIXME If modpath points to a submodule (e.g. PIL.Image), the parent module will be loaded immediately when this function is called. What's more, non-deferred imports of the submodule will break. This seems to be a nasty limitation of the importlib APIs used here.
@mara004
mara004 / ghostscript_shell.py
Last active April 2, 2025 00:41
PDF rendering with Ghostscript (via subprocess)
# SPDX-FileCopyrightText: 2024 geisserml <[email protected]>
# SPDX-FileCopyrightText: 2024 James R. Barlow <[email protected]>
# SPDX-License-Identifier: MPL-2.0
# Initial code derived from ocrmypdf/_exec/ghostscript.py
# Note that Ghostscript is AGPL-licensed. However, we are calling it via subprocess here, so not sure whether copyleft would actually apply.
# See also https://www.gnu.org/licenses/gpl-faq.en.html#MereAggregation
import io
import os
@mara004
mara004 / pymupdf.py
Created July 11, 2024 20:10
PDF rendering with pymupdf
# SPDX-FileCopyrightText: 2024 geisserml <[email protected]>
# SPDX-License-Identifier: MPL-2.0
# Note that (py)mupdf is AGPL-licensed, so this code is altogether affected by copyleft
import PIL.Image
import fitz as pymupdf
def invoke_pymupdf(filepath, index, scale=4, rotation=0, password=None):
@mara004
mara004 / poppler_qt5.py
Last active July 13, 2024 14:31
PDF rendering with poppler-qt5
# SPDX-FileCopyrightText: 2024 geisserml <[email protected]>
# SPDX-License-Identifier: MPL-2.0
# Note that Poppler is GPL-licensed, so this code is altogether affected by copyleft
import io
import PIL.Image
from popplerqt5 import Poppler
from PyQt5.QtCore import QByteArray, QBuffer