Toxische Beziehungen im TV

In jeder Fernsehserie (insbesondere Comedy) gibts ein Vorzeigepärchen. Etwas dem der Protagonist auf der Suche nach der großen Liebe nacheifert.

Nicht immer sind diese Vorzeigepärchen aber realistisch betrachtete Vorbilder.

Insbesondere hat mir immer die Beziehung von Marshall und Lily sauer aufgestoßen.

Es spricht nichts dagegen den Partner auf seinem Weg zum Studienabschluss zu unterstützen. Aber:

Zu Beginn der Serie ist Marshall nach wie vor ein Student ohne sichtbares Einkommen, während Lily trotz ihres Collegeabschluss und Traum vom Künstlerleben als Kindergärtnerin arbeitet. Abgesehen vom Realismus, dass eine Kindergärtnerin und ein Architekt in Anstellung sicher keine New Yorker Wohnung zu dritt erhalten konnten, heißt das, dass Lily bereits zu Beginn der Beziehung ihre eigenen Wünsche nach hinten gestellt hat um Marshall zu unterstützen.

Wir kommen dann später in der Serie an den Punkt wo Lily nach L.A. gehen will um ein Stipendium in Anspruch zu nehmen und ihren Traum zu verfolgen.

Unabhängig davon dass sie zu diesem Zeitpunkt dann leider keinen Erfolg hat, war Marshalls Verhalten absolut lächerlich. Er war komplett dagegen, dass sie es versucht obwohl es nur für ein paar Monate gewesen wäre (wäre es länger gewesen hätte er ja mitziehen können, als Anwalt hätte er sicher auch in L.A. Arbeit gefunden).

Stattdessen wurde Lily von allen als die Böse hingestellt. Und das sogar noch lange, bis die 2. schließlich doch wieder zusammenkamen und alles vergessen war.

Dann fand Lily Arbeit beim Captain, der ihr Näschen für junge neue Künstler erkannt hat. Und wieder wurden ihr Steine in den Weg gelegt, weil Ted dem armen Kerl die Frau abgejagt hat. Dabei war er wirklich kein schlechter Mensch, es hat halt einfach nur nicht gepasst zwischen den beiden.

Als Marshall also gerade keinerlei besondere Ambitionen hat und sie das Angebot erhält nach Rom zu gehen, wäre das eigentlich eine klare Sache gewesen, stattdessen nimmt er die Stelle als Richter an und hätte sie damit vor eine unmögliche Wahl gestellt von Mann und Kind getrennt zu leben um ihrem Job nachzugehen.

Und am Ende hat er seinen Fehler nie eingesehen. Er hat nur nachgegeben als ihm klar wurde dass Lily erneut schwanger ist, da ihm dann die Bilderbuchfamilie doch wichtiger war als das Richteramt.

Erstaunlicherweise war die gesündeste Beziehung in How I Met Your Mother, die von Barney und Robin. Weil die beiden immer ehrlich zu einander waren, selbst als sie erkannten dass ihre Ehe nicht mehr funktionierte (was auch nur im Drehbuch stand, damit Ted sein Ende bekommt). Die beiden haben zu 99% kommuniziert und sie hatten Gemeinsamkeiten. Man hat tatsächlich mal das echte Beziehungsleben gesehen.

Marshall und Lily hatten eigentlich gar keine gemeinsamen Interessen. Ihre Beziehung war eine Zweckgemeinschaft. Der Versuch den Traum von Haus und Garten umzusetzen. Familie gründen, aber eigentlich haben die beiden aneinander vorbeigelebt.

Es gibt natürlich noch eine Menge Beispiele aber insbesondere in Comedy wo der Spass im Vordergrund steht, sollten die Hauptcharaktere eigentlich keine toxischen Traits haben. Aber genau das war hier der Fall.

Sie schlugen mit ihrem Verhalten das bis dahin bekannte Spitzenpaar (Ross und Rachel) um Längen.

Apropos Ross und Rachel, wer “Friends” gesehen hat weiß auch, dass auch hier auf Biegen und Brechen eine Beziehung konstruiert wurde. Ross war immer in Rachel verliebt aber immer nur in ihr Aussehen, denn ihr Charakter war zu Beginn der vom klassischen verwöhnten reichen Mädchen, dass plötzlich auf den harten Boden der Realität fiel. Und während ihrer Charakterentwicklung wurde eigentlich sehr schnell klar, dass sie und Ross gar nicht zueinander passen (weil sein Charakter ebenfalls ein viel zu idealisiertes Bild der perfekten Beziehung trug, er unnötig eifersüchtig war und dann selbst keine 24 Stunden gebraucht hatte um einen ONS zu haben).

