Author Archive

Python-Skripte per Drag & Drop triggern

Hier ein Beispiel, wie man per Drag & Drop Python-Skripte ausführen kann.

In eine entsprechende Batch-Datei kommt der folgende Aufruf

C:\WinPython-32bit-3.3.5.5\python-3.3.5\python.exe dragdrop.py %1 > error.log 2>&1

In die dragdrop.py kommt dann der eigentliche Python-Code, hier wird die „gedroppte“ Excel-Datei in CSV umgewandelt.

import sys
import os
import pandas as pd

droppedFile = sys.argv[1]
filename = os.path.splitext(droppedFile)[0]

df = pd.read_excel(droppedFile, skiprows=[0,1,2,3])
df.to_csv(filename +'.csv', sep=';', index=False)

Uwe

Uwe Ziegenhagen likes LaTeX and Python, sometimes even combined. Do you like my content and would like to thank me for it? Consider making a small donation to my local fablab, the Dingfabrik Köln. Details on how to donate can be found here Spenden für die Dingfabrik.

More Posts - Website

Erste Schritte mit Docker

Nachdem ich auf meinem NAS (einem Synology DS918+) bereits Erfahrungen mit Docker sammeln konnte, will ich jetzt mehr über die Grundlagen lernen. Ziel ist es mittelfristig, Node Red laufen zu lassen, um einige Aspekte unseres trauten Heims zu automatisieren. Zur Entwicklung nehme ich einen älteren Intel NUC mit i3-Prozesser, auf dem ein Ubuntu Bionic läuft, später landet vielleicht alles auf dem Raspi, den ich in die Unterversorgung gehängt habe.

In diesem Artikel geht es jetzt um die Installation, im wesentlichen folge ich dabei der Anleitung von https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-18-04

1) Herausfinden, welche Ubuntu-Version man hat?

lsb_release -a

gibt in der letzten Zeile den Namen mit aus.

2)

sudo apt update

sudo apt install apt-transport-https ca-certificates curl software-properties-common

aktualisiert die Quellen und fügt einige benötigte Programme hinzu, so sie noch nicht installiert sind.

3)

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

holt den public PGP-Key von der Docker-Seite, da wir von dort und nicht aus den Bionic-Quellen von Canonical installieren.

4)

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"
sudo apt update

fügt die Quellen hinzu und aktualisiert die apt-Quellen

5)

sudo apt install docker-ce

installiert dann Docker.

Wie kann man die Installation prüfen? Mit „Hello World“ 🙂

sudo docker run hello-world

Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
1b930d010525: Pull complete
Digest: sha256:2557e3c07ed1e38f26e389462d03ed943586f744621577a99efb77324b0fe535
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

Im nächsten Artikel zum Thema erläutern wir dann die wichtigsten Docker-Befehle für die Kommandozeile.

Uwe

Uwe Ziegenhagen likes LaTeX and Python, sometimes even combined. Do you like my content and would like to thank me for it? Consider making a small donation to my local fablab, the Dingfabrik Köln. Details on how to donate can be found here Spenden für die Dingfabrik.

More Posts - Website

Spam-Löschen mit UIPath

Vor ein paar Tagen habe ich begonnen, mich etwas intensiver mit RPA (Robotic Process Automation) zu beschäftigen. Nachdem ich mit Katalan Studio schon recht einfach das Spam-Löschen in den von mir betreuten Mailing-Listen automatisieren konnte, wollte ich dieses Mal mit einer dedizierten RPA-Software arbeiten. Ich habe mich dabei für UIPath entschieden, da wir a) auch im Büro damit arbeiten und b) diese Software der Marktführer für RPA-Tools ist.

Ich habe ein neues Projekt begonnen und starte mit einer Sequenz. In Schritt 1 wird der IE geöffnet (nicht Edge, wird anscheinend noch nicht unterstützt) und die URL der Mailingliste geladen.

Öffnen des Browsers in UIPath (URL muss in Anführungszeichen)

Innerhalb des Browser-Scope nutze ich ich dann den „Type Into“ Befehl, um das Passwort einzugeben. Das anschließend notwendige „Return“ bzw. „Enter“ kann man definieren, in dem man rechts vom Eingabefeld das Plus-Zeichen anklickt und den entsprechenden Befehl selektiert, hier „Enter“.

Eingabe des Passworts

