produnis.de

Allgemeine Informationen

Infos eintragen

Links zur Seite

Homepage | Seite auf archive.org

Letzte Artikel

Dynamisches DNS mit ddclient aktualisieren31.03.

Mein Heimserver ist seit Jahren über eine dynamische-DNS-Adresse von spDYN per SSH erreichbar. Da ich einer der letzten glücklichen kleinen Lichter bin, die noch eine echte IP4-Adresse erhalten (und keine genattete), kann ich mich so immer von überall auf meine Kiste einloggen. Bislang habe ich meine aktuellen IP-Adressen mittels Script geupdatet. weiterlesen »

Ein privates Netz mit Wireguard erstellen22.03.

In den letzten Blogposts habe ich gezeigt, wie ich mein privates VPN mit openVPN aufsetze. In diesem Post wiederhole ich das - nur eben mit Wireguard. OpenVPN und Wireguard können auch problemlos nebeneinander laufen, wenn sie verschiedene Netzmasken benutzen. weiterlesen »

Android-Geräte dem VPN hinzufügen und IPv618.03.

Im letzten Blogpost habe ich beschrieben, wie ich mein privates Netz mit openVPN aufbaue. In diesem Post möchte ich zeigen, wie man Android-Geräte dem Netz hinzufügen kann, und was ich tun musste, damit der Server korrekt auf IPv4 und IPv6-Anfragen lauscht. IPv6 Mein Heimserver, der die VPNs aufbaut, ist sowohl per IPv4 als auch per IPv6 erreichbar. weiterlesen »

Ein privates Netz mit openVPN erstellen15.03.

In diesem Blogpost zeige ich Schritt für Schritt, wie ich mein privates openVPN-Netzwerk aufgebaut habe. Zu dem Thema gibt es übrigens eine sehr empfehlenswerte Podcastfolge von Request for Comments, in welcher Clemens Schrimpe ausführlich über VPN spricht. Mein VPN soll die IPs 10.5.5.0/24 verwenden und “nur” dazu dienen, die Clients miteinander zu verbinden. weiterlesen »

Mein KDE Plasma Panel19.02.

Ich verwende KDE (also Plasma) als Desktop. Ich habe eh begrenzten vertikalen Platz (meine Bildschirme sind breiter als lang), und durch ein Panel oben oder unten würde dieser Platz noch weniger werden. weiterlesen »

ArchLinux auf einem Laptop installieren (mit Verschlüsselung)08.02.

In diesem Blogpost möchte ich zeigen, wie ich ArchLinux auf einem Laptop installiere. Hierbei erfolgt die Installation auf eine verschlüsselte Partition, was bei tragbaren Geräten empfehlenswert ist. weiterlesen »

systemd.service zu bestimmten Zeiten starten und stoppen18.01.

Ich möchte einen bestimmten systemd Service zu bestimmten Zeiten starten und stoppen. Im Detail geht es um meinen BOINC-Client. Dieser soll von Montag bis Freitag um 17:00 Uhr gestartet, und (ebenfalls von Montag bis Freitag) um 8:00 Uhr morgens gestoppt werden. Der BOINC-Client bringt bereits seine eigene boinc-client.service-Datei mit, so dass der Dienst mittels systemctl start boinc-client.service und systemctl stop boinc-client.service gestartet und gestoppt werden kann. Mittels systemd sollen diese Befehle zu den genannten Zeiten ausgeführt werden. Wrapper-Services Ich erstelle mir zwei Hilfs-Services, die jeweils den BOINC-Client starten und stoppen. FÜr den Starter-Service: sudo nano /etc/systemd/system/start-boinc.service [Unit] Description=Start boinc service After=network.target [Service] Type=oneshot ExecStart=/usr/bin/systemctl start boinc-client.service [Install] WantedBy=multi-user.target Für den Stopper-Service: sudo nano /etc/systemd/system/stop-boinc.service [Unit] Description=Stop boinc service After=network.target [Service] Type=oneshot ExecStart=/usr/bin/systemctl stop boinc-client.service [Install] WantedBy=multi-user.target Timer Jetzt brauche ich nur noch zwei Timer, die jeweils die Wrapper-Services auslösen. Für den Starter: sudo nano /etc/systemd/system/start-boinc.timer [Unit] Description=Timer for starting BOINC client [Timer] OnCalendar=Mon-Fri *-*-* 17:00:00 [Install] WantedBy=timers.target Für den Stopper: sudo nano /etc/systemd/system/stop-boinc.timer [Unit] Description=Timer for stopping BOINC client [Timer] OnCalendar=Mon-Fri *-*-* 08:00:00 [Install] WantedBy=timers.target Timer aktivieren Jetzt müssen die neuen Dateien systemd bekannt gemacht werden: sudo systemctl daemon-reload Anschließend werden die Timer aktiviert. sudo systemctl enable --now start-boinc.timer sudo systemctl enable --now stop-boinc.timer Wir können noch überprüfen, ob alles bereit ist. sudo systemctl status start-boinc.timer sudo systemctl status stop-boinc.timer Fertig. weiterlesen »

