Skip to content

Development

17 posts with the tag “Development”

GoSƐ - A terascale file-uploader

GoSƐ Logo
GoSƐ Logo.

GoSƐ is a modern and scalable file-uploader focusing on scalability and simplicity.

It is a little hobby project I’ve been working on over the last weekends.

The only requirement for GoSƐ is a S3 storage backend which allows to it to scale horizontally without the need for additional databases or caches. Uploaded files a divided into equally sized chunks which are hashed with a MD5 digest in the browser for upload. This allows GoSƐ to skip chunks which already exist. Seamless resumption of interrupted uploads and storage savings are the consequence.

And either way both upload and downloads are always directed directly at the S3 server so GoSƐ only sees a few small HTTP requests instead of the bulk of the data. Behind the scenes, GoSƐ uses many of the more advanced S3 features like Multi-part Uploads and Pre-signed Requests to make this happen.

Users have a few options to select between multiple pre-configured S3 buckets or enable browser & mail notifications about completed uploads. A customizable retention / expiration time for each upload is also selectable by the user and implemented by S3 life-cycle policies. Optionally, users can also opt-in to use an external service to shorten the URL of the uploaded file.

Currently a single concurrent upload of a single file is supported. Users can observe the progress via a table of details statistics, a progress-bar and a chart showing the current transfer speed.

GoSƐ aims at keeping its deployment simple and by bundling both front- & backend components in a single binary or Docker image. GoSƐ has been tested with AWS S3, Ceph’s RadosGW and Minio. Pre-built binaries and Docker images of GoSƐ are available for all major operating systems and architectures at the release page: /stv0g/gose (Releases) .

GoSƐ is open-source software licensed under the Apache 2.0 license.

Live Demo
GoSƐ Demo
GoSƐ Demo.
  • De-duplication of uploaded files based on their content-hash
    • Uploads of existing files will complete in no-time without re-upload
  • S3 Multi-part uploads
    • Resumption of interrupted uploads
  • Drag & Drop of files
  • Browser notifications about failed & completed uploads
  • User-provided object expiration / retention time
  • Copy URL of uploaded file to clip-board
  • Detailed transfer statistics and progress-bar / chart
  • Installation via single binary or container
    • JS/HTML/CSS Frontend is bundled into binary
  • Scalable to multiple replicas
    • All state is kept in the S3 storage backend
    • No other database or cache is required
  • Direct up & download to Amazon S3 via presigned-URLs
    • Gose deployment does not see an significant traffic
  • UTF-8 filenames
  • Multiple user-selectable buckets / servers
  • Optional link shortening via an external service
  • Optional notification about new uploads via shoutrrr
    • Mail notifications to user-provided recipient
  • Cross-platform support:
    • Operating systems: Windows, macOS, Linux, BSD
    • Architectures: arm64, amd64, armv7, i386

I consider the current state of GoSƐ to be production ready. Its basic functionality is complete. However, there are still some ideas which I would like to work on in the future:

Also checkout the Codeberg Issue Tracker /stv0g/gose (Issues) for a detailed overview.

Running a Xilinx hw_server as Docker Container

Dockerized Xilinx hw_server Setup
Dockerized Xilinx hw_server Setup.

This article describes the necessary steps to run a Xilinx hw_server as a Docker container.

Xilinx’s hw_server is a command line utility which handles JTAG communication between a Xilinx FPGA board and usually the Vivado IDE. It can be used to configure the FPGA bitstream, connect to the embedded logic analyzer cores (ILA) or perform debugging of processor cores via GDB and the Xilinx System Debugger (XSDB). The hw_server is usually used when those tasks shall performed remotely as the connection between Vivado or XSDB is established via TCP connection and allows us to run it on a remote system.

Running the hw_server as a Docker container has the benefit that its installation is simplified to starting a Docker container by running:

Terminal window
docker run \
--restart unless-stopped \
--privileged \
--volume /dev/bus/usb:/dev/bus/usb \
--publish 3121:3121 \
--detach \
ghcr.io/stv0g/hw_server:v2021.2

It also allows us to run the hw_server on architectures which are not natively supported by Xilinx such as the commonly used Aarch / ARM64 and ARMv7 architectures found in Raspberry Pis.

