Observable Anxiety

Ein passender Titel für den Vortrag auf der NG-CONF 2018 von Ward Bell & Sander Ellis zum Thema „Angular APIs with RxJS“:

.pipe your Observables!

Angular APIs using RxJS: HttpClient, AsyncPipe, Forms, Router:

  • .get() with .subscribe() in your service, .pipe() the Observable and map() it there to the object you want to consume in your components, then use the service in your components
  • .post() with .subscribe(), including error-handling
  • or get the data with using async in your template and error handling (catchError()) in the component
  • with Angular reactive forms APIs valueChanges-Observable, .pipe() with tap() for error message, and three functions to reduce http-requests: debounceTime(), disctinctUntilChanged() and switchMap() for discarding an inflight-search, .pipe()‚d again to sandbox the errors inside the switchMap() so that examining the Observable does not complete, e.g. for auto-completion (use reactive style instead of Angular template-driven forms)
  • error isolation (explicit example) for sandboxing errors in an isolation level with the help of another .pipe() to map() and catchError() inside the .pipe() to switchMap(). RxJS rule: if an error occurs, the upstream is dead.
  • ActivatedRoute used with Observable paramMap.pipe(), Router events and url address path change while navigating on the same component with changing routerParams, map() and then switchMap(), again to cancel previous queries. Including watching the routing for debugging (altenrnative .subscribe()-style!)
  • Recommended way if subscribing to an Observable: .unsubscribe() from the source, a Subject, with Observable.onDestroy.next() in life cycle event hook ngOnDestroy() with the aid of Observable.pipe() to takeUntil() emitting the Subject in the Observable.pipe() to complete the Observable which prevents memory leaks. .unsubscribe() when in doubt with takeUntil(notifier) pattern. It never hurts to .unsubscribe()!
  •  .subscribe() takes: 1.) the happy (or: the next channel), 2.) the sad (or: the error channel) and 3.) alert things when the Observable completes (which means the Observable terminates and let go of any subscribers)
  • async autosubscribes when the Component is destroyed, but emits no „completed“: savely use AsyncPipe in the components template!
  • combine multistreams: bring multiple streams from Observers and Subjects together with combineLatest() .pipe()‘d to map() for mapping them into an immutable array of immutable objects
  • role your own Observables which have .next(), .error() and .complete(), from properties („rolling http of local storage“) in the component
  • create a new result array when any source emits an Observable array with .pipe()‚ing the Observable to scan(), which accumulates all incoming Observables into an array starting empty with startWith( [] ). combineLatest() takes the latest value of every Observable it gets
  • sort values in an additional map()
  • (not in movie) filter() the .pipe()‚d Observable to filter out unwanted values

Observable Decision Graph:
https://xgrommx.github.io/rx-book/content/which_operator_do_i_use

Source fork (Angular 7 / Node 10 commit):
https://github.com/Mesqualito/rxjs-in-ng-angular_berlin

Python3 pandas-Bibliothek

Wirklich fein.

DIE WELT HÄNGT AN EINEM KOMMA.

Und nicht vergessen: „Truth value of a Series is ambiguous.
„The or and and python statements require truth-values. For pandas these are considered ambiguous so you should use „bitwise“ | (or) or & (and) operations:
These are overloaded for these kind of datastructures to yield the element-wise or (or and).“

Da braucht es Ruhe. Schöne Ruhe. Hacking music Ruhe.

Angular 9 switchMap

Observable bedeutet zu deutsch: „Beobachtbares“

Die Funktion: mit switchMap kann zum Observable geschalten werden, welches sich zuletzt geändert hat („switch to a new observable“).

Der switchMap-Operator aus der RxJS-Bibliothek bildet jedes Element auf ein Observable ab. Er ordnet alle empfangenen Observables auf einer Ebene ein. Der switchMap-Operator projiziert jeden Wert aus der Quelle in ein Observable und führt dieses in einem Ziel-Observable zusammen, welches vom switchMap-Operator schließlich ausgegeben wird. Im Ziel-Observable finden sich immer nur die Werte, die vom zuletzt von der Quelle abgegebenen Observable empfangen wurden.

Die Syntax des switchMap-Operators