Meine Quarto Extensions15.01.

Ich habe die letzten Tage damit verbracht, eigene kleine Extensions für quarto zu schreiben und bei Github zu veröffentlichen. Vielleicht ist ja für den einen oder die andere eine passende Extension dabei… Quarto Letter Mit dieser Extension könnt ihr Briefe mittels Quarto erstellen. weiterlesen »

Countdown Timer für quarto revealjs04.01.

Manchmal möchte ich mein Auditorium über eine Aussage, eine Theorie oder einen anderen Gedanken nachdenken lassen. Deshalb habe ich mir für meine Folien einen kleinen Timer in Javascript gebaut, der eine gewünschte Anzahl an Minuten oder Sekunden herunterzählt. Javascript Ich erstelle die Datei timer.js und gebe ihr folgenden Inhalt: // inspired by Mateusz Rybczonec const FULL_DASH_ARRAY = 283; const WARNING_THRESHOLD = 10; const ALERT_THRESHOLD = 5; const COLOR_CODES = { info: { color: "green" }, warning: { color: "orange", threshold: WARNING_THRESHOLD }, alert: { color: "red", threshold: ALERT_THRESHOLD } }; // Funktion zur Initialisierung des Timers in einem Container function initializeTimer(containerId, timeLimit) { let timePassed = 0; let timeLeft = timeLimit; let timerInterval = null; let remainingPathColor = COLOR_CODES.info.color; // Dynamisches Erstellen des Timer-HTML-Inhalts für jeden Container document.getElementById(containerId).innerHTML = ` <div class="base-timer"> <svg class="base-timer__svg" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"> <g class="base-timer__circle"> <circle class="base-timer__path-elapsed" cx="50" cy="50" r="45"></circle> <path id="${containerId}-path-remaining" stroke-dasharray="283" class="base-timer__path-remaining ${remainingPathColor}" d=" M 50, 50 m -45, 0 a 45,45 0 1,0 90,0 a 45,45 0 1,0 -90,0 " ></path> </g> </svg> <span id="${containerId}-label" class="base-timer__label">${formatTime( timeLeft )}</span> </div> `; startTimer(); // Startet den Timer für einen bestimmten Container function startTimer() { timerInterval = setInterval(() => { timePassed = timePassed += 1; timeLeft = timeLimit - timePassed; document.getElementById(`${containerId}-label`).innerHTML = formatTime( timeLeft ); setCircleDasharray(); setRemainingPathColor(timeLeft); if (timeLeft === 0) { onTimesUp(); } }, 1000); } // Funktion, die aufgerufen wird, wenn der Timer abgelaufen ist function onTimesUp() { clearInterval(timerInterval); } // Funktion zur Formatierung der verbleibenden Zeit function formatTime(time) { const minutes = Math.floor(time / 60); let seconds = time % 60; if (seconds < 10) { seconds = `0${seconds}`; } return `${minutes}:${seconds}`; } // Funktion zur Festlegung der Farbe des verbleibenden Pfades basierend auf der verbleibenden Zeit function setRemainingPathColor(timeLeft) { const { alert, warning, info } = COLOR_CODES; const pathId = `${containerId}-path-remaining`; if (timeLeft <= alert.threshold) { document.getElementById(pathId).classList.remove(warning.color); document.getElementById(pathId).classList.add(alert.color); } else if (timeLeft <= warning.threshold) { document.getElementById(pathId).classList.remove(info.color); document.getElementById(pathId).classList.add(warning.color); } } // Funktion zur Berechnung des Anteils der verstrichenen Zeit function calculateTimeFraction() { const rawTimeFraction = timeLeft / timeLimit; return rawTimeFraction - (1 / timeLimit) * (1 - rawTimeFraction); } // Funktion zur Festlegung der Strichlänge des verbleibenden Pfades basierend auf dem Anteil der verstrichenen Zeit function setCircleDasharray() { const circleDasharray = `${( calculateTimeFraction() * FULL_DASH_ARRAY ).toFixed(0)} 283`; document .getElementById(`${containerId}-path-remaining`) .setAttribute("stroke-dasharray", circleDasharray); } } quarto Dokument Innerhalb des quarto-Dokuments kann ein Timer wie folgt eingebunden werden: <div id="UNIQUE-ID"></div> <script src="timer.js"></script> <script> document.addEventListener("DOMContentLoaded", function () { initializeTimer("UNIQUE-ID", SECONDS); }); </script> …wobei UNIQUE-ID an beiden Stellen durch eine eindeutige ID und SECONDS durch die gewünschte Anzahl an Sekunden ersetzt werden müssen. Ein Beispiel für einen 4minütigen Timer könnte so aussehen: Please think about this for 4 minutes. <div id="4minWaiting"></div> <script src="timer.js"></script> <script> document.addEventListener("DOMContentLoaded", function () { initializeTimer("4minWaiting", 240); }); </script> Es können beliebig viele Timer verwendet werden, solange immer eine eindeutige UNIQUE-ID verwendet wird. Weblinks https://quarto.org https://github.com/quarto-dev/quarto-cli/discussions/8127 weiterlesen »