In Buffy – The Vampire Slayer, war die Beziehung von Buffy und Spike bis zu einem gewissen Punkt sogar weniger toxisch als die von Buffy und Angel.
Angel mit 200 Jahren und Buffy mit 15 zu Beginn sagt schon alles, aber es war eben eine Teenieserie und für uns Teenies ist das nicht relevant gewesen, aber man kann keine romantische Beziehung führen und gleichzeitig den Partner wie ein Kind behandeln, eine Jägerin die schon alles gesehen hat, die Last der Welt auf ihren Schultern, regelmäßig Menschen rettet, die muss früh erwachsen werden. Absehen davon hatten die beiden nichts gemeinsam. Er war immer nur dieser dunkle ernste Typ.

Die beiden hatten doch nie was gemeinsam zu Lachen.
Sie hat ihm sicher nie von ihrem Tag erzählt (obwohl sie sich Sonnenlicht bedingt tagsüber nicht gesehen haben).

Das war nie eine richtige Beziehung und hat sie nur zurückgehalten (und für spätere Beziehungen geradezu verdorben).

Generell zeigen viele TV Beziehungen das Beziehungsleben so dermaßen oberflächlich dass man gar nicht weiß warum die beiden eigentlich verliebt sind. Es sind immer oberflächliche Gründe warum sie überhaupt mit jemandem zusammen sein wollen. Teils mögen es sogar edle Gründe sein, aber keine Beziehungsgrundlagen.

Ja man kann sich in den Charakter eines Menschen verlieben. Darin dass jemand ein gutes Herz hat und immer den Menschen hilft. Aber worüber redet man abends im Bett. Was macht man an gemeinsamen Wochenenden?
Was sind die Gemeinsamkeiten?

Viele fallen auf diese schlechten Vorbilder rein. Ich auch. Auch ich habe lange versucht dieses perfekte Modell einer Beziehung umzusetzen. Es hat eine Weile gedauert bis ich erkannt habe, dass meine Beziehung keine mehr war, dass wir uns nichts mehr zu sagen hatten. Dass unsere Gemeinsamkeiten einfach nicht mehr existieren weil wir uns in unterschiedliche Richtungen entwickelt haben.

Zum Glück hab ich es erkannt und hoffe dass meine neue Beziehung (die wieder auf unseren aktuellen gemeinsamen Interessen beruht) lange halten wird, weil wir bereits älter und reifer sind und uns vermutlich daher nicht mehr soweit verändern werden.

Und es gibt natürlich auch positive Beispiele von TV Beziehungen wie in Medium und Ghost Whisperer (wobei die schon etwas zu weit gingen). Dort steht kein Beziehungsdrama auf der Tagesordnung, im Gegenteil die Beziehungen in diesen Serien sind sogar eher die Konstante auf die man sich immer verlassen kann.

Das Ende von Medium hat mich damals hart und unerwartet getroffen doch selbst das war geprägt von Wholesomeness.

Also es geht auch richtig. Und so manche Comedyserie sollte drüber nachdenken ob man die Beziehung die als Beispiel dienen soll, nicht besser darstellen sollte.

Was ich an House of Haunted Hill nicht mochte

Gedanken die mir heute morgen gekommen sind, ich hab einen Comic zum Thema Schlafparalyse gesehen und musste dann an die Serie denken.

Eine der Protagonistinnen wenn nicht sogar die Hauptrolle der Serie ist zu Beginn noch ein kleines Mädchen und leidet unter sogenannter Schlafparalyse. Nun ist klar dass es sich um eine Horrorserie handelt und daher ist es notwendig dass hinter allem mehr steckt, trotzdem fand ich es schade dass man hier nicht die Möglichkeiten genutzt hat.

Denn sie lernt einen Schlafforscher kennen und schien mit seiner Hilfe die Schlafparalyse in den Griff zu bekommen, stattdessen lässt man ihn durch einen super unglücklichen Zufall sterben während sie paralysiert ist und nicht mal irgendwie helfen kann. Ich empfand deren Beziehung als unglaublich heilsam.

Jemand der ihre Erlebnisse nicht einfach als Alpträume abtut sondern sie ernst nimmt und ihr hilft. Und wäre der Unfall nicht passiert, hätte er ihr vielleicht wirklich helfen können, die Panik im Fall der Erscheinung zu überwinden und das wiederrum hätte die Geschichte komplett verändern können.