switchMap<T, R, O extends ObservableInput>(project: (value: T, index: number) => O, resultSelector?: (outerValue: T, innerValue: ObservedValueOf, outerIndex: number, innerIndex: number) => R): OperatorFunction<T, ObservedValueOf | R>

Der Parameter project in der Syntax ist eine Funktion, die ein Observable zurück gibt, sobald sie auf ein Element angewandt wird, das von einem Quell-Observable ausgegeben wurde.
Der Parameter resultSelector ist optionell und der Standardwert dieses Parameters ist nicht definiert. Der Rückgabewert, „OperatorFunction<T, ObservedValueOf | R>“, ist ein Observable, welches das Ergebnis liefert, das aus der Anwendung der projection-Funktion (und dem optionalen, veralteten [„deprecated“] resultSelector) auf jedes Element, welches aus dem Quell-Observable übergeben wird, resultiert, wobei nur die Werte des zuletzt proijezierten, inneren Observables verwendet werden.

Den switchMap-Operator in Angular anwenden

Der switchMap-Operator liefert ein Observable zurück, das Elemente ausgibt, auf welche eine Funktion, die dem Operator als Parameter mitgeliefert wird, angewandt wird. Dabei wird die Funktion auf jedes Element, das vom Quell-Observable kommt, angewandt. Diese Funktion gibt bei jeder Anwendung intern im switchMap-Operator ein inneres Observable zurück. Jedes Mal wenn eines dieser inneren Observable in Betracht gezogen wird, beginnt das von der switchMap zurückgelieferte Observable, die Elemente dieses inneren Observables  auszugeben.

Wenn ein neues, inneres Observable verarbeitet wird, beendet switchMap die Ausgabe der Elemente des vorher ausgelieferten, inneren Observable und beginnt, die Elemente des neuen, inneren Observable zurück zu liefern. Dieser switchMap-Prozess setzt sich kontinuierlich für jedes folgende, innere Observable fort.

switchMap-Einsatz beim Angular Routing

Der switchMap-Operator kann mit Angulars Activated Route verwendet werden.

Als erstes müssen Router, ActivatedRoute und ParamMap Wertmarken [„token“] aus dem router-Paket importiert werden. Anschließend muss der switchMap-Operator importiert werden, der dazu verwendet wird, die beobachtbaren [„observable“] route-Parameter abzuarbeiten. Wie gewöhnlich schreiben wir einen constructor, der Angular anfragt, services einzuspeisen, welche die Komponente benötigt, und diese mithilfe privater Variablen zu referenzieren.

In der ngOnInit-Methode verwenden wir den ActivatedRoute service, um die Parameter für das route-Objekt abzurufen, den employee ID aus den Parametern heraus zu ziehen und den employee zu extrahieren, den wir anzeigen wollen. Die Abarbeitung der paramMap ist etwas knifflig. Wenn die map sich ändert, bekommen [„get()“] wir die ID Parameter von den geänderten Parametern. Man könnte denken, jetzt wäre die Gelegenheit die RxJS map zu verwenden, der EmployeeService Operator liefert jedoch ein Observable zurück. Deswegen ebnen wir stattdessen das Observable mit dem switchMap-Operator ein. Zusätzlich verwirft der switchMap-Operator vorhergehende, „fliegende“ Anfragen. Wenn der Benutzer mit einer neuen ID zur gleichen Route zurück kehrt während der EmployeeService noch eine alte ID verarbeitet, verwirft switchMap die alte Anfrage und liefert den employee für die neue ID zurück.

Teilweise Übersetzung des Artikels von Yallaling Goudar. Code-Beispiele und weitere Ausführungen dort.

Ebenso ein nützlicher Link: switchMap auf Learn RxJS.

Programmiersprachen

Wieder etwas für’s IT-Archiv: Deepu Sasidharans „reflections“ über
Go-Lang, JavaScript (und dessen Quirks und Module), Impressionen von Rust und die Programmiersprachen-Übersicht für 2020.

Angular Logo
Java Logo
Spring boot Logo
Typescript LogoMir persönlich reicht die Beschäftigung mit Typescript, html5, CSS – oft im Rahmen von Angular – und natürlich seit Jahren Java, getuned im Spring framework, beschleunigt mit dem Turbo Spring-Boot und ergänzt durch weitere paradiesische Inseln wie Lombok.

