Das Wissensportal für IT-Professionals. Entdecke die Tiefe und Breite unseres IT-Contents in exklusiven Themenchannels und Magazinmarken.

SIGS DATACOM GmbH

Lindlaustraße 2c, 53842 Troisdorf

Tel: +49 (0)2241/2341-100

kundenservice@sigs-datacom.de

Wenn man nur Tools im Kopf hat – Fortsetzung

Hallo, bereits in der letzten Ausgabe JavaSpektrum 1/2023 hatte ich 25 Tipps vorgestellt, da die Tool Talk-Kolumne zum 50. Mal erschienen ist. Genau damit soll es jetzt auch weitergehen: 50 Tipps aus allen möglichen Bereichen.
Author Image
Thomas Ronzon

Projektleiter und Senior Softwareentwickler


  • 24.03.2023
  • Lesezeit: 22 Minuten
  • 32 Views

26) Mal wieder eine neue Programmiersprache lernen – diesmal Faust

Es ist sicherlich nicht schlecht, wenn man ab und an mal wieder eine neue Programmiersprache lernt. Hier ein Beispiel:

import("stdfaust.lib");
process = ba.pulsen(1, 10000) : pm.djembe(60, 0.3, 0.4, 1) <: dm.freeverb_ demo;

Und? Was ist es? Hierzu sagt die Website [FAUST]: Faust (Functional AUdio STream) ist eine Programmiersprache, die speziell für die Erstellung von digitalen Synthesizern und Audio-Effekten gedacht ist. Faust unterstützt das funktionale Programmierparadigma und man kann den geschriebenen DSP-Code schnell in eine andere allgemeine Programmiersprache, wie C, C++, Java, JavaScript oder Web Assembly, übersetzen. Außerdem ist es möglich, diesen generierten Code leicht in verschiedene Objekte zu kompilieren: Audio-Plug-ins, Standalone-Anwendungen, Smartphone- oder Web-Apps. Wer mag, kann gleich loslegen, da die IDE auch als WEB-IDE verfügbar ist.

Abb. 1: Faust kann direkt im Browser programmiert werden

27) Sourcetrail – der Weg durch unbekannte Sourcecodes

Zwar wurde das Projekt Ende 2021 eingefroren (vielleicht findet sich ja unter den Lesern jemand, der das Projekt weiterführt), aber trotzdem verfolgt es einen interessanten Ansatz, um sich in unbekannte Sourcecodes einzuarbeiten.
Nach dem Download von [SOT] erlaubt es, die Sourcen in den verschiedensten Programmiersprachen (Java, Python, C, C++ …) zu importieren und danach zu indizieren. Nun können diese mit verschiedensten Werkzeugen durchsucht und aufbereitet werden, um einen Einstieg in diese zu finden.

Tipp: Die Indizierung dauert relativ lange – wird aber ja auch nur einmal gemacht. Ein Beispiel findet ihr übrigens in Abbildung 2.

Abb. 2: Sourcetrail in Aktion

28) Weil nicht immer der Hammer das einzige Werkzeug ist

Gerade in der Industrie gibt es noch viele alte Geräte, die immer noch seriell angebunden sind wie zum Beispiel Lkw-Waagen, die im Boden eingelassen sind. Hat man dann endlich einen Computer gefunden, der noch serielle Anschlüsse hat oder womöglich sogar einen Seriell-zu-USB-Konverter, so ist in der Regel nativer Code nötig, um dies in das Projekt zu integrieren, da das JDK keinen Zugriff auf diese Anschlüsse hat.

Aber warum soll man sich hier um alles selbst kümmern? Vielen Softwareentwicklern ist unbekannt, dass es besser ist, hier auf sogenannte COM-Server zurückzugreifen, wie sie verschiedene Händler anbieten (s. Abb. 3). Dieses kleine Stück Hardware macht einem seriellen Gerät nämlich ein Netzwerkgerät, das über die Standard-Socket-Methoden kommunizieren kann. Alles, was ihr tun müsst, ist dem Gerät eine IP-Adresse in eurem Netzwerk zu geben und einen Port zu konfigurieren, über den ihr kommunizieren wollt – und sorgenfreier als direkte serielle Kommunikation ist diese Lösung allemal. Nebenbei macht ihr auch noch den Admin glücklich, weil er das Gerät, zum Beispiel die Waagen, endlich überwachen kann [SE-RI1] [SERI2].