Der nächste Punkt ist entscheidend, denn es gibt zwei mögliche Szenarien: entweder sind Spam-Nachrichten vorhanden oder auch nicht. Ich nutze zu Identifikation des Szenarios die „Alle mit Entscheidung ‚aufschieben“ Inputbox mit der Name-Property „discardalldefersp“. (Alternativ könnte man sicher auch den Senden-Button dafür nutzen.)

Ist diese vorhanden, dann soll sie und anschließend der Senden-Button „Alle Daten senden“ angeklickt werden. Ist sie nicht vorhanden, dann soll der Bot sich nur ausloggen (da er dies auch tun muss, wenn Spam-Nachrichten gelöscht wurden, muss dies nicht innerhalb der Bedingung geschehen.)

Mit der Box wird entschieden, ob Spam-Nachrichten vorhanden sind oder nicht.

Ich nutze jetzt den „Element exists“ Befehl, um nach der Input-Box zu suchen.“WaitforReady“ sollte man auf None setzen, da sonst der Bot eventuell ewig darauf wartet, dass die Input-Box erscheint (TBD). Ich nutze noch eine boolean Variable, um den Status „Inputbox gefunden“ für meine folgende IF-Bedingung zu speichern. Dazu geht man in das „Exists“ Feld unter Output, drückt Strg-K und vergibt einen möglichst sprechenden Namen, ich habe „vBoolDiscard“ gewählt.

WaitForReady setze ich auf „None“, eine Output-Variable setze ich mit Strg-K => „NameDerVariablen“

Als nächste folgt die IF-Bedingung, die den Wert der eben gesetzten boolean Variablen prüft. Wenn der Wert TRUE ist, dann ist die Checkbox vorhanden und  soll angeklickt werden. Wenn sie nicht vorhanden ist, ist kein Spam vorhanden, der Bot kann sich ausloggen und den Tab schließen.

Rest der Sequenz: wenn die Inputbox vorhanden ist, dann wird sie angeklickt und mit Senden bestätigt. Ist sie nicht vorhanden, geschieht nichts. 

Fazit: Wenn man die Kniffe kennt (Erstelle eine Variable, warte nicht auf Input-Elemente), dann ist der Einstieg in RPA mit UIPath recht einfach. Ohne sie muss man schon die vorhandenen Tutorials recht intensiv lesen.


Uwe

Uwe Ziegenhagen likes LaTeX and Python, sometimes even combined. Do you like my content and would like to thank me for it? Consider making a small donation to my local fablab, the Dingfabrik Köln. Details on how to donate can be found here Spenden für die Dingfabrik.

More Posts - Website

Checklisten setzen mit

Mit dem typed-checklist Paket lassen sich einfach komplexe Checklisten setzen, hier ein Beispiel aus der Dokumentation:

\documentclass{article}
\usepackage{typed-checklist}
\begin{document}
\begin{CheckList}{Goal}
\Goal{open}{I have a trendy haircut}
\begin{CheckList}{Task}
\Task{done}{find a hairdresser}
\Task{started}{make an appointment}
\Task{open}{go to the hairdresser}
\end{CheckList}
\Goal{achieved}{I have a typed checklist}
\end{CheckList}
\end{document}

Uwe

Uwe Ziegenhagen likes LaTeX and Python, sometimes even combined.

Do you like my content and would like to thank me for it? Consider making a small donation to my local fablab, the Dingfabrik Köln. Details on how to donate can be found here Spenden für die Dingfabrik.

More Posts - Website


Changelogs setzen mittels „changelog“ Paket

Mit dem changelog Paket gibt es eine komfortable Möglichkeit, changelogs in Dokumenten zu setzen. Hier ein Beispiel, entnommen der Dokumentation.

\documentclass[12pt,ngerman]{scrartcl}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{booktabs}
\usepackage{babel}
\usepackage{graphicx}
\usepackage{csquotes}
\usepackage{paralist}
\usepackage{xcolor}
\usepackage[color]{changelog}
\begin{document}
 
\begin{changelog}[sectioncmd=\section,title={Versionshistorie}]
 
\begin{version}{0.9}
\added Really cool features
\end{version}
 
\begin{version}[date=2019-01-23]
\item A version with only a date
\end{version}
 
\begin{version}[v=1.1.0]
\item A version with no date
\end{version}
 