This is enabled by Dockers support for running container images for non-native architectures. I am using the aptman/qus Docker image ( /dbhi/qus ) to setup this user-mode emulation. The qemu-user-static (qus) image is a compilation of utilities, examples and references to build and execute OCI images (aka docker images) for foreign architectures using QEMU’s user-mode emulation.

Run the following commands to run the hw_server on a embedded device:

Terminal window
# Install docker
sudo apt-get update && sudo apt-get upgrade
curl -sSL https://get.docker.com | sh
# Start Docker
sudo systemctl enable --now docker
# Enable qemu-user emulation support for running amd64 Docker images
# *Note:* only required if your system arch is not amd64!
docker run --rm --privileged aptman/qus -s -- -p x86_64
# Run the hw_server
docker run --restart unless-stopped --privileged --volume /dev/bus/usb:/dev/bus/usb --publish 3121:3121 --detach ghcr.io/stv0g/hw_server:v2021.2

This setup has been tested with a Raspberry Pi 4 running the new 64-bit Debian Bullseye Raspberry Pi OS.

The pre-built Docker image for the hw_server of Vivado 2021.2 is available via:

/stv0g/xilinx-hw-server-docker (Packages)

Detailed instructions can be found at Codeberg: /stv0g/xilinx-hw-server-docker .

Casting between Qt and OpenCV primitives

OpenCV & QT
OpenCV & QT.

As a follow-up to the previous post, I’d like to present some code which I think might be helpful for other Qt / OpenCV projects as well.

This code was written for Pastie. Pastie is a piece of software I wrote as part my image processing seminar. It makes use of the well known libraries:

  • Qt for the graphical user interface
  • OpenCV for image processing and computer vision

I wrote a C++ header file to facilitate the co-operation of those two libraries. This file enables the conversion / casting of OpenCV and Qt types e.g.:

#include <QImage>
#include <cv/core.hpp>
QImage qimg("filename.png");
cv::Mat cvimg = toCv(qimg);

The source code is available at Codeberg: /stv0g/snippets/c/qcv_cast.h .

The following conversions are supported:

QImagecv::Mat
QTransformcv::Mat
QPointcv::Point2i
QPointFcv::Point2f
QRectcv::Rect2i
QRectFcv::Rect2f
QSizecv::Size

You can find some examples in the real code here: /stv0g/pastie/filters/pattern.cpp and here /stv0g/pastie/cast.h .

calcelestial

Planets of the Solar System

/stv0g/calcelestial ist ein kleines Linux-Tool zum Berechnen von Auf- und Untergangszeiten sowie der Position sämtlicher Planeten unseres Sonnensystems.

Es ist der Weiterentwicklung von /stv0g/sun , das ursprünglich als kleines Bash-Skript für meinen Router startete. Mittlerweile ist das Tool zu einem weit umfangreicherem Werkzeug gewachsen, welches nicht mehr nur die Auf- und Untergangszeit der Sonne berechnen kann:

Es sind mit dem Mond, Mars, Neptun, Jupiter, Merkur, Uranus, Saturn, Venus und Pluto eine Menge neuer Planeten dazugekommen. Auch kann nun die Position dieser Himmelskörper zu jedem beliebigen Zeitpunkt oder dem Auf- und Untergang berechnet werden.

Nun bin ich selber kein kleiner Hobby-Astronom, sodass ich diese ganzen Berechnungen aus dem Ärmel schütteln könnte. Stattdessen nutze ich die Bibliothek libnova. libnova benutzt die sehr genauen Algorithmen “Variations Séculaires des Orbites Planétaires” (kurz VSOP-87), die Pierre Pratagnon 1987 entwickelte.

Terminal window
$ calcelestial
Usage:
calcelestial [options]
Options:
-p, --object calc for celestial object: sun, moon, mars, neptune,
jupiter, mercury, uranus, saturn, venus or pluto
-H, --horizon calc rise / set time with twilight: nautic, civil or astronomical
-t, --time calc at given time: YYYY-MM-DD [HH:MM:SS]
-m, --moment calc position at moment of: rise, set, transit
-n, --next use rise, set, transit time of tomorrow
-f, --format output format: see strftime (3) for more details
-a, --lat geographical latitude of observer: -90° to 90°
-o, --lon geographical longitude of oberserver: -180° to 180°
-q, --query query geonames.org for geographical coordinates
-z, --timezone override system timezone
-u, --universal use universial time for parsing and formatting
-h, --help show this help
-v, --version show version
A combination of --lat & --lon or --query is required.
Please report bugs to: post@steffenvogel.de