Abb. 3: COM-Server mit drei seriellen Schnittstellen an einen Netzwerkport

29) In Tabellen Spalten und Zeilen tauschen? – LibreOffice hilft

Kennt ihr das auch? Ihr habt Testdaten, möchtet aber, dass Zeilen und Spalten getauscht sind. Sicherlich kann man hier ein kleines Skript schreiben – aber warum? Gerade weil LibreOffice so viele Formate kennt, eignet es sich gut, diese Aufgabe zu übernehmen. Alles, was ihr machen müsst, ist das Dokument zu laden und dann die Daten markieren und mittels Rechtsklick auf „Kopieren“ in die Zwischenablage kopieren.

Nun könnt ihr zum Beispiel in einem neuen Sheet wieder die rechte Maustaste drücken und mittels „Inhalte einfügen->Transponieren“ diese einfügen. Fertig!

30) Welche Anwendung „hängt“ an welchen Ports

Oft ist es interessant zu wissen, welche Anwendung auf dem System über welche Ports kommuniziert. Gerade wenn das System neben der „offiziellen“ IP-Adresse auch noch über virtuelle IP-Adressen verfügt. Hier kann das Tool netstat helfen.
So zeigt netstat -tulpn alle gewünschten Informationen an. Aber Vorsicht! Als normaler User sieht man nicht alles – erst als root werden alle Informationen ausgegeben.

Tipp: Wir hatten neulich einen interessanten Fehler, den wir so lokalisieren konnten. Auf einem System mit mehreren virtuellen IP-Adressen konnte nur auf einen Prozess nicht über JMX zugegriffen werden, obwohl alle Prozesse die JMX-Parameter richtig gesetzt hatten.

Ein Blick mit dem oben beschriebenen netstat-Aufruf zeigte, dass alle Prozesse auf dem richtigen JMX-Port lauschten. Einzig der Problemprozess lauschte zwar auf dem Port, aber versuchte, sich an alle IP-Adressen zu binden (was nicht ging). Warum? Der

Servername hatte einen Tippfehler, sodass die richtige IP-Adresse nicht aufgelöst werden konnte!

31) Der Blick in die Zukunft mit jshell

Möchte man Preview-Funktionalitäten des JDK einfach ausprobieren, so kann man dies leicht in der jshell. Allerdings muss man diese explizit aktivieren. Ein: genügt und schon kann man mit minimalem Overhead mit den

jshell –enable-preview

neusten Features „spielen“.

32) Codefragmente finden – CodeFinder

Sicherlich geht es euch auch oft so, man möchte nicht nur die API-Doku einer Klasse lesen, sondern wünscht sich ein Beispiel. Sicher – das ein oder andere Beispiel findet man durch eine geschickte Suche bei google. Dabei finden sich dann Stellen bei Stackoverflow oder ähnlichen Portalen, die aber nicht unbedingt funktionieren müssen. Ein weiteres Problem ist, dass es sich hier um Foreneinträge handelt, die die Verwendung meist nur rudimentär zeigen. Besser wäre es, mal ein echtes Projekt zu analysieren und dabei zu schauen, wie die ein oder andere Klasse eingesetzt wird.

Leider werden aber Software-Repositorys zum Beispiel von github nicht von Google in den Index aufgenommen, da sie zu umfangreich sind. Hier hilft CodeFinder unter [CF]. Diese Site bietet nämlich einen Index über Sourcecodes zum Beispiel bei github und schon hat man Beispiele der Klassen „in freier Wildbahn“.

33) Sicherheit für die Datenzugriffe – Pentesting mit sqlmap

Pentestingtools gibt es mittlerweile einige auf dem Markt. Ein Tool, das extra für die Untersuchung von SQL-Injections erstellt wurde, ist sqlmap [SQLM]. Direkt auf der ersten Seite findet sich bereits ein schönes Einführungsvideo, das es schafft, in nur 59 Sekunden einen tollen Eindruck zu vermitteln.

34) Große Dateien herunterladen

Vielen wird das Werkzeug wget zum Download bekannt sein. Es gibt allerdings eine Option, die relativ unbekannt ist. Ich meine die Option -c für „continuous“.