Den wie wir wissen reist sie im Augenblick ihres Todes rückwärts durch die Zeit, wäre sieht nun aber an einem gewissen Punkt ihres Lebens nicht mehr paralysiert gewesen, hätte sie erkannt, dass sie selbst die “Frau mit dem verbogenen Hals” ist. Das wiederrum hätte ihr Gelegenheit gegeben zu erkennen, was in der Zukunft geschieht und es zu verhindern, womit viele Dinge gar nicht passiert wären.

Ich persönlich mag eher den psychologischen Horror, wo man bis zum Ende nicht weiß ob das alles nicht bloß im Kopf von jemandem stattfindet wie z.b. in “Das geheime Fenster”.

Die Mailbox sauber halten mit Powerautomate und MS Graph

Wir haben heute wieder was gelernt. Grundsätzlich war meine Erfahrung schon früher die, dass man ziemliche Schwierigkeiten hat wenn man mit Powerautomate E-Mails abrufen will.

Im Standard werden 10 Mails abgerufen, aber selbst wenn man das erhöht und Filter ansetzt wirds kompliziert, denn trotz korrekter Daten findet der Outlookconnector einfach keine Mails.

Also greifen wir hier auf den HTTP Request und MS Graph zurück.

Was ist unser Usecase?

Unser Kunde möchte das alle E-Mails die älter als 6 Monate sind automatisch gelöscht werden.

Nun werden wir zum Start natürlich die Mails manuell löschen doch danach soll sich der Kunde darum nicht mehr kümmern müssen, insbesondere da je nach Einstellung im Client nur 3 Monate angezeigt werden.

Was machen wir also:

Unser Trigger ist eine Wiederholung, ob man den Flow nun täglich laufen lässt und somit eine geringe Anzahl Mails löschen muss oder monatlich hängt natürlich in erster Linie davon ab wie viele Mails pro Tag eingehen und versandt werden.

Wir gehen von einer hohen Anzahl aus und nämlich daher einen Trigger der täglich läuft.

Nun initialisieren wir 3 Variablen.

Ein Integer, ein String und ein Array.

Den String befüllen wir direkt. Er ist nur für unseren Filter erforderlich. Selbstverständlich könnte man den Flow auch in eine App einbinden um die Variable individuell zu befüllen, da wir aber nur filtern wollen welche Mails älter als 6 Monate sind.

Wir schreiben folgendes also in unseren String:

addDays(utcNow(), -180, ‘yyyy-MM-dd’)

Wir könnte auch getPastTime verwenden. Der Effekt ist der gleiche.

Die Integer Variable brauchen wir um die Zeilen zu zählen die wir raus bekommen.

Und das Array um das Ergebnis der Graphabfrage zu verarbeiten.

Nun kommen wir zur HTTP-Anforderung:

GET https://graph.microsoft.com/v1.0/me/messages?$filter=(receivedDateTime le variables(‘6monatezurück’))

Natürlich könnten wir das Datum auch direkt in der Abfrage berechnen aber mit der Variable ist es einfach sauberer.

Im nächsten Schritt wandeln wir das Ergebnis mithilfe einer Composeaction in einen String um.

string(body(‘HTTP-Anforderung_senden’))

Diesen teilen wir nun bei jedem Vorkommen eines Commas

split(outputs(‘Verfassen’),’,’)

Und packen das in unserer Array

Das Array filtern wir nun nach allen Zeilen die mit “id”: starten um die Nachrichten IDs zu bekommen. Das gefilterte Array enthält also nun bereits nur noch die IDs allerdings mit mehrere ” und dem Start mit “id”:. Da wir nur die reine ID wollen machen wirs uns einfach. Wir wissen dass die ID definitiv zwischen 2 ” liegt also zählen wir einfach nach und stellen fest das die ID somit an 4 Stelle in der Zeile liegt wenn wir sie erneut bei jedem Vorkommen von ” splitten.

split(item(), ‘”‘)[3]

Wir haben nun also die reine Nachrichten ID. Damit können wir im nächsten Schritt die E-Mail mit dem Outlook Connector löschen.

Nun stellen wir fest dass auch Graph nur 10 Zeilen abruft. Da wir die genaue Anzahl der zu löschenden Mails nicht kennen. Nutzen wir jetzt noch eine “Wiederholen bis” Aktion. Dafür brauchen wir die Integer Variable. Jedes Mal wenn wir das Array filtern schreiben wir die Länge des Array in die Variable.
length(body(‘Array_filtern’))

