Felix J. Ogris' private homepage: some stuff about homemade software, FreeBSD, Linux, computers, and hacking in general.

Somewhat more nosy? Mailto www@ogris.de.

You're viewing this webpage using the good old IPv4 protocol.

IPv6 test pages

recent news


[2024-02-24] Updating a FreeBSD system bumped to FreeBSD 14.

[2024-02-17] First rule of WSGI programming: You do not use global variables. Thus, LogBlitz version 17.

[2024-01-17] gitup is a lightweight alternative to the official git client. It is aimed at updating ports (and src) on a FreeBSD system without cloning the respective repository's database or history. Installation is pretty simple:
# pkg install gitup
# cp -aiv /usr/local/etc/gitup.conf.sample /usr/local/etc/gitup.conf
If you have already installed ports locally, then you might build gitup from source:
# make -C /usr/port/net/gitup install clean
# cp -aiv /usr/local/etc/gitup.conf.sample /usr/local/etc/gitup.conf
Keeping your ports copy up to date is trivial:
# gitup ports
gitup will not proceed if a .git directory exists. Thus, if you have cloned your copy of the ports tree using the official git client, then remove /usr/ports/.git first:
# rm -r /usr/ports/.git

[2024-01-08] LogBlitz version 16 can be served by a WSGI server, too.


[2023-12-16] New version of pocgi.py fixes two bugs: Standard input was not opened in binary mode, and parsed values were not comparable to strings.

[2023-12-13] As FreeBSD 14 ships without portsnap, you are encouraged to use git in order to update your local ports tree. If you do not need the complete history of the entire ports collection, then limit the number of historical commits to one, e.g. for a very first clone right a fresh install:
# pkg install git
# git clone --depth 1 https://git.FreeBSD.org/ports.git /usr/ports
To keep the ports tree tidy afterwards, I use these 3 commands for now:
# cd /usr/ports
# git pull --depth 1
# git reset --hard origin
# git clean -dfx


[2023-12-03] pocgi.py (plain old cgi) aims to be a replacement for Python's cgi library, which was deprecated in 3.11 and will be removed in 3.13 (see PEP 594).

[2023-11-25] formdata.py shows how to do multipart/form-data HTTP POST uploads with Python's urllib only.

[2023-11-05] Benchmarked two additional devices for video encoding speed.

[2023-09-16] I benchmarked my graphic cards for video encoding speed and kept the results as my personal reference.



[2023-09-12] The other day I needed an event counter shared between scripts written in Python and Perl. These scripts process incoming files at a very low rate, about 10 per hour. Their filenames should be prefixed with an increasing and unique id. A text file containing the next id, protected by a file lock, is complicated, error-prone, and most likely non-portable. Same counts for a shared memory segment, plus this is lost at a reboot. A full blown SQL server seemed to be overkill. Thus, SQLite came to my mind. It has been part of Python since version 2.5, and is available, if not even installed, on many operating systems. The scripts are quite trivial. For Python:

import sqlite3

con = sqlite3.connect("/tmp/counter.sqlite", isolation_level=None)
cur = con.cursor()
(next_id,) = cur.execute("UPDATE counter SET id=id+1 RETURNING id").fetchone()
Perl counterpart:
#!/usr/bin/perl -w

use strict;
use warnings;
use DBI;

