produnis.de

Allgemeine Informationen

Infos eintragen

Links zur Seite

Homepage | Seite auf archive.org

Letzte Artikel

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 »

Subsonic ist tot, es lebe Airsonic29.08.

Seit ein paar Jahren habe ich einen Subsonic-Server für meine Musik. Ich habe sogar die 12,- Euro Zwangsabgabe pro Jahr bezahlt, damit meine Clients auf den Server zugreifen können. Heute hab ich Subsonic zu Gunsten von Airsonic verworfen. weiterlesen »

IPv6 im Congstar Mobilnetz29.06.

Ich nutze Android8 und habe festgestellt, dass ich mir im Congstar Mobilnetz eine IPv6-Adresse geben kann. Hierzu gehe ich in den Einstelungen zu VERBINDUNGEN – MOBILE NETZWERKE – ZUGANGSPUNKTE – und wähle „hinzufügen“. Folgende Felder habe ich eingeragen: Name: T-Mobile Internet APN: internet.t-mobile Benutzername: telekom (oder congstar eintragen) Kennwort: tm (oder cs eintragen, wenn als Benutzer congstar gewählt wurde) MCC: 262 MNC: 01 Authentifizierung: CHAP APN-Typ: default,supl,mms APN-Protokoll IPv4/IPv6 Alles andere habe ich nicht angegeben/so belassen. Jetzt noch speichern, und ich kann den neuen ANP auswählen. Und zack, hat mein Handy eine gültige globale IPv6 Adresse. Diese sieht man zB unter Einstelungen, Telefoninfo, Status. share this weiterlesen »

Überall per SSH erreichbar mit TOR02.01.

Heute möchte ich eine alternative Verwendungsweise von TOR vorstellen: Wir nutzen das TOR-Netzwerk, um unseren Rechner per SSH erreichbar zu machen. Der Vorteil des TOR-Netzes ist hierbei, dass wir uns keine Gedanken mehr um Firewalls, Port-Forwarding und DynDNS-Adressen machen müssen. weiterlesen »

picture-bots für Friendica und Diaspora*22.12.

Seit vielen Jahren habe ich einen Diaspora-Account, und seit einiger Zeit sogar eine eigene Friendica-Instanz. Im letzten Blogpost hatte ich beschrieben, wie man sich einen Friendica-Account zulegt und Kontakte hinzufügt, siehe hier. Um nun das Fediversum etwas interessanter zu gestalten, haben manche User RSS- und Feedbots konfiguriert, so dass „angesagte“ Inhalte federiert werden. weiterlesen »