lokale Fonts in quarto revealjs einbinden04.01.

Mit quarto können über revealjs schöne HTML-Folien erstellt werden. Über die YAML-Parameter format: revealjs: embed-resources: true wird eine HTML-Datei erzeugt, die alle benötigten Daten (z.B Medien- oder Scriptdateien) enthält. weiterlesen »

Anscombe-Quartett15.10.

Ich verwende in der Lehre gerne das Anscombe-Quartett, welches der englische Statistiker Francis Anscombe im Jahr 19731 vorgestellt hat. Es besteht aus 4 kleinen Datensätzen mit jeweils 11 Beobachtungen von 2 Variablen (x, y). weiterlesen »

Update IPv6-Präfix bei spDYN03.10.

Mein Heimserver ist seit Jahren über eine dynamische-DNS-Adresse von spDYN per SSH erreichbar. Da ich einer der letzten glücklichen kleinen Lichter bin, die noch eine echte IP4-Adresse erhalten (und keine genattete), konnte ich mich so immer von überall auf meine Kiste einloggen. Letztens hatte ich folgendes Problem: aus dem Mobilnetz konnte ich keine Verbindung zum Server herstellen, stattdessen bekam ich die Fehlermeldung 1005 EACCESS permission denied. Nach etwas hin und her habe ich die Ursache gefunden: aus dem Mobilnetz heraus habe ich nur IPv6 die spdDYN-Adresse wird nur für IPv4 betrieben die aus dem IP4 magisch herausgezogene IPv6-Adresse zeigt auf meinen Router, und nicht auf den Heimserver Lösung: eine dynamische DNS-Adresse für IPv6 anlegen Das geht bei oben genanntem Service recht einfach. weiterlesen »

Lemmy anstatt Reddit, um ich_iel zu lesen02.07.

Ich habe Reddit eigentlich kaum genutzt, naja, eigentlich doch schon täglich. Allerdings nur, um wasletztepreis und ich_iel zu lesen. Nach dem ganzen Chaos um die API bin ich nun nach Lemmy umgezogen. Account anlegen Zuerst müsst ihr euch einen Lemmyaccount bei einer Instanz eurer Wahl erstellen. weiterlesen »

HTML-Dateien mit dem Smartphone oder Tablet öffnen13.06.

Ich setze meine Folien für die Lehre mittels quarto. Als Ausgabeformat nehme ich revealjs. Das heisst, dass eine HTML-Datei erzeugt wird, die ich dann in der Lehre per Browser im Vollbildmodus abspiele. Jetzt haben sich Studierende mit dem Problem gemeldet, dass ihr Smartphone oder Tablet nicht in der Lage sei, die bereitgestellten HTML-Dateien (also meinen Foliensatz) zu öffnen. weiterlesen »

PDF-Dokumente mit Okular digital signieren02.03.

Um PDF-Dateien elektronisch zu signieren nutze ich Okular und meinen Thunderbird-Zertifikatemanager. Verwendet wird hierbei ein PKI-Schlüssel, den ich (in anderer Form) von meiner Hochschule erhalten haben. Schlüssel ins PKI-Format bringen Meine Methode nutzt den Thunderbird-Zertifiaktemanager, und dieser nimmt nur PKCS12-Zertifikate an. Von meiner Hochschule habe ich ein Zertifikat im PEM-Format erhalten (cert.pem und key.pem), mit dem Thunderbird nichts anfangen kann. weiterlesen »

Orte mit ggplot() auf eine OpenStreetMap plotten27.11.

