dark mode


This is the personal homepage of Daniel Friesel / derf (depending on context and nickname availability). Every now and then, I write software and take pictures, which you can find here.


Web Applications

CLI Software

Travel::Routing::DE::VRR v2.19
Interface to EFA-based itinerary services
> efa Essen Martinstr Düsseldorf Hbf
14:34 ab  Essen Martinstr.: Bstg. 1      Straßenbahn 108      Essen Altenessen Bf Schleife
14:38 an  Essen Hauptbahnhof: Bstg. 1

14:47 ab  Essen Hauptbahnhof: 2          R-Bahn RE11 (RRX)    Düsseldorf Hbf
15:24 an  Düsseldorf Hbf: 10
Travel::Status::DE::DBWagenreihung v0.06
Interface to Deutsche Bahn Wagon Order API
> db-wagenreihung 'Essen Hbf' 723
▏      G       ▕▏    F    ▕▏    E     ▕▏   D    ▕▏    C    ▕▏    B    ▕▏             A             ▕
     >  39   38    37   36   35   33   32   31    29   28   27   26   25    23   22   21 >
Travel::Status::DE::DeutscheBahn v3.01
Interface to HAFAS-based arrival/departure monitors
> hafas-m 'Messegelände, Leipzig'
14:32    STR   16  Lößnig, Leipzig
14:40    STR   16  Sportforum Süd, Leipzig
14:43    ALT   86  S-Bahnhof Messe, Leipzig
14:47    STR   16  Lößnig, Leipzig
> db-iris 'Dortmund Hbf'
14:38 +16  IC 2027     Passau Hbf            11
14:39      ABR RE11    Kassel-Wilhelmshöhe   8
14:41      RE 57       Winterberg(Westf)     2
└────      RE 57       Brilon Wald           2
14:41      S 5         Hagen Hbf             5
14:42      S 2         Dortmund Hbf          6
14:45 +1   RE 1        Aachen Hbf            16
> ura-m Talbot
14:49:41  52    Aachen Bushof
15:04:47  11    Lichtenbusch
15:05:00  52    Eschweiler Bushof
15:18:00  1     Aachen Bushof
15:19:56  11    Hoengen Markt
15:35:00  1     Schevenhütte
Travel::Status::DE::VRR v1.17
Interface to EFA-based departure monitors
> efa-m Dortmund 'Universität S'
08:32  +1  02  445    Dortmund Am Kai
08:35      3   HB1    Dortmund Technologiezentrum
08:36      3   HB1    Dortmund Eichlinghofen H-Bahn
08:38      02  447    Dortmund Bandelstraße
08:39      2   S1     Dortmund Hbf
08:40      01  447    Dortmund Hacheney
> ct a mutt
mutt: retrieving package
Cloning into 'mutt'...
created   .muttrc         -> /home/derf/packages/mutt/etc/muttrc
> ekgping ccc.de

Firmware and Hardware

RGB cat moodlight
I²C moodlight
VUSB-I²C v0.02
USB ↔ I²C adapter


I am no longer working on these projects. Some are nearly feature-complete, others never left the early prototype stage.

App::Raps2 v0.54
CLI password safe
App::Slackeria v0.12
Project status overview


Travel-Status-DE-DBWagenreihung-0.06.tar.gz (signature)

  • DBWagenreihung: Add train_descriptions accessor
  • Wagon: Add train_subtype accessor

Travel-Status-DE-IRIS-1.54.tar.gz (signature)

  • Add stations DKP, DRBS, DSBG, KWHD, NCBD, TENS, XLHW

Travel-Status-DE-DBWagenreihung-0.04.tar.gz (signature)

  • Distinguish between IC2 KISS / IC2 Twindexx and ICE T 411 / ICE T 415

Travel-Status-DE-DBWagenreihung-0.05.tar.gz (signature)

  • Distinguish between ICE 3 403 series 1/2 and ICE T 411 series 1/2

Travel-Status-DE-IRIS-1.53.tar.gz (signature)

  • import station name changes and station removals from Winterfahrplan 2021

Travel-Status-DE-IRIS-1.52.tar.gz (signature)

  • get_station_by_name: Fix crash (unhandled exception) when the station name is an invalid regular expression

Travel-Status-DE-IRIS-1.51.tar.gz (signature)

  • Add BER airport stations
  • Rename Schönefeld airport to BER Terminal 5

Travel-Status-DE-IRIS-1.50.tar.gz (signature)

  • Add station Brunnen(Oberbay)
  • Incorporate station name and eva number changes from DB IRIS (affects nine stations)
  • Add geocoordinates to 17 stations previously lacking those

Travel-Status-DE-IRIS-1.48.tar.gz (signature)

  • Add stations Neuruppin Seedamm (temporary, teardown expected Dec 2020), Amriswil, and Baar(CH)

Travel-Status-DE-IRIS-1.47.tar.gz (signature)

  • Work around (probably incorrect) IRIS coupling of Norddeich and Norddeich Mole stations

Travel-Status-DE-DeutscheBahn-3.01.tar.gz (signature)

  • Fix support for ÖBB and other backends which recently switched from two- to four-digit years