Python LogoDaneben lässt sich mit Python und seinen mächtigen Bibliotheken kräftig mit BigData arbeiten, Daten für Schnittstellen zurecht schnitzen und Analysen erstellen. Auch als Skriptsprache zur Automatisierung im Systemadministratoren-Alltag, zur Datensammlung und für Bot-Actions eine feine Sprache. Zudem erinnert mich dann die Ausführung  von Python-Applikationen an die Truppe um John Cleese, Eric Idle, Michael Palin, Terry Gilliam und Terry Jones!

Dazu muss ich unbedingt zur Data School von Kevin Markham verlinken – „Big work“!
Def. big work: The amount of work for which a scale is no longer necessary or practical. Typically, when you do ‚big work‘, you become familiar with putting bricks in the spare.

disruptive… resilient… advocate…

und:

Visionary companies are guided by a mission, not just a sustainable business model, and seek out challenges that can help move humanity forward.

Das sind nur einige goldene Worte aus „Scripting the Future“, einem lesenswerten Blog-Eintrag auf StackOverflow von CEO Prashanth Chandrasekar über den Wandel der IT beim Eintritt in eine neue Dekade.

JHipster in Unterfranken

Gesucht: jhipster-Mitarbeiter.
Was ist JHipster?
=>Wikipedia
=> Aktueller JavaPro-Artikel
=>JHipster-Webapp
=>JHipster-Studio
=>JHipster Unterfranken

Gut. Wieso kein WordPress, kein php? Doch, das auch. Ist doch hier ein WordPress.

WordPress ist nur keine Kombination aus einem Spring framework im Backend und einem an diese API angebundenen Angular framework mit SASS und jeglichem Pipapo im Frontend. Und JHipster liefert alles mit aus, was es benötigt, um höchstprofessionelle, skalierbare, sichere, mehrsprachige, benutzerfreundliche und hoch individualisierte Webanwendungen zu bauen und sich dabei an einem feinen Regelwerk der Handwerkskunst zu orientieren.

Spring Data JPA vs. Spring Data JDBC

Spring Data JPA (im Folgenden: JPA) ist im Abstraktionsgrad über Spring Data JDBC (im Folgenden: JDBC).

Mit JDBC müssen eigene Abfragen in SQL geschrieben werden, die „result sets“, also die zurück gelieferten Daten, müssen selbst geparst werden und sollen aus Objekten datenbank-konforme, ggf. relationale Daten oder aus diesen Daten wieder Objekte erstellt werden, muss auch das per Hand erfolgen. Das bedeutet unter anderem, man muss die SQL der jeweiligen Datenbank kennen.
Bei wenigen Datenbank-Aktionen ist JDBC eine große Erleichterung verglichen mit den noch weniger abstrahierten Zugriffen über direkte Sockets und der direkten Verwendung des jeweiligen Datenbank-Drivers.
Diese beiden Varianten sind die beiden schnellstmöglichen Wege, Datenbank-Zugriffe mit Java zu erreichen.

Mit JPA wird eine weitere Abstraktion hinzu gefügt. Über Entities (Objekte) werden Einträge in einer Datenbank (Tabellen und Felder) über Annotationen in den jeweiligen Klassen den Objekten und deren Eigenschaften zugeordnet. Mit Spring wird dazu ein Repository verwendet, eine Klasse, die sich um die CRUD-Operationen (create, read, update, delete) der jeweiligen Entity-Klasse kümmert.

Test driven development

Between too low and too slow – test modules!

Ein Modul:
– kann eine bis mehrere dutzend Klassen umfassen
– kapselt seine Daten (access only via API)
– hat klar definierte Co-Worker / „collaborators“ und APIs
– umfasst (fast) alle Software-Schichten (vertical slicing)
– erinnert an einen Microservice bzw. ist ein guter Kandidat dafür, einer zu werden
– arbeitet in einem begrenzten Kontext, d.h. Worte haben ihre eigenen Definitionen bzw. Klassen

Fazit: auch beim Test-Driven Development das Gehirn nicht ausschalten…