Diese Option macht nichts anderes, als dass der Download genau dort wieder ansetzt, wo es das letzte Mal aufgehört hat. Wenn ihr also wieder mal bei langsamer Leitung eine große Datei herunterladen wollt, nutzt: wget -c <Dateipfad>. Der Download kann nun mittels der Tastenkombination CTRL-C jederzeit abgebrochen und mit erneuter Eingabe von wget -c <Dateipfad>; wieder gestartet werden.

35) Suizid in Java - der SelfDestructTimer

Wofür dieser Hotspot-Schalter sinnvoll eingesetzt werden kann, kann ich leider auch nicht sagen, aber umso erstaunlicher ist es, dass es ihn überhaupt gibt. Wenn ihr ihn testen möchtet, so schaut euch mal das kleine Programm aus Listing 1 an.

public class Tester {
public static void main(String[] args) {
while (true) {
System.out.println("Ich lebe... \n");
}
}
}
Listing 1: Wer ewig leben will …

Nun startet es nach dem Übersetzen einmal mittels

java -XX:SelfDestructTimer=1 Tester

Und? Nichts passiert? Doch! Nach einer Minute beendet sich das Programm selbst!

Abb. 4: „97 Things Every Java Programmer Should Know” [97T]

36) Die RFC – bei vielen mittlerweile unbekannt und doch sooo wichtig

Bei den RFC (Request for comment) handelt es sich um eine Sammlung von Spezifikationen in reinem ASCII-Text. Diese beschreiben dabei so wichtige Dinge wie beispielsweise das Telnet-Protokoll (RFC 854) oder HTTP 1.1 (RFC 9112). Veröffentlicht werden diese vom RFC-Editor unter [RFCE]. Dabei lohnt es sich, nicht nur einmal nachzuschlagen, wie das ein oder andere, das wir täglich nutzen, eigentlich funktioniert. Es zeigt auch, wie man mit minimalem technischen Aufwand (ASCII-Text!) anspruchsvolle und gut lesbare Spezifikationen erzeugen kann.

37) jentsch.io - Der Blog für alle, die Spaß an der IT haben, auch wenn es harte Arbeit ist

Der Blog von Michael Jentsch [JIO] ist eine bunte Sammlung von Maker-Erfahrungen über Tool-Tipps bis hin zu Programmierhilfen. Michael beschreibt in einer bunten Mischung mit schönen Bildern einfach alles, was das Nerd-Herz begehrt. Und warum stelle ich ihn hier vor? Nun, weil er auch Themen behandelt, die für Entwickler sehr interessant sind. So zum Beispiel, wie man ein Reverse Engineering bei Android-Apps durchführt [REA]. Schaut mal rein – man will eigentlich alles gleich selbst ausprobieren.

38) Storys aus allen Bereichen: medium.com

Nicht jeder, der (in der IT) etwas sagen möchte, braucht dabei gleich seinen eigenen Blog. Medium [MED] stellt eine Plattform bereit, auf der jeder seine Story teilen kann. Inzwischen finden sich hier Tausende von Storys aus den unterschiedlichen Bereichen. Ebenso wie bei dem unter 37 beschriebenen Blog will man gar nicht mehr aufhören. Ein Beispiel gefällig? Schaut mal unter [ROM]. Hier findet ihr meinen Eintrag zum Thema „How to crash your VM“, in dem ich beschreibe, wie man die JVM zum Absturz bringt. Warum? Ja, lest es einfach mal nach.

Ach ja – diesen und weitere Tipps für Java Entwickler findet ihr auch in dem Buch „97 Things Every Java Programmer Should Know: Collective Wisdom from the Experts“ [97T], das Kevlin Henney und Trisha Gee zusammengestellt haben.

39) Java für Retrofans

Man kann es kaum glauben, aber Java ist mittlerweile auch in der Retro-Szene angekommen. Wer so alt ist wie ich und Mitte der 1980er bis Mitte der 1990er einen Commodore Amiga besaß, war unter anderem von dessen Soundfähigkeiten beeindruckt. Es war schon erstaunlich, welche Klänge die Entwickler damals aus Paula (so der Name des Soundchips 8364Rxx) herausholten. Noch heute gibt es hier eine riesige Fangemeinde, die zum Beispiel hier MOD-Dateien zum Download anbietet [MOD]. Dabei kann man natürlich die Sound-Dateien im Browser hören, oder aber einen Standalone-Player in Java verwenden, aus dessen Sourcecode man gleich noch eine Menge lernen kann.