The build instructions on the sigrok Wiki only work for Python2, which is past its end of life date. To build libsigrok with Python bindings for Python3, you need to set PYTHON=python3 when running configure.

The dependency list is also slightly different:

sudo apt-get install git-core gcc g++ make autoconf autoconf-archive \
  automake libtool pkg-config libglib2.0-dev libglibmm-2.4-dev libzip-dev \
  libusb-1.0-0-dev libftdi1-dev check doxygen python3-numpy \
  python3-dev python-gi-dev python3-setuptools swig default-jdk

"python-gi-dev" is not a typo -- the package covers both Python2 and Python3.

Side note: Installing libserialport-dev instead of building your own version as documented on the Wiki seems to work fine.

Travel-Status-DE-DeutscheBahn-3.00.tar.gz (signature)

  • Result: The date, datetime, and time accessors now report realtime data if available
  • Result: Add sched_date, sched_datetime, and sched_time accessors for schedule data

Travel-Status-DE-IRIS-1.46.tar.gz (signature)

  • Document LWP::Protocol::https dependency
  • Discourage building with Geo::Distance 0.21. Geo::Distance 0.21, released on 7 Mar 2019, is the only release using GIS::Distance's distance_km method -- which was removed on 9 Mar 2019 in GIS::Distance 0.14

Travel-Status-DE-DeutscheBahn-2.05.tar.gz (signature)

  • Document LWP::Protocol::https dependency
  • Remove BVG (Berliner Verkehrsgesellschaft) and SBB (Schweizerische Bundesbahnen) services

Travel-Status-DE-VRR-1.17.tar.gz (signature)

  • Add MVV (Münchner Verkehrs- und Tarifverbund) and VAG (Freiburger Verkehrs AG) services
  • Fix encoding when using VOR or LinzAG services

Travel-Routing-DE-VRR-2.19.tar.gz (signature)

  • Switch from WTFPL to Perl license (GPL 1+ or Artistic)
  • Update VVO (Verkehrsverbund Oberelbe), VMV (Verkehrsgesellschaft Mecklenburg-Vorpommern) and VGN (Verkehrsverbund Grossraum Nürnberg) EFA urls
  • Add VAG (Freiburger Verkehrs AG), MVV (Münchner Verkehrs- und Tarifverbund), NVBW (Nahverkehrsgesellschaft Baden-Württemberg) services
  • Re-add Verbundlinie (Verkehrsverbund Steiermark) service
  • Remove IVB (Innsbrucker Verkehrsbetriebe) and VRNdelfi services as they are no longer available

Travel-Status-DE-VRR-1.16.tar.gz (signature)

  • Use HTTPS for DING, VOR, LinzAG, VGN, VRR, VRR2, VVS, NVBW, KVV and BSVG services
  • Update VGN, VVO, VMV and KVV service URLs
  • Remove IVB, VVV and VRNdelfi services
  • Re-add Verbundlinie service

A .deb package is an easy solution for distributing Perl modules to Debian-based systems. Unlike manual installation using Module::Build, it does not require re-installation whenever the perl minor version changes. Unlike project-specific cpanm or carton setups, the module is available system-wide and can easily be used in random Perl scripts which are not bound to a project repository.

The Debian package dh-make-perl (also known as cpan2deb) does a good job here. In many cases, creating a personal package for a Perl module is as easy as cpan2deb Acme::Octarine. Delegating the build process to Docker may be useful if you do not have a Debian build host available and would rather avoid having the build process depend on the (probably not well-defined) state of your dev machine.

For CPAN modules, all you need is a Debian container with dh-make-perl. Using this container, run cpan2deb and extract the resulting .deb. You can find a Dockerfile and some scripts for this task in my docker-dh-make-perl repository. The Dockerfile is used to create a dh-make-perl image (so you don't need to install dh-make-perl in a fresh Debian image whenever you build a module). scripts/makedeb-docker-helper builds the package inside the container and copies it to the out/ directory, and scripts/makedeb-docker orchestrates the process.

Note: A package generated this way is suitable for personal use. It is not fit for inclusion in the Debian package repository. As all Debian packages must have an author, you need to set the DEBEMAIL and DEBFULLNAME environment variables to appropriate values. Feel free to extend the Dockerfile and scripts as you see fit – the repository is meant to provide a starting point only.

For non-CPAN content (e.g. if you are a module author and do not want to wait for your freshly uploaded release to appear on CPAN, or if you need to build a patched version of a CPAN module), the process is slightly more involvevd. It requires

  • additional bind mounts (docker run -v "${PWD}:/orig:ro") to copy the module content into the container,
  • a manually provided version (in my case via git describe --dirty), and
  • disabling module signing (unless you pass your GPG keyring to the container).

I also manually specify the packages needed for building and testing. I assume that this is not needed and can be performed automatically by dh-make-perl --install-deps --install-build-deps.

Module content and versioning depends on your setup, so I will not provide a git repository for this case. Please refer to the makedeb-docker and makedeb-docker-helper scripts in Travel::Routing::DE::VRR, Travel::Status::DE::IRIS and Travel::Status::DE::VRR for examples.