Die einfachste Variante nutzt das Unix Tool at:

Terminal window
echo ~/bin/enable-lightning | at $(calcelestial -p sun -m set -q Frankfurt -H civil)

Mit folgenden Cronjobs, lässt sich dieses Prinzip auch leicht auf andere Anwendungen übertragen:

0 0 * * * echo 'fnctl stop && fnctl fade -c 000000' | at $(calcelestial -m rise -p sun -q Aachen)
0 0 * * * echo 'fnctl start' | at $(calcelestial -m set -p sun -q Frankfurt)

Mit dem Tool nvram-wakeup, lässt sich so beispielsweise der Rechner jeden Tag 10 Minuten for Sonnenaufgang automatisch starten:

Terminal window
nvram-wakeup -s $(date -d "-10 min $(calcelestial -m rise -p sun -q Berlin)" +%s)

Oder möchtest du deinen Rechner nach Sonnenuntergang automatisch herunterfahren?

Terminal window
shutdown $(date -d +10 min $(calcelestial -m rise -p sun --lat=50.55 --lon=-6.2) +%H:%M)

Die aktuelle Position des Mondes kann beispielsweise so bestimmt werden:

Terminal window
calcelestial -p moon -q Aachen -f "az: §a alt: §h"

Detailiertere Dokumentation findet ihr in der Manpage calcelestial(1).

calcelestial ist wie immer auf Codeberg verfügbar /stv0g/calcelestial .

GitHub Migration

Source: https://octodex.github.com

Heute habe ich meine 27 git-Repositories auf Github ( /stv0g ) umgezogen. Ich habe mich entschlossen sie so einer größeren Öffentlichkeit zugänglich zu machen und als zusätzliches Backup auf meinem Server zu spiegeln.

Seit kurzem hat github seine neue API v3 veröffentlicht. Auf dieser aufbauend habe ich ein PHP Script geschrieben, welches meine existierenden Repositories bei github anlegt und migriert.

  1. Das Script in das Wurzelverzeichnis aller Repositories ablegen
  2. github Username und Passwort im Skript anpassen
  3. php github.php

Das Script ist auf Codeberg verfügbar: /stv0g/snippets/php/github.php .

Ein paar weitere Features des Skriptes umfassen::

  • Es wird automatisch ein entsprechende github Remote im Repository hinzugefügt
  • Alle in der Datei gitweb.projects gelisteten Repositories werden als öffentlich markiert
  • Befindet sich im Repository eine Datei description wird deren Inhalt übernommen
  • Per Exclude-Filter können bestimmte Repositories ausgeschlossen werden

transcode

Digital Logic Diagram
Assembler code

Ich sitze im Zug nach Hause. Gerade komme ich von der letzten Vorlesung des zweiten Semesters: Informatik. Eigentlich bin ich auf dem Weg in die Semester-”Ferien”, ständen da nicht für den nächsten Monat noch 4 Klausuren in meinem Kalender 😉.

Informatik, Grundlagen des Digitalrechners. Klingt eigentlich recht trocken. Trotzdem ist es klar mein Favorit unter den Fächern dieses Semesters. Als Ergänzung zur Vorlesung richtete unser Professor einen kleinen Wettbewerb aus. Mein Beitrag zum Students Englightment Award ist ein Compiler Frontend für den GNU Compiler der Atmel AVRs.

Teil der Vorlesung war die Einführung des Mikrocontrollers ATMega8 von Atmel und dessen Programmierung mit Assembler. Dabei lernten wir zuerst die Schaltungstechnischen Grundlagen und die Minimierung von Schaltnetzen. Anschließend sind wir auf den Aufbau der Zentralen Recheneinheit eingegangen (Steuerwerk, ALU).

transcode kompiliert & assembliert ANSI C und Assembler in Maschinencode und umgekehrt. Dabei wird mit Hilfe von Debugging Informationen ein Bezug zwischen Zeilen im C-Code und den Mnemonics hergestellt. Durch Auswählen von Zeilen werden Bezüge direkt durch Hervorhebungen dargestellt. Für die Darstellung des Maschinencodes lässt sich zwischen binär, dezimal & hexadezimaler Form wählen.