Hier bietet sich der javamod-Player an, der unter [JMOD] heruntergeladen werden kann. Nicht nur, dass er sehr schlank ist, er kann auch SID-Dateien des Commodore C64 abspielen (auch wenn Puristen meinen, dass dies nicht sein kann, da der SID eine analoge Komponente hat). Alles, was man tun muss, ist die ZIP-Datei zu entpacken, und schon kann mittels

java -cp ./javamod.jar de.quippy.javamod.main.CommandLine <MODFILE>

die MOD-Datei gehört werden.

40) Memory-Analyse für Fortgeschrittene I – Heapdumps mit der jconsole erzeugen

Wie man einen Heapdump erzeugt, habe ich ja an den unterschiedlichsten Stellen schon gezeigt. Zur Erinnerung: Eine Möglichkeit ist, mit der jconsole an die Anwendung „anzudocken“ und dann auf das Mbean-Tab zu wechseln. Nun kann man als Operation der com.sun.management.HotSpotDiagnosstic-Mbean die Operation zum Generieren eines Heapdumps wählen (s. Abb. 5).

Abb. 5: Erzeugen eines Heapdumps mit der jconsole

Um diesen Speicherabzug aber nicht nur simple manuell auszuwerten, gibt es ein tolles Tool, von dem ich in den nächsten Tipps mal die ein oder andere Funktionalität zeigen möchte.

41) Memory-Analyse für Fortgeschrittene II – Eclipse Memory Analyser

Nach dem Download unter [EME] kann die ZIP-Datei entpackt und der Memory Analyser gestartet werden. Was nun öffnet, ist eine ganze IDE zur Analyse von Heapdumps. Dabei sollte sich jeder Entwickler mit Eclipse-Grundkenntnissen schnell zurechtfinden. Natürlich bietet auch der Eclipse Memory Analyser eine entsprechende Funktion: „Aquire Heap Dump“, allerdings ist dieser ja selten auf dem Produktivsystem installiert.

Versucht doch mal einen Heapdump, wie unter 40 gezeigt zu öffnen und eine automatische „Leaks suspects“-Analyse durchzuführen. Bereits hier erkennt man, wie übersichtlich die Ergebnisse präsentiert werden (s. Abb. 6).

Abb. 6: „Leaks Suspects”-Analyse mit dem Eclipse Memory Analyser

42) Memory-Analyse für Fortgeschrittene III – Heapdumps vergleichen

Sicherlich kann das Tool noch viele Dinge mehr, die aber diesen Artikel sprengen würde. Eine Sache aber, die ich schätzen gelernt habe, ist der Vergleich von Heapdumps! So kann man zum Beispiel nach einen Bugfix vergleichen, ob der Heapdump nun besser aussieht. Hierzu öffnet man den ersten Speicherabzug und wählt „Create a histogram“, welches ein Klassenhistogramm erzeugt. Nun erscheint im Menü dieses Histogramms der Punkt „Compare to another heapdump“. Wählt man hier den zweiten Heapdump, so kann man beide vergleichen!

43) Sind hier gute Drummer unter Euch?

Manchmal möchte man sich während der Entwicklung einmal ein wenig abreagieren – beispielsweise, wenn im Produktivsystem wieder mal eine Exception fliegt und man nicht weiß, wo sie herkommt. Wie wäre es mit ein wenig Schlagzeugspiel!

Unter [JSDS] findet ihr JS Drum Sound. Eine kleine Java-Script-Spielerei, die eure „Schlagzeugfinger“ zum Glühen bringt. Und wenn ihr das Ganze ohne Installation testen wollt, schaut mal hier [JSDD]. Ja simpel – aber fesselnd! Und? Wer wird der neue Roger Taylor [RT]?

Abb. 7: DrumKit – bringt die Finger zum Glühen

44) Hurra – die Post ist da! E-Mail-Adressen parsen mit jmail

Immer wieder kommt es vor, dass man eine E-Mail-Adresse parsen muss, um zum Beispiel zu ermitteln, ob es sich um eine valide Adresse handelt. Und immer wieder denkt man sich: Ist nicht so schwer – kann ich selber machen! Das muss aber nicht sein. Unter [JM] steht hier eine kleine, aber feine Library zur Verfügung, die alle Java-Versionen ab Java 8 unterstützt. Interessant ist aber auch die Seite [JMV], die einmal aufzeigt, welche Schwächen bei diesem Thema bekanntere Bibliotheken wie die deutliche bekanntere Validierung von Apache Commons haben.