\begin{version}[v=1.0.1, yanked]
\item sasda
\end{version}
\end{changelog}
 
\end{document}

Uwe

Uwe Ziegenhagen likes LaTeX and Python, sometimes even combined.

Do you like my content and would like to thank me for it? Consider making a small donation to my local fablab, the Dingfabrik Köln. Details on how to donate can be found here Spenden für die Dingfabrik.

More Posts - Website


Zwei DIN A5 Seiten auf einer DIN A4 Seite setzen

Für meine Studentinnen und Studenten erstelle ich zu jeder Vorlesung eine kurze Wiederholung auf Basis der exam Klasse. Üblicherweise reicht ein DIN A5 Blatt, daher liegt es nahe, zwei DIN A5 Blätter auf ein DIN A4 Blatt zu drucken.

Um nicht den Text zweimal setzen zu müssen, gibt es zwei nützliche Lösungen (neben der Nutzung von Adobe Acrobat):


Duplizieren der Seite mittels pdftk:

Für pdftk habe ich eine kleine Batch-Datei duplicate.bat geschrieben, die dann mittels duplicate datei1.pdf datei2.pdf aufgerufen wird.


@echo off
pdftk %1 cat 1-end 1-end output %2


Duplizieren der Seiten in LaTeX mittels pgfpages

Über TSX (https://tex.stackexchange.com/questions/142187/compile-two-a5-pages-on-one-a4-page/142272) bin ich auf eine Lösung gestoßen, die im LaTeX-Lauf selbst die Seite dupliziert:

\documentclass[a4paper,ngerman,12pt]{article}
 
\usepackage{pgfpages}                                 % <— load the package
\pgfpagesuselayout{2 on 1}[a4paper,landscape,border shrink=5mm] % <— set options
 
\usepackage{atbegshi}  % duplicate the content at shipout time
\AtBeginShipout{%
  \pgfpagesshipoutlogicalpage{1}\copy\AtBeginShipoutBox
  \pgfpagesshipoutlogicalpage{2}\box\AtBeginShipoutBox
  \pgfshipoutphysicalpage
}
 
\usepackage{blindtext}
\begin{document}
 
\blindtext[3]
 
\end{document}

Uwe

Uwe Ziegenhagen likes LaTeX and Python, sometimes even combined.

Do you like my content and would like to thank me for it? Consider making a small donation to my local fablab, the Dingfabrik Köln. Details on how to donate can be found here Spenden für die Dingfabrik.

More Posts - Website


Python: Code-Rahmen für Auswertungen mit pandas

Für das „Rahmenwerk“ rund um eine Datenauswertung nutze ich immer den selben Code, der a) die Auswertung von Kommandozeilenparametern b) Zeitstempel und c) das Logging übernimmt. Geloggt wird auf STDOUT und in eine Datei.

import pandas as pd # pandas
import argparse # Kommandozeilenargumente
import logging # Logging
import sys # für das Logging
import time # für den Zeitstempel

# Zeitstempel
timestr = time.strftime('%Y%m%d') # '%Y%m%d-%H%M%S'

# Logger in Datei und auf die Konsole
logger = logging.getLogger("Logfile.log")
logger.propagate = False
logger.setLevel(logging.DEBUG)
 
fileHandler = logging.FileHandler(logger.name + '_' + timestr + ".log",mode='w')
fileHandler_format = logging.Formatter('%(asctime)s_%(levelname)s_%(message)s',datefmt='%H:%M:%S')
fileHandler.setFormatter(fileHandler_format)

consoleHandler = logging.StreamHandler(sys.stdout)
#formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
consoleHandler.setFormatter(fileHandler_format)

if logger.handlers:
    for handler in logger.handlers:
        logger.removeHandler(handler)

logger.addHandler(fileHandler)
logger.addHandler(consoleHandler)

# Zum Auswerten der Kommandozeilenparameter (siehe Aufruf aus Excel)
# Definiere Parameter
parser = argparse.ArgumentParser("Was bin ich")
parser.add_argument('-c','--currentdate',dest='currentdate')
parser.add_argument('-l','--lastdate',dest='lastdate')
parser.add_argument('-o','--outputfile',dest='outputpath')

# verarbeite Kommandozeilenargumente

logger.info('Verarbeite die Kommandozeilenargumente')
args = parser.parse_args()