Ich habe in einem Tibble mehrere Adressen (z.B. von Kunden, Kooperationspartnern etc.) und möchte diese auf einer OpenStreetMap plotten. Dies kann mit dem {OpenStreetMap}-Paket und ggplot() umgesetzt werden. Skurrile Adressen Erzeugen wir uns zunächst ein paar skurrile Testadressen. library(tidyverse) # Erzeuge Tibble mit skurrilen Adressen Orte <- tribble( ~Strasse, ~PLZ, ~Ort, "Beamtenlaufbahn", 24103, "Kiel", "Bremsweg", 19057, "Schwerin", "Zäher Wille", 68305, "Mannheim", "Ameisenstraße", 04249, "Leipzig", "Am Schmerzenmösle", 78464, "Allmannsdorf", "Unter Fettenhennen", 50667, "Köln", "Im Himmel", 58285, "Gevelsberg", "Unterer Fauler Pelz", 69117, "Heidelberg", "Seidenes Strümpfchen", 34117, "Kassel", "Im Sack", 27321, "Thedinghausen", "Rutschbahn", 20146, "Hamburg", "Zornige Ameise", 45134, "Essen", "Mafiastraße", 47249, "Duisburg" ) Hilfsfunktion Jetzt benötigen wir eine kleine Hilfsfunktion, mit welcher wir die Adressen in Längen- und Breitenangaben (longitude, latitude) umwandeln können. weiterlesen »

Quarto Markdown Snippets06.11.

In RStudio kann man sich “Snippets” - so eine Art “Shortcuts” hinterlegen. Dabei definiert man ein Signalwort und einen Aktionstext. Wenn das Signalwort im Quartodokument ausgeschrieben ist, drückt man SHIFT + TAB, und das Signalwort wird durch den Aktionstext ersetzt. weiterlesen »

tikz unter quarto verwenden13.10.

Bislang habe ich meine Folien mit LaTeX-beamer als PDF gesetzt. Mit quarto können Vortragsfolien mittels revealjs zu HTML-Seiten gerendert werden. Mit LaTeX habe ich häufig tikz-Bilder in meine Folien eingebaut. weiterlesen »

Simpler quarto-bot für Nextcloud23.09.

Ich nutze quarto unter anderem dafür, meine Briefe als PDF zu rendern. Damit dies auch auf dem Handy oder Tablet funktioniert, baue ich mir einen kleinen Bot, der einen Nextcloud-Ordner per Webdav mountet, nachschaut, ob eine .qmd-Datei im Verzeichnis liegt, und auf diese dann das Kommando quarto render DATEI ausführt. weiterlesen »

Briefvorlage für quarto erstellen12.09.

Wir erstellen eine einfache Briefvorlage für quarto, so dass ein schönes PDF erzeugt wird. weiterlesen »

KaTeX zusammen mit cactus.chat06.03.

Möchte man KaTeX und cactus.chat gemeinsame verwenden, muss man sicherstellen, dass KaTeX nicht in den -Container von cactus.chat reinschreibt… weiterlesen »

KaTex für HUGO und Blogdown22.02.

KaTex übersetzt die wichtigsten LaTex-Mathe-Notationen in HTML. Die Verwendung unterscheidet sich in Blogdown und HUGO. weiterlesen »

Templates für Briefe und Rechnungen in RMarkdown erstellen10.04.

1 Einleitung Ich nutze RMarkdown und RStudio schon seit längerem für statistische Auswertungen und Beispielrechnungen in der Lehre. Für meine Briefe und Rechnungen habe ich immer LaTeX verwendet. Im Dezember habe ich dann dieses Video von Rob Hyndman gesehen: https://www.youtube.com/watch?v=_D-ux3MqGug …und dachte mir: das will ich auch! Zu dieser Anleitung gibt es ein Github-Repo mit dem Template-Paket und der Rmd-Datei dieser Anleitung: https://github.com/produnis/RMarkdownMyStyle. Außerdem ist der Arikel bei RPubs.com veröffentlicht, und dort etwas „hübscher“ dargestellt, siehe https://rpubs.com/produnis/RMarkdownTemplates. 1.1 Vorwarnung Diese Anleitung setzt voraus, dass Sie Ihre Briefe und Rechnungen bereits in LaTeX schreiben, bzw, dass eine Brief- oder Rechnungsvorlage in LaTeX vorliegt. weiterlesen »

Login bei MediaWiki mit Python27.01.

Es gibt zwei Möglichkeiten, sich bei MediaWiki einzuloggen, per api.php als „normaler“ User (über die index.php) api.php Diese Variante setzt voraus, dass du Special:BotPasswords für deinen Account vergeben hast. weiterlesen »

XFCE Autostart verzögern08.09.

Manche Programme, die ich im Autostart betreibe, starten bei mir unter XFCE so schnell, dass ihre Icons nicht im Benachrichtigungs-Panel erscheinen – eben weil das Panel noch nicht bereit ist. Dies betrifft bei mir z.B. weiterlesen »