my $dbh = DBI->connect("DBI:SQLite:dbname=/tmp/counter.sqlite", "", "", {
  AutoCommit => 1, RaiseError => 1
my ($next_id) = $dbh->selectrow_array("UPDATE counter SET id=id+1 RETURNING id");
print "$next_id\n";
Of course you have to initialise the database and the counter table upfront, e.g. by using the sqlite3 command line tool:
$ sqlite3 /tmp/counter.sqlite "CREATE TABLE counter (id INT NOT NULL PRIMARY KEY); INSERT INTO counter VALUES (0);"
A bonus variant written in C:
/* Compile with:
 * cc -W -Wall -O3 -pipe -s -o counter counter.c -lsqlite3
#include <stdio.h>
#include <err.h>
#include <sqlite3.h>

int main ()
  const char sql[] = "UPDATE counter SET id=id+1 RETURNING id";
  sqlite3 *db;
  sqlite3_stmt *stmt;
  int next_id;

  if (sqlite3_open("/tmp/counter.sqlite", &db) != SQLITE_OK)
    errx(1, "sqlite3_open: %s",
         db ? sqlite3_errmsg(db) : "Generic SQLite error");

  if (sqlite3_prepare_v2(db, sql, sizeof(sql), &stmt, NULL) != SQLITE_OK)
    errx(1, "sqlite3_prepare_v2: %s", sqlite3_errmsg(db));

  if (sqlite3_step(stmt) != SQLITE_ROW)
    errx(1, "sqlite3_step: %s", sqlite3_errmsg(db));

  next_id = sqlite3_column_int(stmt, 0);

  if (sqlite3_finalize(stmt) != SQLITE_OK)
    errx(1, "sqlite3_finalize: %s", sqlite3_errmsg(db));

  if (sqlite3_close_v2(db) != SQLITE_OK)
    errx(1, "sqlite3_close_v2: %s", sqlite3_errmsg(db));

  printf("%i\n", next_id);

  return 0;



[2023-09-04] How to show git log entries up to a certain date:
$ git --no-pager log -1 --until "2023-06-22"
$ git --no-pager log -1 --until "last year"
You can then use the commit hash from the above outputs for further processing, e.g.:
$ git diff --stat <commit hash>
[2023-08-23] How to get the current date and time of Lisbon:

[2023-08-09] rrdquery.pl version 4 (obviously) comes with version numbering, an example section, and fixes two bugs, where a "IS NULL" predicate wasn't parsed correctly and an aggregate function was always expected.

[2023-08-03] dnskey2id.pl shows how to derive the key id for a given DNSSEC dnskey in Perl. Inspired by a Python snippet I found on https://lists.isc.org/pipermail/bind-users/2010-October/081724.html.

[2023-07-27] LogBlitz version 15 reduces the number and size of http cookies, and displays the number and size of the selected logfiles.

[2023-05-23] ampctrld version 2 lowers the number of addresses to listen on to a maximum of 16.


[2021-04-25] New version of kvmlib allows you to use a different QEMU executable than qemu-system-x86_64, and exits with an error message if you use the cdrom command without a path to an ISO file.

[2023-04-23] If your recent Gentoo Linux box complains that /var/tmp already exists and is not a directory during system boot, i.e. maybe because it is a symlink to /tmp, then create a file named /etc/tmpfiles.d/tmp.conf containing this configuration:
L /var/tmp - - - - /tmp
For further details, you'll have to read the man page of systemd-tmpfiles.
[2023-04-17] If you run a Cyrus IMAP server that suddenly stops exporting some or even all calendar events, you might consider reconstructing the respective mailboxes, e.g. on a FreeBSD server:
# su - cyrus
% sbin/reconstruct -nrGR user.username.#calendars
% sbin/reconstruct -rGR user.username.#calendars

[2023-03-29] grapheqd version 7 supports IPv6 addresses and can listen on multiple addresses at the same time.

[2023-03-28] As announced 18 days ago, ampctrld is a re-implementation of ampcontrol in plain C. It has two new features: It allows you to assign user-defined names to input sources, and can listen on multiple addresses, i.e. an IPv4 and an IPv6 address at the same time. Additionally, it saves system resources:

ampctrld memory consumption


pkg delete node

[2023-03-27] How to get the base64 encoded SHA hash of an existing file, part two:

[2023-03-10] New version of ampcontrol handles initial connection errors, and makes use of the new Buffer API of Node.js.
I need to rewrite it again, though. This time in C, since memory consumption of Node.js is far too heavyweight for my taste:

ampcontrol memory consumption

old news

Valid HTML 4.01 Strict! Valid CSS! [Valid RSS] Viewable With Any Browser Vim FreeBSD Imprint
Data privacy