# no more "A value is trying to be set on a copy of a slice from a DF" warning
pd.options.mode.chained_assignment = None

print('args.currentdate', args.currentdate)
print('args.lastdate', args.lastdate)
print('args.outputpath', args.outputpath)

logging.shutdown()

Uwe

Uwe Ziegenhagen likes LaTeX and Python, sometimes even combined.

Do you like my content and would like to thank me for it? Consider making a small donation to my local fablab, the Dingfabrik Köln. Details on how to donate can be found here Spenden für die Dingfabrik.

More Posts - Website


Einfach neue globale Optionen setzen und auswerten

Von Marei aus Regensburg (Danke!) stammt das folgende Beispiel. Es zeigt, wie man mit expl3 Syntax einfach neue globale Optionen setzen und auswerten kann.

\documentclass[lang]{scrartcl} 
 
\usepackage{expl3} 
 
\ExplSyntaxOn 
\exp_args:Nc \clist_map_inline:nn {@classoptionslist}{% 
\str_case_x:nn {#1}{% 
{kurz}{\newcommand{\myname}{Max}}%
{lang}{\newcommand{\myname}{Max~Mustermann}}}} 
\ExplSyntaxOff
 
\begin{document} 
 
\myname
 
\end{document}

Uwe

Uwe Ziegenhagen likes LaTeX and Python, sometimes even combined.

Do you like my content and would like to thank me for it? Consider making a small donation to my local fablab, the Dingfabrik Köln. Details on how to donate can be found here Spenden für die Dingfabrik.

More Posts - Website


Serifenlose Mathematik mit Fira Math

Hier ein kurzes Beispiel für den serifenlosen Mathematik-Font Fira Math.

\documentclass{article}
\usepackage{amsmath}
\usepackage[mathrm=sym]{unicode-math}
\setmathfont{Fira Math}
 
\begin{document}
\[
x_{1,2} = -\frac{p}{2} \pm \sqrt{\left(\frac{p}{2}\right)^2 - q}
 \]
\end{document}

Uwe

Uwe Ziegenhagen likes LaTeX and Python, sometimes even combined.

Do you like my content and would like to thank me for it? Consider making a small donation to my local fablab, the Dingfabrik Köln. Details on how to donate can be found here Spenden für die Dingfabrik.

More Posts - Website


Lernkarten mit LaTeX erstellen

Vor einigen Wochen habe ich eine Möglichkeit gesucht, Lernkarten mittels LaTeX zu erstellen: Frage auf der Vorderseite, Antwort auf der Rückseite.

Auf github habe ich dann https://github.com/kellertuer/Kartei gefunden, das genau diese Anforderungen umsetzt. Das Projekt ist leider noch nicht auf CTAN, vielleicht werde ich dem Autor mal dabei helfen. Aktuell muss man halt alle Dateien von github holen und a) in den lokalen TeX-Baum legen oder b) einfach in das eigene Projektverzeichnis packen.

Hier jetzt ein Beispiel:

\documentclass[a6paper,12pt,print,grid=front]{kartei}
 
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{babel}
\usepackage{graphicx}
\usepackage[sfdefault]{plex-sans} 
\usepackage[]{blindtext}
\setlength{\parindent}{6pt}
\setlength{\parskip}{0pt}
 
\begin{document}
	\begin{karte}[Oben links]{Wie groß ist die mittlere Entfernung zwischen Erde und Sonne?}[Oben rechts]
	149.600.000 km
	\end{karte}
	\begin{karte}[Oben links]{Wie groß ist die mittlere Entfernung zwischen Erde und Mond?}[Oben rechts]
	384.400 km
	\end{karte}
	\begin{karte}[Oben links]{Wie groß ist die mittlere Entfernung zwischen Erde und Andromeda?}[Oben rechts]
	2.537.000 Lichtjahre
	\end{karte}
	\begin{karte}[Oben links]{Wie groß ist die mittlere Entfernung zwischen Erde und Andromeda?}[Oben rechts]
	\blindtext
	\end{karte}
\end{document}

Uwe

Uwe Ziegenhagen likes LaTeX and Python, sometimes even combined.

Do you like my content and would like to thank me for it? Consider making a small donation to my local fablab, the Dingfabrik Köln. Details on how to donate can be found here Spenden für die Dingfabrik.

More Posts - Website