Author Archive

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 mag LaTeX und Python, auch gern in Kombination. Hat Dir dieser Beitrag geholfen und möchtest Du Dich dafür bedanken? Dann unterstütze doch vielleicht die Dingfabrik Köln e.V. mit einem kleinen Beitrag. Details zur Bezahlung findest Du unter 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 mag LaTeX und Python, auch gern in Kombination. Hat Dir dieser Beitrag geholfen und möchtest Du Dich dafür bedanken? Dann unterstütze doch vielleicht die Dingfabrik Köln e.V. mit einem kleinen Beitrag. Details zur Bezahlung findest Du unter 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 mag LaTeX und Python, auch gern in Kombination. Hat Dir dieser Beitrag geholfen und möchtest Du Dich dafür bedanken? Dann unterstütze doch vielleicht die Dingfabrik Köln e.V. mit einem kleinen Beitrag. Details zur Bezahlung findest Du unter 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 mag LaTeX und Python, auch gern in Kombination. Hat Dir dieser Beitrag geholfen und möchtest Du Dich dafür bedanken? Dann unterstütze doch vielleicht die Dingfabrik Köln e.V. mit einem kleinen Beitrag. Details zur Bezahlung findest Du unter 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 mag LaTeX und Python, auch gern in Kombination. Hat Dir dieser Beitrag geholfen und möchtest Du Dich dafür bedanken? Dann unterstütze doch vielleicht die Dingfabrik Köln e.V. mit einem kleinen Beitrag. Details zur Bezahlung findest Du unter 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 mag LaTeX und Python, auch gern in Kombination. Hat Dir dieser Beitrag geholfen und möchtest Du Dich dafür bedanken? Dann unterstütze doch vielleicht die Dingfabrik Köln e.V. mit einem kleinen Beitrag. Details zur Bezahlung findest Du unter 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 mag LaTeX und Python, auch gern in Kombination. Hat Dir dieser Beitrag geholfen und möchtest Du Dich dafür bedanken? Dann unterstütze doch vielleicht die Dingfabrik Köln e.V. mit einem kleinen Beitrag. Details zur Bezahlung findest Du unter 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 mag LaTeX und Python, auch gern in Kombination. Hat Dir dieser Beitrag geholfen und möchtest Du Dich dafür bedanken? Dann unterstütze doch vielleicht die Dingfabrik Köln e.V. mit einem kleinen Beitrag. Details zur Bezahlung findest Du unter Spenden für die Dingfabrik.

More Posts - Website

Syntaxhighlighting mit Pygments und LaTeX (Beamer-Version)

Das minted-Syntaxhighlighting für eingebetteten Code funktioniert natürlich auch für Beamer-Präsentationen. (Hinweis: Python und pygments müssen installiert sein, --shell-escape muss aktiviert sein)

\documentclass[12pt]{beamer}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
 
\usepackage{xcolor}
\definecolor{colBack}{rgb}{1,1,0.8}
 
\usepackage{minted}
\setminted[python]{frame=lines, framesep=2mm, baselinestretch=1.2, bgcolor=colBack,fontsize=\footnotesize,linenos}
\setminted[text]{frame=lines, framesep=2mm, baselinestretch=1.2, bgcolor=colBack,fontsize=\footnotesize,linenos}
 
\usepackage{fancyvrb}
\makeatletter
\newenvironment{pycode}[1]%
  {\xdef\d@tn@me{#1}\xdef\r@ncmd{python #1.py > #1.plog}%
  \typeout{Writing file #1}\VerbatimOut{#1.py}% 
  }
  {\endVerbatimOut %
 \toks0{\immediate\write18}%
 \expandafter\toks\expandafter1\expandafter{\r@ncmd}%
 \edef\d@r@ncmd{\the\toks0{\the\toks1}}\d@r@ncmd %
 \noindent Input
 \inputminted{python}{\d@tn@me.py}%
 \noindent Output
 \inputminted{text}{\d@tn@me.plog}%
}
\makeatother
 
\begin{document}
 
\begin{frame}[containsverbatim]
\frametitle{Python Code Evaluation}
 
\begin{pycode}{abc}
import pandas as pd
print(pd.__version__);
print(123+456)
\end{pycode}
 
\end{frame}
 
\end{document}

Uwe

Uwe Ziegenhagen mag LaTeX und Python, auch gern in Kombination. Hat Dir dieser Beitrag geholfen und möchtest Du Dich dafür bedanken? Dann unterstütze doch vielleicht die Dingfabrik Köln e.V. mit einem kleinen Beitrag. Details zur Bezahlung findest Du unter Spenden für die Dingfabrik.

More Posts - Website

Syntaxhighlighting mit Pygments und LaTeX

Hier ein Beispiel, wie man aus LaTeX-Dateien heraus a) Dateien schreibt b) diese Dateien durch einen externen Interpreter (in diesem Fall Python) ausführen lässt, c) die Ergebnisse wieder in TeX anzeigt und d) dabei das Syntax-Highlighting durch pygments erledigen lässt.

Wichtig: --shell-escape muss aktiviert sein, eine Python-Distribution (ich bevorzuge Anaconda) muss installiert sein, Python im Pfad sein.

Das Beispiel lässt sich leicht auf alle anderen Sprachen ausweiten, die im Batch-Verfahren ausführbar sind.

English: The following example shows how one can write code for external interpreters directly in LaTeX. During compilation the code is written to external files, run be the interpreter, its results stored in the corresponding .plog output file. Syntax hightlighting is done via pygments. --shell-escape must be set for the TeX-compiler!

\documentclass[12pt]{scrartcl}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{xcolor}
 
\definecolor{colBack}{rgb}{1,1,0.8}
 
\usepackage{minted}
 
\setminted[python]{frame=lines, framesep=2mm, baselinestretch=1.2, bgcolor=colBack,fontsize=\footnotesize,linenos}
\setminted[text]{frame=lines, framesep=2mm, baselinestretch=1.2, bgcolor=colBack,fontsize=\footnotesize,linenos}
 
\usepackage{fancyvrb}
 
\makeatletter
\newenvironment{pycode}[1]%
  {\xdef\d@tn@me{#1}\xdef\r@ncmd{python #1.py > #1.plog}%
  \typeout{Writing file #1}\VerbatimOut{#1.py}% 
  }
  {\endVerbatimOut %
 \toks0{\immediate\write18}%
 \expandafter\toks\expandafter1\expandafter{\r@ncmd}%
 \edef\d@r@ncmd{\the\toks0{\the\toks1}}\d@r@ncmd %
 \noindent Input
 \inputminted{python}{\d@tn@me.py}%
 \noindent Output
 \inputminted{text}{\d@tn@me.plog}%
}
\makeatother
 
 
\begin{document}
 
\begin{pycode}{abc}
import pandas as pd
print(pd.__version__);
print(1+123424)
\end{pycode}
 
 
\end{document}

Uwe

Uwe Ziegenhagen mag LaTeX und Python, auch gern in Kombination. Hat Dir dieser Beitrag geholfen und möchtest Du Dich dafür bedanken? Dann unterstütze doch vielleicht die Dingfabrik Köln e.V. mit einem kleinen Beitrag. Details zur Bezahlung findest Du unter Spenden für die Dingfabrik.

More Posts - Website