Es wird die ersten Durchläufe immer 1-10 Zeilen haben bis wir ans Ende kommen und keine Mails mehr zu löschen sind. Wir beenden also unsere Schleife sobald die Länge 0 ist.

“type”: “Until”, “expression”: “@less(variables(‘Zeilenzählen’),5)”,

Damit läuft unser Flow unabhängig der Anzahl Mails einfach solange durch bis es nichts mehr gibt was älter als 6 Monate ist.

Und somit wird unsere Mailbox nicht mehr zum Datenfriedhof.

Danke wie immer fürs lesen.

LG Elli

Zeilen zählen in Powerautomate

Ich nutze ja oft ChatGPT um Ideen zu bekommen wie ich eine
Anforderung in Powerautomate umsetze. Doch diesmal war das wenig
hilfreich, die Lösung von ChatGPT war umständlich und nicht vollständig.
Die KI muss eben auch noch lernen.

Daher nun zu meiner Lösung.

Das war die Anforderung.

Wir betreiben eine Art Dropshipping. Dazu sammeln wir die
Bestellungen in einer Sharepointliste und wollen einmal pro Woche eine
Auswertung was und wieviel Stück pro Artikel bestellt wurde.

Erst dachte ich das geht nicht und hab mich erstmal nur auf eine
sortierte Liste geeinigt bei der nachzählen einfacher ist. Aber dann kam
ich auf die Lösung.

Für unseren Flow brauchen wir genau 2 Array Variablen.

Im ersten Schritt rufen wir die Bestellungen der letzten 7 Tage aus der Sharepointliste ab:

Also “Get Items” und filtern die Abfrage hiermit:

Created ge ‘@{getPastTime(7, ‘day’)}’

Nun gehen wir die Liste in einer For each Aktion durch mit folgender Bedingung:

“contains”: [“@variables(‘uniqueArray’)”,”@item()?[‘Title’]”

Das heißt wir schauen in jeder Schleife ob der Titel des Elements
bereits in unserer Arrayvariable gespeichert ist. Falls nicht fügen wir
den Titel hinzu, falls ja machen wir nichts.

Nun haben wir alle bestellten Artikel genau einmal im neuen Array gespeichert.

Im nächsten Schritt machen wir also eine “For each” Aktion für unser neues Array.

Nun rufen wir erneut die Sharepointliste ab. Allerdings mit einem angepassten Filter.

“Title eq ‘@{item()}’ andnCreated ge ‘@{getPastTime(7, ‘day’)}'”

Wir filtern wie zuvor die letzten 7 Tage und den Titel.

Als Ausgabe bekommen wir also in jeder Schleife nur alle Bestellungen mit diesem einen Artikel.

Die Anzahl Zeilen erhalten wir mit einer Compose Action.

length(outputs(‘Elemente_abrufen_1’)?[‘body/value’])

Das schreiben wir nun in die 2. Arrayvariable:

“value”: “@{item()}; @{outputs(‘Anzahl’)}”

Damit ist unsere 2. Arrayvariable nun mit den korrekten Daten gefüttert.

Im Abschluss erstellen wir eine HTML Tabelle oder eine CSV Tabelle
um das Ergebnis unseres Flows sichtbar zu machen. Das hängt von der
weiteren Verarbeitung ab.

CSV Dateien unabhängig ihrer Größe in Powerautomate verarbeiten

 

Nun gehen wir also eine Flow CSVs unbekannter Größe an.

Dafür brauchen wir 3 Variablen.

Integer, Array und Boolean.


Integer ist unser Skip Counter, Array ist unser initiales CSV Array und Boolean dient zur Prüfung ob das Array leer ist.

Wir bekommen also wieder unser CSV File und verarbeiten es als erstes mit 3 Compose und 1 Array filtern Aktion.

base64ToString(triggerBody()?[‘file’]?[‘contentBytes’])


split(outputs(‘Get_CSV’),outputs(‘Absatztrenner’))


Dann befüllen wir unsere Arrayvariable mit dem gefilterten Array.

Nun gehts in die “Do until” Aktion. Die “Do until” läuft bis die Boolean Variable true ist.

Im “Do until” nehmen wir uns nun die ersten 5000 Zeilen unserer Variable:

take(skip(variables(‘csv array’), variables(‘skipcounter’)), 5000)

Dann prüfen wir ob das Ergebnis dieser Aktion ein leeres Array ist.

empty(outputs(‘Nimm_5000_Zeilen,_überspringe_Skip_Counter_Zeilen’))

Und erhöhen im Anschluss den Skip Counter um 5000

Danach bauen wir eine Bedingung ein, dass die Folgeaktion nur ausgeführt wird, wenn das Array nicht leer ist.

Damit ist der Flow auch schon fertig.




Große CSVs mit Powerautomate in Sharepoint oder Excel übertragen

 

Nachdem ich im April 2022 bei BDO Austria als
Backoffice Assistant in der IT gestartet habe, habe ich viel Freiraum
und Gelegenheit erhalten mich mit den Neuerungen von Microsoft
auseinander zu setzen. Schließlich war meine Ausbildung zur IT
Technikerin schon schon mehr als 10 Jahre her und ich habe nur in
relativ einfachen Call Center Support Jobs gearbeitet.

Insbesondere angetan hat es mir Powerautomate. Und zuletzt die
Erfassung von CSV Files aus E-Mails in Sharepoint und Excel. Da BMD beim
Export zwar auch .xlsx anbietet allerdings ohne Tabellenformatierung,
war der Export als .csv sinnvoller.

Kommen wir nun also zu meinem Beispielflow und wie ich .csv mit mehr als 5000 Zeilen verarbeite.

Unser Triggerevent ist der Eingang der E-Mail mit dem
Betreff: Ressourcenverleih IT: Ressourcenart Geräte alle Kategorien
Verleih

Direkt im Anschluss initialisieren wir mehrere Array Variablen (wie viele hängt auch von der erwarteten Größe der CSV ab.

Wir erwarten knapp über 5000 Zeilen. Daher brauchen wir 3
Variablen. Eine für das gesamte Array dass wir nachher definieren und 2
weitere um diese Array zu teilen.

Diese E-Mail enthält unser .csv File. Den Inhalt erfassen wir mit einer Compose Action:

base64ToString(item()?[‘contentBytes’])

Gefolgt von einer weiteren Compose Action, die die neue Zeile
definiert. Dafür einfach nur in der Compose Action einmal Enter drücken.

Nun befüllen wir unsere Variablen.

Unsere erstes Array bekommt die Information mit wie sie die CSV erfassen muss:

skip(split(outputs(‘Verfassen’),outputs(‘Verfassen_1’)),1)

Wobei Verfassen hier die vorhin konvertierte CSV ist und Verfassen1 die neue Zeile.

So sagen wir dem Array überspringe die erste Zeile (da es sich
hier um die Spaltennamen handelt) und nutze als Trenner die neue Zeile.

Nun weiß ich aus Erfahrung, dass mein Array häufig mehr als 5000
Zeilen haben wird und die folgende For each Aktion die meine CSV in
meinem Fall in eine Sharepointliste schreiben soll, erlaubt nicht mehr
als 5000 Durchläufe.

Daher teilen wir das Array nun auf.

Für meinen Fall empfiehlt sich die Teilung in ungefähr gleich große Teile. Daher teilen wir bei 3000 Zeilen.

Dafür brauchen wir die beiden anderen Variablen.

Wir befüllen die Variable “Teil1” mit dem folgenden Inhalt:

take(variables(‘Test’), 3000)

Damit nehmen wir uns die ersten 3000 Zeilen.

Und nun schreiben wir in die Variable “Teil2” folgendes:

skip(variables(‘Test’),3000)

Damit überspringen wir die ersten 3000 Zeilen.

Nun haben wir also statt einem Array mit bis zu 6000 Zeilen 2 Arrays mit jeweils 3000 Zeilen.

Diese können wir nun in je einer For each Action in unsere
Sharepointliste oder in ein Excel schreiben bzw. was immer wir noch
damit anstellen wollen.

Um den Grenzwert von 10000 Aktionen pro Flow nicht zu
überschreiben kann man diese Variante auch nutzen und 2 oder mehr Flows
schreiben in der jeder Flow einen Teil der Daten verarbeitet.

Ist die Anzahl der zu erwarteten Zeilen unbekannt, könnt ihr
natürlich noch mehr Variablen initialisieren und die Teilung immer bei
5000 vornehmen. Variablen die keinen Inhalt mehr liefern werden im Flow
einfach übersprungen.

So das war mein erster Beitrag zu dem Thema.

Beim nächsten Mal schauen wir uns an wie wir damit umgehen wenn
das Ergebnis der Zeilen unbekannt ist und wir daher mit verschachtelten
“For each” Aktionen arbeiten müssen sowie der “Repeat until” Aktion.