Compdigitec Labs

Python classes, metaclasses, and instances at a glance

By admin | February 16, 2021

For more details:

Topics: Code | No Comments »


By admin | February 15, 2021

git format-patch $1..HEAD -o wip && git reset --hard $1

Topics: Code | No Comments »

Getting files from sources in Scala

By admin | February 14, 2021

// Java-based ways

// Scala-native way

Topics: Code | No Comments »

Epson DS-30 on Ubuntu Linux

By admin | February 13, 2021

Use the attached ds-30-bundle, download from

Install the deb packages with ./ –dry-run

Use simple-scan to run the scan. Insert paper face down above/next to
the little scan marker and press the button

Topics: Linux | No Comments »

Running a GUI application in Docker

By admin | January 30, 2021

apt-get update && apt-get install -y openssh-server vim xpra

# Allow container to connect to GUI?
xhost +
docker run --rm -v /tmp/.X11-unix:/tmp/.X11-unix -p 2222:2222 -e DISPLAY --security-opt seccomp:unconfined -it <image> bash

sudo mkdir -p /run/user/1000
sudo chown ubuntu:ubuntu /run/user/1000

xpra start ssh:ubuntu@localhost:2222 --exit-with-children --start-child="xfce4-terminal"

Topics: Linux | No Comments »

Creating a service to run a systemd-nspawn server

By admin | January 28, 2021

debootstrap –include=systemd-container –components=main,universe focal myContainer

Edit /usr/lib/systemd/system/systemd-nspawn@.service

ExecStart= -> remove -U

sudo systemctl daemon-reload
sudo systemctl restart systemd-nspawn@myContainer

Topics: Linux | No Comments »

Git refuses to discover new remote branches

By admin | January 23, 2021

In addition to the excellent suggestions at, take a look in .git/config and make sure fetch is specified to only fetch the master branch:

[remote "origin"]
  url =
  fetch = +refs/heads/master:refs/remotes/origin/master # bad

You’ll want to change the fetch line to fetch all branches instead:

[remote "origin"]
  url =
  fetch = +refs/heads/*:refs/remotes/origin/*

Topics: Linux | No Comments »

ImageMagick snippet: batch crop, dither, and guillotine

By admin | November 12, 2020

# Create output dirs
mkdir -p cropped dithered output
rm cropped/*.png dithered/*.png output/*.png

# Crop (3000x2000 at position 200, 200)
mogrify -crop 3000x2000+200+200 -path ./cropped *.png

# Dither (to indexed colours)
mogrify +dither -colors 4 -path ./dithered cropped/*.png

# Guillotine
mogrify -crop 2x1@ +repage -path ./output dithered/*.png

Topics: Linux, Uncategorized | No Comments »

Concatenating PDFs while padding/extending odd-length PDFs

By admin | October 10, 2020

When concatenating PDFs to consolidate print jobs, it is nice to have single-page or PDFs with odd numbers of pages to not have to share sides with another unrelated document.

There is a short script available at ; however, it does not appear to be updated for PyPDF2. So here is an update for Python3 and PyPDF2.


sudo apt install python3-pypdf2

#!/usr/bin/env python3
# Inspired from

import copy
import sys
from PyPDF2 import PdfFileWriter, PdfFileReader

def main():
    if len(sys.argv) < 2:
        print("No input PDFs specified", file=sys.stderr)
        return 1

    pdf_writer = PdfFileWriter()
    output_page_number = 0
    alignment = 2           # to align on even pages

    # So we can close the file objects later.
    file_objects = []

    for filename in sys.argv[1:]:
        # Store the file object for closing
        f = open(filename, 'rb')

        # Open the input PDF
        pdf_reader = PdfFileReader(f)

        # Add input pages
        for page in pdf_reader.pages:
            output_page_number += 1

        # Add filler pages
        while output_page_number % alignment != 0:
            output_page_number += 1

    # Write output PDF while input files are still open.

    # Close open files.
    while len(file_objects) > 0:

    return 0


Topics: Linux | No Comments »

Scanning with Brother DCP-7065DN in Ubuntu

By admin | September 12, 2020

First, make sure the printer is detected in lsusb:

$ lsusb | grep Brother
Bus 001 Device 011: ID 04f9:024a Brother Industries, Ltd 

Then, either add a udev rule to ensure that we have permission to access it, or use the following one-time hack:

sudo chmod 777 /dev/bus/usb/001/011

Now, install the correct driver for the printer from For the DCP-7065DN on Ubuntu 64-bit, the following package worked:

5937473842d95571b0d8ff50d6095198 brscan4-0.4.9-1.amd64.deb

Check that sane-find-scanner can see it:

$ sane-find-scanner
# sane-find-scanner will now attempt to detect your scanner. If the
# result is different from what you expected, first make sure your
# scanner is powered up and properly connected to your computer.

# No SCSI scanners found. If you expected something different, make sure that
# you have loaded a kernel SCSI driver for your SCSI adapter.

found USB scanner (vendor=0x04f9, product=0x024a) at libusb:001:011
# Your USB scanner was (probably) detected. It may or may not be supported by
# SANE. Try scanimage -L and read the backend's manpage.

# Not checking for parallel port scanners.

# Most Scanners connected to the parallel port or other proprietary ports
# can't be detected by this program.

# You may want to run this program as root to find all devices. Once you
# found the scanner devices, be sure to adjust access permissions as
# necessary.

Finally, check that scanimage can see it. If this succeeds, then the scanner is operational (and can be used from Simple Scan or any other scan software).

$ scanimage -L
device `brother4:bus1;dev4' is a Brother DCP-7065DN USB scanner

Topics: Linux | No Comments »

If you found this article helpful or interesting, please help Compdigitec spread the word. Don’t forget to subscribe to Compdigitec Labs for more useful and interesting articles! « Older Entries