volkszaehler.org Zählerbox

Die volkszaehler.org Zählerbox
Die volkszaehler.org Zählerbox.

Das volkszaehler.org Projekt nähert sich mit großen Schritten seiner ersten stabilen Version und damit dem ersten Release.

Ich möchte hier nur einen kurzen Überblick über den aktuellen Stand geben. Du kennst das Projekt noch gar nicht? Weiß nicht was Smart-Meter sind? Da steigst du besser auf unsere Projekt Website ein!

Für die Entwicklung am Projekt habe ich mir eine kleine Hutschienenbox gebaut. Sie eignet sich perfekt für den mobilen Einsatz und zum Testen neuer Firmware und Funktionen. Mal schnell den Verbrauch des eigenen Kühlschranks zu erfassen ist kein Problem. Derzeit ist mein Schreibtisch an die Box angeschlossen und liefert so aktuelle Daten für die Demo Installation des Projektes.

Die Box enthält folgende Komponenten:

  • ~230V Eingang über Kaltgerätestecker (geerdet, max. 10 Ampere)
  • ~230V Ausgang über Schukostecker (geerdet, max. 16 Ampere)
  • Sicherungsautomat (Ein-/Ausschalter)
  • B&G E-Tech DRS-154D S0-Zähler (einphasig, 2000 Impulse/kWh)
  • Udo’s S0-Server (basierend auf Atmel AVR’s & ethersex, 10 Mbit/s Ethernet, TFTP Bootloader)
  • Knopf zum manuellen Triggern von Impulsen
  • externer Anschluss von Zählern

Conway's Game of Life

Conway's Game of Life Screenshot
Conway's Game of Life Screenshot.

Als Übung für meine Informatik Vorlesung an der RWTH Aachen habe ich diese C Implementation von Conways Game of Life geschrieben.

Dieses simple “zero player” Game wird komplett im Terminal ausgeführt. Mit Mausunterstützung und Farben wurden mit libncurses realisiert.

Den Quelltext findet ihr inklusive eines Makefiles auf Codeberg: /stv0g/rwth-info1/src/conway.c .

  • p” pausiert das Spiel
  • q” beendet das Spiel
  • c” leert das Spielfeld
  • Leertaste setzt eine neue Zelle in das aktuelle Feld
  • Pfeiltasten bewegen den Cursor
  • Maus kann zum Bewegen des Cursors genutzt werden
  • 0” fügt ein chaotisches Anfangsmuster ein
  • 1” fügt einen Glider in das Spielfeld ein
  • 2” fügt einen Segler in das Spielfeld ein
  • 3” fügt einen Buffer in das Spielfeld ein
  • +” erhöht die Anzahl der Generationen pro Sekunde (frames per second)
  • -” erniedrigt die Anzahl der Generationen pro Sekunde (frames per second)

/dev/nulll - Eine Plattform für Entwickler und Tüftler

/dev/nulll Logo

Micha und Steffen haben, wie viele Bastler, im Laufe der Zeit viele kleine Tools entwickelt, die bei mehr oder weniger alltäglichen Problemen helfen. Wir fanden, dass sie zu schade sind, um willkürlich verteilt auf verschiedenen Festplatten herum zu liegen und schließlich in Vergessenheit zu geraten. Uns fehlte oft die Übersicht und eine angemessene Dokumentation. Oder wir wollten bestimmte Projekte einfach nicht auf unseren eigenen Websites veröffentlichen.

Tiny DNS & URL aka SDDNS

SDDNS Favicon

Zusammen mit Micha besuchte ich Ende letzten Jahres das U23 des C4 in Köln. Dort habe ich viel über die Techniken des Internets gelernt. Unter anderem ging es hier auch um das Domain Name System, das für die Namensauflösung im Internet verantwortlich ist.

Mittlerweile betreibe ich einen eigenen DNS Server für meine Domains (0l.de, steffenvogel.de, griesm.de & vogel.cc).