45) Java Grinder – Java für alle

Habt ihr euch mal gefragt, ob man Java-Code auch für die „Kleinsten“, also langsame Prozessoren oder sogar Mikrocontroller, schreiben kann. Java Grinder [JG] geht hier den Weg, dass es keine JVM für die Architekturen darstellt, sondern dass es direkt den

Code für diese compiliert. Dabei ist die Anzahl der Zielarchitekturen schon gewaltig. Hier ein kleiner Auszug:

  • 6502: Commodore 64, Atari 2600
  • 68000: Amiga, Sega Genesis
  • MIPS: Playstation 2, chipKIT Uno32
  • TMS9900: TI99/4A
  • Z80: TI84 Calculator, Amstrad CPC
  • ...

Wer sich das ganze praktisch ansehen möchte, der kann unter [JGA] einmal sehen, wie Java-Programme auf dem 68000er eines Commodore Amigas ausgeführt werden.

46) Ghirdra Amiga – was soll denn das?

Bei Ghirda handelt es sich um eine Software zum Reverse Engineering, die von der NSA entwickelt wurde (warum wohl?) und die diese komplett als Open Source freigegeben hat [GHI].

Bei dem Projekt Ghirdra [GHA] Amiga handelt es sich um ein in Java geschriebenes Plug-in, welches Executables für den Commodore Amiga analysieren kann. Jetzt werden die wenigsten von euch sicherlich Amiga Executables analysieren wollen, oder? Seht dieses Projekt eher als Beispiel, wie man Ghirdra mittels Java erweitern kann. Denn sicherlich denken die wenigsten bei Reverse Engineering Software daran, diese in Java zu implementieren. So ist es jedoch möglich, auch eigene Formate zu analysieren, weil man sich auf das mächtige Ghirdra stützen kann.

47) Java Retro Hardcore – die C64 Java Disk Library

Es ist immer wieder erstaunlich, was die Leute in ihrer Freizeit so für Code schreiben. So findet sich zum Beispiel hier [JDL] eine Library, die erlaubt, d64-Disk-Images zu lesen und zu analysieren. Als Beispiel sind unter [D64] einige Images zu finden.

Dies ist aber nicht nur für Reto-Fans interessant, da das Diskettenformat nicht nur von Commodore 64, sondern auch von den für den professionellen Einsatz konzipierten CBM-8000-Serien verwendet wurde. Somit können auch diese Disketten (wie auch die des VC 20 oder C16, C116 oder Plus 4) gelesen werden.

Interessant ist auch, dass dieses Projekt meiner Meinung nach zeigt, wie man bitweise arbeitet. Dieses Wissen ist ja auch zum Beispiel bei der Implementierung von Low-Level Protokollen von Nöten, obwohl wir beim größten Teil unserer Arbeit uns selten auf so eine tiefe Ebene begeben. Schaut mal rein, auch wenn ihre kein Retro-Fan seid.

48) Java Anwendungen mit PRTG überwachen

In vielen Firmen wird zur Überwachung der Server PRTG der Firma Paessler eingesetzt. Aber warum sollte man nur Server überwachen. Durch die Möglichkeiten von JMX ist es auch möglich, Java-Anwendungen zu überwachen. Alles, was man benötigt, ist quasi eine kleine Bridge von JMX zu dem von PRTG verwendeten JSON-Format. Sicherlich sind die gitbub-Repositioris nicht mehr ganz neu, aber sie zeigen immer noch beispielhaft, wie dies erreicht werden kann. [PRTGB] [PRTGB2]

49) JMX in der Shell - JMXTerm

Ab und zu möchte man eine Applikation mit JMX überwachen und das Ergebnis in der Shell auswerten. So basiert zum Beispiel die Hochverfügbarkeit der Red Hat Cluster Suite darauf, dass die Clustersoftware in regelmäßigen Abständen den Status der Software abfragt, die hochverfügbar betrieben werden soll.

