You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: src/content/blog/camunda-string-variablen.mdx
+1-1Lines changed: 1 addition & 1 deletion
Original file line number
Diff line number
Diff line change
@@ -76,5 +76,5 @@ public ObjectValue getMailBody() {
76
76
}
77
77
```
78
78
79
-
###Zusammenfassung
79
+
## Zusammenfassung
80
80
Prozess-Variablen in Camunda als Objekte zu implementieren hat mehrere Vorteile: Durch die dazugehörige Java-Klasse entsteht eine Typsicherheit, es gibt keine Größenbegrenzung durch die Camunda Datenbank und es trägt zur Übersichtlichkeit bei. An manchen Stellen, wie bei den lokalen Variablen, ist der Aufwand allerdings höher, da Probleme, welche theoretisch ausschließlich im BPMN-Diagramm gelöst werden könnten, in eine Java-Klasse ausgelagert werden müssen. Nichtsdestotrotz lohnt sich der Mehraufwand und man sollte primitive Typen in den Prozess-Variablen nur benutzen, wenn man sich sehr sicher über den Inhalt der Variable sein kann.
Copy file name to clipboardExpand all lines: src/content/blog/ecmascript-mengenoperationen.mdx
+6-6Lines changed: 6 additions & 6 deletions
Original file line number
Diff line number
Diff line change
@@ -17,7 +17,7 @@ Bei einem unserer Projekte sind wir kürzlich auf ein unerwartete Performance-Pr
17
17
18
18
JavaScript bzw. ECMAScript (der "richtige" Name der Sprache) brachte lange Zeit keine expliziten Funktionen für Mengenoperationen mit. Obwohl diese Funktionen schon lange diskutiert wurden, erreichten sie [erst 2024 die "Stage 4"](https://github.com/tc39/ecma262/pull/3306), wurden also offiziell in den Standard aufgenommen. Seit einigen Monaten gibt es nun also in den meisten Runtimes explizit die Möglichkeit, Mengenoperationen wie `.union()`, `.intersection()` und `.difference()` an `Set`-Objekten berechnen zu lassen. Im Internet findet man aber natürlich oftmals noch Code, welcher für diese Aufgabe kein `Set` verwendet. Wir haben also alte und neue Optionen miteinander verglichen:
19
19
20
-
###Vorbereitung: Wir bauen uns zwei große Arrays
20
+
## Vorbereitung: Wir bauen uns zwei große Arrays
21
21
Für die folgenden Vergleiche haben wir jeweils die gleichen zwei Arrays mit einer beispielhaften Länge von 200.000 Elementen initialisiert. Der Inhalt dieser Objekte spielt hier keine besondere Rolle. Nur so viel: Sie enthalten jeweils eine ID, über die sie eindeutig identifiziert werden können. Wir suchen also in beiden Arrays diejenigen Objekte mit der gleichen ID.
22
22
23
23
```ts
@@ -32,7 +32,7 @@ const bigArray2 = Array.from(
32
32
33
33
```
34
34
35
-
###Vergleichen mit Schleifen oder `.filter()` und `.some()`
35
+
## Vergleichen mit Schleifen oder `.filter()` und `.some()`
36
36
37
37
38
38
```ts
@@ -59,7 +59,7 @@ outerLoop: for (const array1Element of bigArray1) {
59
59
60
60
Dieser Code war unser erster, naiver Ansatz zum Bilden der Differenz: Die Verwendung von `.filter()` ist ein klassisches Konzept aus der funktionalen Programmierung. Der Code ist kurz und gut verständlich und es wird dabei relativ wenig Speicher verbraucht. Der Nachteil dieser Variante ist aber, dass relativ viel Zeit benötigt wird. Der Aufwand für die Laufzeit dieses Algorithmus wird als `O(n²)` beschrieben – das heißt, jedes Array-Element des ersten Arrays wird mit jedem Array-Element des zweiten Arrays verglichen (also in diesem Fall finden `200.000² = 40 Mrd.` Vergleichsoperationen statt). Auch die zweite Code-Variante basiert genau auf diesem Grundsatz, benutzt jedoch zwei for-Schleifen statt dem funktionalen `filter()`-Aufruf und braucht deswegen etwa genau so lange für die Berechnung. Beide Varianten sind also nur dann sinnvoll, wenn wenig Arbeitsspeicher zur Verfügung steht oder die beiden Arrays eine Größe haben, bei denen die Laufzeit egal ist.
Bei der zweiten Option haben wir `Array.includes()` benutzt, um zu prüfen, ob eine Logzeile in dem Array vorhanden ist. Da `includes()` die Referenzen der Objekte vergleicht, und nicht deren Inhalt, müssen wir hier die IDs statt der kompletten Objekte benutzen. Deswegen erstellen wir zuerst ein Array mit allen IDs von einem der beiden Logfiles und sortieren dann diejenigen Einträge aus dem zweiten Logfile, deren IDs bereits im ersten Array enthalten sind. Die Laufzeit verbessert sich in diesem Ansatz etwas, dafür ist nun der Speicherbedarf höher, da wir ein zusätzliches Array mit den IDs benötigen. Diese Variante ist vielleicht etwas weniger intuitiv als die erste Variante und der Laufzeit-Vorteil ist relativ gering.
Nun verwenden wir endlich die "neuen" Mengenoperationen (konkret die `.difference()`-Operation). Diese arbeiten aber nur mit Sets: das heißt wir müssen beide Arrays zunächst in geeignete Sets überführen. Da aber auch hier Referenzen von den jeweiligen Objekten verglichen werden würden, benutzen wir nun `JSON.stringify()`, um vergleichbare Strings aus den Objekten zu erzeugen. Der Haken hier dran ist, dass beide Objekte die gleichen Eigenschaften haben müssen – die gleiche ID reicht nicht aus. Alternativ könnte man die Mengenoperation auch nur auf die zwei Sets der IDs anwenden. Dann müsste man im Nachhinein aber wieder die verbleibenden IDs zu ihren ursprünglichen Objekten auflösen – was in Summe langsamer ist, als dieser `JSON.stringify()`-Ansatz. Hier stellen wir nun das erste mal einen deutlichen Sprung in der Laufzeit fest. Die Komplexität des Algorithmus sinkt nämlich wahrscheinlich auf `O(n)` (abhängig von der Implementierung in der jeweiligen JavaScript-Engine). Der Speicherbedarf ist allerdings auch deutlich gestiegen, da wir beide Arrays nicht nur duplizieren, sondern auch als serialisierte Strings im Speicher halten.
97
97
98
-
###Am schnellsten: Objektfelder als Lookup-Table
98
+
## Am schnellsten: Objektfelder als Lookup-Table
99
99
```ts
100
100
// Option 4
101
101
const map = {};
@@ -113,5 +113,5 @@ Die mit Abstand schnellste Variante ist es, ein Objekt als eine einfache "Lookup
113
113
114
114
115
115
116
-
###Fazit: Überall Footguns, auch bei Mengenoperationen
116
+
## Fazit: Überall Footguns, auch bei Mengenoperationen
117
117
Wie so oft in der Informatik gilt auch hier: Vorteile in der Laufzeit bedeuten leider fast immer Nachteile im Speicherbedarf. JavaScript macht es mit seinen neuen Mengenoperationen sehr einfach, solche Operationen auszuführen. Oftmals ist diese "naive" Herangehensweise allerdings nicht sehr performant – es handelt sich also um eine sogenannte "Footgun" (etwas vermeintlich Einfaches, bei dem sich der Entwickler sprichwörtlich in den Fuß schießen kann). Bei großen Datenmengen lohnt sich definitiv der Blick auf andere Algorithmen, da die Zeiteinsparungen ein Vielfaches (in unserem Beispielfall: Faktor 170) betragen können.
Copy file name to clipboardExpand all lines: src/content/blog/nextcloud-freigabe-chaos.mdx
+3-3Lines changed: 3 additions & 3 deletions
Original file line number
Diff line number
Diff line change
@@ -18,7 +18,7 @@ Die Verbreitung und Popularität von Open-Source-Software hat im Jahr 2023 noch
18
18
19
19
Die Motivation und Euphorie beim Start einer neuen Nextcloud-Instanz sind oft sehr groß. Endlich eigene, unabhängige Infrastruktur zu nutzen, fühlt sich zunächst toll an. Über die Web-Oberfläche oder die verschiedenen Client-Anwendungen füllt sich die Nextcloud schnell mit den ersten Dateien. Und irgendwann kommt der Moment, wo mindestens zwei Benutzer oder vielleicht sogar eine ganze Gruppe von Benutzern eine Datei oder einen Ordner miteinander teilen möchten. Klingt eigentlich simpel, denn dieses Szenario beschreibt ja schließlich die Gründungsidee von Nextcloud (bzw. OwnCloud). Doch diese Aufgabe (Teilen von Dateien in einer festen Gruppe von Personen) ist gar nicht so trivial zu bewerkstelligen. Nextcloud bietet inzwischen mindestens drei verschiedene Mechanismen dafür an.
20
20
21
-
###Shares: Der naheliegendste Weg mit vielen Fallstricken
21
+
## Shares: Der naheliegendste Weg mit vielen Fallstricken
22
22
23
23
Die einfachste Lösung für dieses Problem ist also auch die Älteste: die eingebaute "Teilen"-Funktion von Nextcloud. Neben jeder Datei und jedem Ordner in Nextcloud gibt es ein kleines "Share"-Icon, welches einen Dialog öffnet, in dem sich eine Datei oder ein Ordner mit anderen Nextcloud-Nutzern oder Gruppen teilen lässt. Das ist einfach und leicht verständlich – und gefährlich. Diese Funktion sorgt gerade in Organisationen mit vielen Benutzern oft für viel Chaos: Technisch gesehen verhält sich eine solche Nextcloud-Freigabe eigentlich wie ein sogenannter [symbolischer Link](https://de.m.wikipedia.org/wiki/Symbolische_Verkn%C3%BCpfung) in einem Dateisystem. Deswegen gibt es einige weniger bekannte Nebeneffekte:
24
24
@@ -28,7 +28,7 @@ Die einfachste Lösung für dieses Problem ist also auch die Älteste: die einge
28
28
29
29
Für sehr kleine und private Instanzen ist die einfache Share-Funktion meistens noch ausreichend. Mit steigender Anzahl von Nutzern und festen Teams wird die Funktion allerdings sehr schnell unübersichtlich. Im professionellen Umfeld ist die Funktion kaum zu beherrschen und birgt die Gefahr, dass Mitarbeiter ihre Dokumente nicht mehr finden, wenn Nutzer ausscheiden. Wer eine Übersicht über die Menge an eingerichteten Shares haben möchte, kann dazu das [`sharelisting`-Plugin](https://github.com/nextcloud/sharelisting) nutzen.
30
30
31
-
###Gruppenordner: Fast perfekt aber wenig gepflegt
31
+
## Gruppenordner: Fast perfekt aber wenig gepflegt
32
32
33
33
Um viele der genannten Probleme bei der Arbeit mit Gruppen zu beseitigen, gibt es bereits [seit 2017](https://nextcloud.com/blog/new-version-of-groupfolders-app-is-coming/) das offizielle ["groupfolders"-Plugin](https://github.com/nextcloud/groupfolders) für Nextcloud. Kurioserweise gehören Gruppen zwar zum Standard-Funktionsumfang von Nextcloud, aber nicht das Plugin für Gruppenordner. Die zugrundeliegenden Gruppen können nur von Admins in Nextcloud verwaltet werden. Gruppenbasierte Funktionalitäten eignen sich also tendenziell gut für hierarchisch strukturierte Organisationen und Firmen, wo klar definiert ist, wer über eine Gruppenzuordnung entscheiden kann.
34
34
@@ -44,7 +44,7 @@ Um viele der genannten Probleme bei der Arbeit mit Gruppen zu beseitigen, gibt e
44
44
45
45
Für die Zusammenarbeit in einer festen und hierarchischen Gruppen-Konstellation (wie sie üblicherweise im Arbeitsumfeld vorkommt) scheinen Groupfolders also eine überlegene Lösung zu sein. Trotzdem fühlt sich das groupfolders-Plugin manchmal wie ungewollter Ballast im Nextcloud-Universum an. Obwohl das Plugin offiziell von der Nextcloud GmbH verwaltet wird, bekommt es augenscheinlich nur [wenig Priorität und Ressourcen](https://github.com/nextcloud/groupfolders/issues/1215) zugewiesen und weist deswegen teilweise monatelang gravierende Fehler auf.
46
46
47
-
###Teams: Aufgebohrte Share-Funktion
47
+
## Teams: Aufgebohrte Share-Funktion
48
48
49
49
["Teams"](https://github.com/nextcloud/circles)(früher "Circles") ist eine dritte Variante um mit einer Gruppe Dateien und Ordner zu teilen. Teams wirken aber eher wie eine kleine Erweiterung der einfachen Share-Funktionalität. Anstelle einzelner Nutzer und (durch Admins definierte) Gruppen, können Dateien und Ordner damit auch mit selbstverwalteten Teams geteilt werden. Teams können von jedem Nutzer erstellt werden (vorausgesetzt die zugehörige Nextcloud-App ist installiert), und benötigen keinerlei Admin-Intervention. Teams ermöglichen also Selbstorganisation in Strukturen, wo keine klare Hierarchie oder Zuständigkeit herrscht. Die so erstellten Freigaben leiden allerdings unter denselben Problemen wie die einfachen Dateifreigaben:
Copy file name to clipboardExpand all lines: src/content/blog/webapps.mdx
+5-5Lines changed: 5 additions & 5 deletions
Original file line number
Diff line number
Diff line change
@@ -17,28 +17,28 @@ Webanwendungen sind in den letzten Jahren (spätestens seit dem "Web 2.0") immer
17
17
18
18
Webanwendungen (auf Englisch auch Web-Apps genannt) sind Softwareanwendungen, die über einen Webbrowser aufgerufen und genutzt werden. Von einfachen Webseiten grenzen sich Webanwendungen durch eine höhere Komplexität ab. Bekannte Beispiele für Web-Apps sind zum Beispiel solche Anwendungen wie die Online-Office-Lösung [Google Docs](https://www.google.com/docs/about/), die Design-Programme [Figma](https://www.figma.com/) oder [Canva](https://www.canva.com/) oder das Videostreaming-Portal [Netflix](https://www.netflix.com). Im Gegensatz zu traditionellen Desktop- oder mobilen Anwendungen (auch "native" Anwendungen genannt) müssen sie meistens nicht auf dem Gerät installiert werden, sondern können einfach über eine Internetadresse (URL) aufgerufen und genutzt werden.
19
19
20
-
###👁️ Zugänglichkeit: Ein Browser reicht aus
20
+
## 👁️ Zugänglichkeit: Ein Browser reicht aus
21
21
22
22
Webanwendungen werden über einen Webbrowser aufgerufen. Das bedeutet, dass jedes Gerät, auf welchem ein moderner Browser installiert werden kann (egal ob es sich um einen PC, ein Smartphone, ein Tablet, ein Auto oder einen Fernseher handelt) diese ausführen kann, unabhängig vom Betriebssystem oder der darunterliegenden Hardware. Mit einer einzigen Applikation können also wahnsinnig viele Gerätearten und -kategorien abgedeckt werden. Dank dem sogenannten Responsive Design können Webanwendungen auch auf alle Bildschirmgrößen zugeschnitten werden. Das reduziert den Entwicklungsaufwand deutlich gegenüber nativen Anwendungen und verringert die Abhängigkeit von speziellen Herstellern oder Plattformen. Entwickelt man z.B. eine native iOS-App, so ist man auch in Zukunft an Apple-Hardware gebunden – dies ist bei Web-Apps nicht der Fall. Die Web-Technologie erlaubt es außerdem relativ gut, Software auch für Menschen mit Beeinträchtigung (etwa Seh- oder Motorikbeeinträchtigungen) zugänglich zu machen.
23
23
24
-
###🕸️ Zentralisierung: Geteilte Daten, keine Backups und offene Schnittstellen
24
+
## 🕸️ Zentralisierung: Geteilte Daten, keine Backups und offene Schnittstellen
25
25
26
26
Webapplikationen bestehen häufig aus einer Server-Komponente (Backend) und einer Benutzeroberfläche (Frontend). Das Frontend ist die eigentliche Web-App und wird im Browser des Benutzers ausgeführt. Das Backend läuft meistens auf einem (oder mehreren) zentralisierten Server(n). Das Frontend kann dabei idealerweise sehr schlank gestaltet werden, so dass der Nutzer nur die Daten vom Server bekommt, welche er tatsächlich benötigt. Die Geschäftslogik (z.B. Berechnungen etc.) als auch die Daten liegen auf dem Server und können von vielen Nutzern geteilt werden. Eine gemeinsame Datenbasis zwischen allen Nutzern erleichtert die Kollaboration und macht das Austauschen von Dateien oder das Nutzen von Netzlaufwerken häufig unnötig.
27
27
28
28
<figureclass="[&>p>img]:mx-auto [&>p>img]:mb-0"><figcaption>Ein Screenshot aus der beliebten Design-Anwendung Figma, die komplett im Browser verwendet werden kann.</figcaption></figure>
29
29
30
30
Durch die Zentralisierung der Daten müssen auch kaum Daten beim Nutzer gespeichert werden, wodurch dem Nutzer auch keine Daten verloren gehen können (Laptop geklaut, Wasserschaden, etc.). Am wichtigsten finden wir allerdings, dass es im Kontext von Web-Apps gängig und einfach ist, eine generische Programmier-Schnittstelle zur Verfügung zu stellen, die auch von anderen Programmen genutzt werden kann. Programme sollten heutzutage immer eine Möglichkeit bieten, im Zusammenspiel mit anderen Anwendungen zu funktionieren, sonst ist eine Automatisierung eines Prozesses, in welchem dieses Programm vorkommt, nicht möglich. Dadurch, dass bei einer Web-App meistens ein Server vorhanden ist, der eine Schnittstelle für das Frontend bereitstellt, kann diese Schnittstelle oft auch von anderen Programmen verwendet werden.
31
31
32
-
###📲 Updates passieren automatisch
32
+
## 📲 Updates passieren automatisch
33
33
34
34
Eine Software, die nicht gewartet wird, stirbt bekanntlich irgendwann aus. Updates sind essentiell, um Fehler zu beheben, neue Features einzubauen und die Software an neue Bedingungen anzupassen. Daher ist es von großem Vorteil, wenn jeder Benutzer immer die aktuelle Version einer Software benutzt. Bei nativen Anwendungen bedeutet das, dass auf jedem Gerät das Update installiert werden muss. Je nach Art der Nutzer, bedeutet das einen großen Administrationsaufwand (z.B. in einer Unternehmensstruktur) oder es dauert sehr lange, bis alle Nutzer das Update installiert haben, z.B. bei privaten Nutzern. Bei Webanwendungen dagegen laden die Nutzer die Anwendung meistens bei jedem Aufruf über das Netzwerk. Somit muss nur die Anwendung auf dem Server aktualisiert werden – die Clients updaten sich dann quasi von alleine. Der Administrationsaufwand wird dadurch drastisch reduziert.
35
35
36
-
###💸 Web-Apps sind oft günstiger zu erstellen als native Anwendungen
36
+
## 💸 Web-Apps sind oft günstiger zu erstellen als native Anwendungen
37
37
38
38
Alle oben beschriebenen Vorteile einer Webanwendung tragen erheblich dazu bei, die Kosten für den Betrieb und die Entwicklung einer Anwendung zu senken. Webanwendungen können nicht alles besser, aber sie sind oft ein sehr kosteneffizienter Weg, eine große Spanne an Funktionen abzudecken. Sowohl Frontend als auch Backend können zum Beispiel in einer gemeinsamen Programmiersprache (JavaScript/Typescript), geschrieben werden, wodurch eine schnelle und kosteneffiziente Entwicklung auch von einem kleinen Team möglich gemacht wird.
39
39
40
40
41
-
###Nachteile: Immer online, wenig Hardware-Support und Tracking
41
+
## Nachteile: Immer online, wenig Hardware-Support und Tracking
42
42
43
43
Natürlich sind Web-Apps kein Allheilmittel. Die vielen Vorteile bringen auch einige Nachteile mit sich, die nicht verschwiegen werden sollten:
Copy file name to clipboardExpand all lines: src/content/services/camunda-automatisierung.mdx
+2-2Lines changed: 2 additions & 2 deletions
Original file line number
Diff line number
Diff line change
@@ -12,11 +12,11 @@ import { LinkButton } from "@components";
12
12
13
13
In der heutigen Welt ist die Automatisierung von Prozessen ein entscheidender Faktor für den Erfolg eines Unternehmens. Digitale Prozesse versprechen oft höheren Durchsatz, bessere Effizienz und geringere Kosten als ihre analogen Gegenstücke. Mit [**Camunda**](https://camunda.com/), einer leistungsstarken und flexiblen Open-Source-Plattform, digitalisieren und automatisieren wir Ihre Geschäftsprozesse auf nachhaltige und sinnvolle Art.
14
14
15
-
###Was ist Camunda?
15
+
## Was ist Camunda?
16
16
17
17
**Camunda** ist eine moderne Plattform zur Workflow- und Entscheidungsautomatisierung, die sich nahtlos in bestehende IT-Infrastrukturen integrieren lässt. Sie unterstützt sowohl **BPMN** (Business Process Model and Notation) als auch **DMN** (Decision Model and Notation) als Modellierungssprache, wodurch Unternehmen in der Lage sind, sowohl komplexe Workflows als auch Geschäftsentscheidungen zu modellieren und zu automatisieren.
18
18
19
-
###Vorteile der Prozessautomatisierung mit Camunda
19
+
## Vorteile der Prozessautomatisierung mit Camunda
20
20
21
21
-**Effizienzsteigerung**: Durch die Automatisierung manueller Prozesse werden Arbeitsabläufe beschleunigt und Fehler reduziert.
22
22
-**Skalierbarkeit**: Camunda bietet die Möglichkeit, Prozesse auf Unternehmensebene zu skalieren und zu optimieren.
0 commit comments