Zudem biete ich euch kostenloses DNS Hosting. Gerne übernehme ich auch die DNS Administration eurer Domains. Jedoch könnt ihr sicherlich verstehen, dass ich euch dafür dann nichts garantieren kann.

Mit der Zeit habe ich ein Webinterface für den DNS Server Bind entwickelt auf das nun jeder Zugriff hat. Ihr könnt eigene Subdomains registrieren, Records setzen und URL Weiterleitungen einrichten. Dynamisches DNS wird ebenso unterstützt.

Es ist auch möglich URLs zu verkürzen und so beispielsweise die URL: https://maps.google.com/maps/ms?ie=UTF8&hl=en&msa=0&msid=100237997621038330776.000468b0a95f89721a96e&ll=18.646245,15.820313&spn=120.933723,198.632813&z=3 auf http://a.0l.de abzukürzen Das ist vergleichbar mit dem Service von TinyURL. Jedoch sind meine URLs dann um 7 Zeichen kürzer 😊. Im Gegensatz TinyURL sind meine URLs auch nur über die Subdomains erreichbar. Eine direkte Unterscheidung zwischen eigenem DNS Record und einer simplen URL Weiterleitung ist also nicht möglich.

Service Wiki/Doku

Noxon 2 Audio Interna

Nachdem ich mich im vorherigen Beitrag über die Verwendung des Noxon’s als Last.fm Client ausgelassen habe, werde ich mich diesmal tiefer in die Interna des Streaming Clients wagen.

Genauer geht es um das Ersetzten/Erweitern der vTuner Stations Liste und das Hinzufügen eigener Services in das “My NOXON” beziehungsweise “Podcasts” Menü.

Terratec Noxon 2 Screen
Terratec Noxon 2 Screen.

Der etwas andere Login Prompt

Mein nun 30. Artikel ist das Resultat einer Idee aus meinem Spanien-Urlaub. Es handelt sich um einen etwas anderen Login Prompt, der bei weitem nicht die nötige Sicherheit für kritische Anwendungen bietet, dafür aber von jedem “Insider” ohne vorherige Absprache zu lösen sein sollte.

glider

Eigentlich ohne jeden Verwendungszweck hab ich einfach mal los entwickelt.

Rein rechnerisch müsste es 2^9 = 512 verschiedene Kombinationen geben. Nehmt euch mal ne halbe Stunde Zeit und probiert alle Kombinationen aus .

Viel Spaß beim drauf los Probieren. Ich will euch mal keine weiteren Hinweise geben.

Keine Angst! Es gibt einfachere Methoden. Jeder, der es schafft, hat die Kombination auch schon einmal gesehen.

Quelltext

Das n-Damen Problem

Für meine morgige Informatik-Klausur habe ich mich mal wieder an C++ gewagt um einen Algorithmus zu implementieren. Die Hauptthemen der Klausur werden das n-Dame Problem und das Josephus Problem sein.

JS, PHP & CSS Frontend
JS, PHP & CSS Frontend.

Für das n-Damen-Problem habe ich eine iterative Backtracking-Implementation in C++ geschrieben. Zudem ist es auch mein erstes funktionsfähiges und komplexeres C++ Programm 😉.

Um euch meine Ergebnisse zeigen zu können, habe ich mich bei der PHP, JS & CSS Version meines Freundes Micha bedient und sie leicht angepasst.

Das PHP-Script ruft über den Backtick-Operator das C++ Programm auf und stellt es anschließen mit JS und CSS dar.

Um den Server zu schonen habe ich die maximale Feldgröße auf 13 beschränkt. Das sind zu mindestens schon mal fünf Damen mehr als bei der PHP-Version.

Ohne die Beschränkung sind auch Problemgrößen bis 16 in einem angemessenen Zeitrahmen zu bewältigen. An den Weltrekord (25 Damen) komme ich jedoch noch nicht 😉.

Den Quellcode des C++ Programms findet ihr auf Codeberg: /stv0g/snippets/c++/ndame

My first Lines of Quick Basic

Beim Aufräumen sind mir gerade meine ersten Zeilen Code auf den Mauszeiger gefallen. In der fünften Klasse begann ich mit Quick Basic meine ersten Programmier Erfahrungen zu sammeln. Meine erste Zeile dürfte wohl ein einfaches beep gewesen sein. Danach ließ es mich nicht mehr so schnell los und ich schrieb zahlreiche kleine Programme in Quick Basic. So war mein erstes umfangreicheres Programm eine Lichtorgel, die über den LPT-Port eine Relais-Karte ansteuerte und zahlreiche vorprogrammierte Abläufe wiedergab.