Um dies zu realisieren, muss also von der Shell der Status der Java-Applikation ermittelt werden. Hier kommt JMXTerm [JMXT] ins Spiel. Dabei handelt es sich um einen kleinen JMX-Client, der textbasiert JMX-Abfragen an Java-Programme schicken beziehungsweise empfangen kann. So wird es von der Kommandozeile möglich.

50) Patterns for API-Design

Als letzten möchte ich ein Buch empfehlen, das Addison-Wesley ganz neu in seiner Signature-Reihe herausgegeben hat (s. Abb. 8). Vielleicht erinnert ihr euch an die Tool Talk-Ausgabe 1/20. Hier habe ich die Website Microservice-API-Pattern [MAP] vorgestellt. Das Team dieser Website um Dr. Olaf Zimmermann hat nun das gesammelte Wissen zum Thema API-Design in einem Buch herausgebracht. Dabei handelt es sich sicher nicht um ein Buch für die Badewanne – denn damit ist es mit seinen über 500 Seiten sowieso zu schwer. Wer aber Teile seiner Software über (öffentliche) APIs kommunizieren lassen möchte, dem sei dieses Buch ans Herz gelegt. Aber auch alle anderen erhalten hier einen guten und tiefen Einblick in das Thema API-Design. Und mal ehrlich – welche Software existiert heute noch auf der grünen Wiese ohne Kontakt zur Außenwelt?

Abb. 8: „API Design Patterns” von Zimmermann, Stocker, Lübke, Zdun, Pautasso, ISBN 978-0.13.767010-9

Fazit

Wie ihr seht, muss es nicht immer die große Innovation sein, manchmal sind es eben auch die kleinen Tricks, die unsere Arbeit erleichtern. :-)

Weitere Informationen

[50T]
https://www.youtube.com/watch?v=G04yvNyOrWY

[97T]
https://www.oreilly.com/library/view/97-thingsevery/9781491952689/

[CF]
https://codefinder.org/

[D64]
https://www.commodoreserver.com/PublicDisks.asp?CID=449E7C5034E7407C8FF411EC0513FD0F

[EME]
https://www.eclipse.org/mat/downloads.php

[FAUST]
https://faustide.grame.fr/

[GHA]
https://github.com/BartmanAbyss/ghidra-amiga

[GHI]
https://ghidra-sre.org/

[JDL]
https://gitlab.com/Cenbe/d64

[JG]
https://www.mikekohn.net/micro/java_grinder.php

[JGA]
https://hackaday.com/2020/01/13/run-java-on-an-amiga/

[JIO]
https://www.jentsch.io/

[JM]
https://github.com/RohanNagar/jmail

[JMOD]
https://quippy.de/mod.php

[JMV]
https://www.rohannagar.com/jmail/

[JMXT]
https://docs.cyclopsgroup.org/jmxterm

[JSDD]
https://sammedcjain.github.io/js_drum_sound/

[JSDS]
https://github.com/sammedcjain/js_drum_sound

[MAP]
https://microservice-api-patterns.org/

[MED]
https://medium.com/

[MOD]
https://modarchive.org/

[PRTGB]
https://github.com/PRTG/JMXMiniProbe

[PRTGB2]
http://www.adeptnet.org/prtg-java-instrumentation-library-via-managed-beans-mbeans/

[REA]
https://www.jentsch.io/android-app-reverse-engineering-am-beispiel-der-suntimes-app/

[RFCE]
https://www.rfc-editor.org

[ROM]
https://medium.com/97-things/think-about-the-worldoutside-of-your-window-ee2a0fdff47d

[RT]
https://de.wikipedia.org/wiki/Roger_Taylor_(Schlagzeuger, _1949)

[SERI1]
https://wiki.owasp.org/images/4/42/Java_Deserialisierung_-_Johannes_Baer.pdf

[SERI2]
https://javapro.io/4002-2/

[SOT]
https://github.com/CoatiSoftware/Sourcetrail

[SQLM]
https://sqlmap.org/

. . .

Author Image

Thomas Ronzon

Projektleiter und Senior Softwareentwickler
Zu Inhalten

Thomas Ronzon arbeitet als Projektleiter und Senior Softwareentwickler bei der w3logistics AG in Dortmund. Dabei beschäftigt er sich vor allem mit der Modernisierung von unternehmenskritischen Logistikanwendungen. Darüber hinaus veröffentlicht Thomas Ronzon regelmäßig Fachartikel.


Artikel teilen