Zum Entwickeln habe ich mir eine kleines LPT LED Modul gebastelt:

LPT LED Modul
LPT LED Modul.
Download:Lichtorgel

Mein zweites Projekt war ein Programm zum Erfassen von Rundenzeiten. Anfangs benutzte ich es für meine Carrera Bahn dann für mein RC-Car. Je nach dem wurde die Zeit per Laserlichtschranke oder per Reed-Relais gemessen. Anfangs wurden die Signale über eine umgebaute Tastatur eingelesen. Später habe ich dann schließlich den COM-Port verwendet. Das Programm wird teilweise noch heute für die Carrera Bahn benutzt und wird deswegen manchmal auch noch weiterentwickelt. Die gemessenen Zeiten werden auf dem Bildschirm ausgegeben und zusätzlich in eine Datei geschrieben. Auch eine Ampel ist integriert. Diese kann ihre Signale auch akustisch und über den LPT-Port ausgeben. Mit der entsprechenden Relais-Karte von der Lichtorgel lässt sich so eine größere Ampel realisieren.

Download:RaceTime
Screenshot der RaceTime GUI
Screenshot der RaceTime GUI.

Abschließend will ich hier noch ein paar andere, kleine Programme aus dieser Zeit festhalten:

Download:First Lines

Delphi 2D-Autorennen

Als Abschluss des Informatik Grundkurses der elften Klasse möchte ich hier nun unsere Implementierung eines 2D Autorennspiels in Delphi vorstellen. Anfangs bestand die Aufgabenstellung darin ein ein-dimensionales Rennspiel zu entwickeln, bei dem der Spieler mit den schnelleren Fingern gewinnt. Also quasi ein einfaches Geschicklichkeitsspiel. Anfangs sind wir daher nur auf einer Linie gefahren. Aber wer hätte es gedacht? Nach einer Zeit wurde das ziemlich langweilig. Und da wir noch genügend Zeit hatten, strukturierten wir unseren Code grundlegend neu und fügten die Simulation von Beschleunigung und Verzögerung hinzu.

Screenshot des 2D Autorennens
Screenshot des 2D Autorennens.

Trotzdem sind wir noch nicht über die erste Dimension hinaus gekommen. Nachdem nach der vierte Doppelstunde immer noch nicht alle fertig waren und wir schon dabei waren Extras und Cheats einzubauen, habe ich mich dann entschlossen in die zweite Dimension zu gehen. Die kleine Physik-Engine behielten wir bei und fügten die Möglichkeit hinzu die Autos zu lenken. Aber nun hatten wir ein Problem: wie wird die nun zwei-dimensionale Strecke begrenzt? ine Strecke mit Canvas Objekten zu zeichnen war uns zu aufwendig und auch nicht gerade sehr schön. Wir bedienten uns daher einer Technik die auch als “Colorcoding” bekannt ist: verschiedene Farben in einer Bitmap markieren, fahrbare Bereich und Barrieren. Einen Rundenzähler und eine Konfigurationsdatei rundeten schließlich das Projekt ab.

Color Coding der Fahrbahn
Color Coding der Fahrbahn.

Wir legten diesmal viel Wert auf die objektorientierte Entwicklung des Codes, da dies das aktuelle Unterrichtsthema ist.

Ein Frontend für die Einstellungen sparten wir uns, um uns mehr auf die “Physik” konzentrieren zu können. Die Einbindung eines INI-Files lernte ich nebenbei auch noch. Das Autorenn Program ist also als Gegenstück zum Potenzübungs Program zu sehen. Hierbei legten wir mehr Wert auf ein schönes GUI mit Hilfe und Installer.

Ihr könnt den Quellcode gerne für eure Projekte weiterverwenden. Ich bitte jedoch um einen kurzen Kommentar und einen Hinweis im GUI, Danke

Download:2D Delphi-Autorennen

Des Weiteren ist das Projekt auch auf Codeberg zu finden: /stv0g/2d_autos .