Ist MUMPS am Leben? [geschlossen]


11

An meinem ersten Arbeitsplatz verwendeten wir Digital Standard MUMPS auf einem PDP 11-Klon (TPA 440), dann haben wir Anfang der 90er Jahre auf Micronetics Standard MUMPS umgestellt, das auf einem Hewlett-Packard-Computer, HP-UX 9, ausgeführt wurde.

Ist MUMPS noch am Leben? Gibt es jemanden, der es benutzt? Wenn ja, schreiben Sie bitte ein paar Worte darüber: Verwenden Sie es im Zeichenmodus, fungiert es als Webserver? usw. (Ich meine auch Caché.)

Wenn Sie es benutzt haben, wie haben Sie sich dabei gefühlt? Hat es dir gefallen?


1
Ich glaube nicht , dass jemand mag etwas , das aussieht wie diese . Zumindest Perl ist ausdrucksstark.
imgx64

13
"Lebt MUMPS?" - Ja, aber alle Entwickler bringen sich um.
Steven Evers

@ imgx64 Gott, das sieht schrecklich aus!
TheLQ

Sie müssen nicht die Kurzform der Befehle "DHSY =% YK% H,% YQ" verwenden. Sie sollten vollständige Befehlsnamen schreiben (und längere Beschriftungs- / Variablennamen verwenden): "Do HourCount Set Year =% YearParam Kill% HourParam ,% YearParam Quit ". Nachdem ich jahrelang kurze Befehlsformulare verwendet hatte, schrieb ich ein 20-Zeilen-Programm mit langformigen Befehlen und lang benannten Variablen. Meinen Kollegen wurde gesagt: "Okay, es ist ein guter Witz, aber mach es nicht noch einmal", es war zehnmal schwerer zu lesen als kurze Befehle.
ern0

Antworten:


11

Intersystems verkauft ein MUMPS-Derivat: http://www.intersystems.com

Einige der interessantesten Leute in MUMPS sind wahrscheinlich hier: http://www.outoftheslipstream.com/

Ich habe vor ein paar Jahren angefangen, über Cache (das MUMPS-Derivat) zu bloggen: http://cachetastic.blogspot.com/ (aber dann habe ich den Job gewechselt)

Ich bin seit ein paar Jahren nicht mehr auf dieser Welt und denke, dass die NoSQL-Bewegung wahrscheinlich das Beste und Schlimmste ist, was MUMPS passieren kann. Letztendlich wird es wahrscheinlich sowohl bestätigt als auch getötet. Denn irgendwann wird jemand die Datenbank- und Abfragestruktur von MUMPS fast identisch neu erfinden, jedoch ohne Verbindung zur MUMPS-Tradition. Dann werden die Leute von diesem neuen Speichersystem schwärmen. Aber niemand wird jemals wieder ein MUMPS-Derivat wählen.

Zum Beispiel habe ich vor ein oder zwei Monaten mit einem Kollegen über die Verwendung von Redis gesprochen, um eine Suche nach etwas in unserer Django-Anwendung zwischenzuspeichern. Wir hatten eine große Anzahl von Datensätzen, die mit einem Dreifach von drei Schlüsseln adressiert wurden, und mussten schnell Teilmengen erhalten, die mit einem oder zwei dieser Schlüssel übereinstimmen (aber unterschiedliche Kombinationen zu unterschiedlichen Zeiten).

So etwas isst MUMPS zum Frühstück. Es fiel uns jedoch schwer, uns in Redis 'Schlüssel-Val-Pair-Struktur hineinzuquetschen. Auch mit Wörterbüchern. (Gleiches gilt für Memcached usw.) Zum ersten Mal in meinem Leben bereute ich, dass ich dieses Modul nicht in Cache ObjectScript schreiben konnte.

Noch ein paar Gedanken zum Cache hier:

Gut: http://cachetastic.blogspot.com/2008/07/ok-after-mentioning-some-bad-things.html

Schlecht: http://cachetastic.blogspot.com/2008/07/some-mumps-dissing-and-more-positive.html


9

Lustiger Interstar sollte Redis erwähnen. Ich habe tatsächlich fast das gesamte Verhalten von Redis mit Mumps (sowohl Cache als auch GT.M) rückgängig gemacht. Das Emulieren der simplen und grundlegenden Struktur von Schlüssel / Wert-Paaren und APIs war ein Kinderspiel, und die von mir getesteten Redis-Clients wissen nicht einmal, dass sie mit einer Mumps-Datenbank anstelle der richtigen Redis sprechen.

Wie Interstar sagt, kann die Mumps-Datenbank jedoch sowohl in Bezug auf ihre Datenstruktur noch viel mehr (tatsächlich kann eine Mumps-Datenbank problemlos alle 4 NoSQL-Datenbanktypen emulieren: Schlüssel / Wert, Tabelle, Dokument und Grafik sowie Modellierung relationale und Objekt-Datenbank - bei Bedarf auf einmal) und das ordnungsgemäß sortierte und automatische Gleichgewicht zwischen In-Memory und Festplatte. Im Gegensatz zu den NoSQL-Datenbanken, die es erst seit wenigen Jahren gibt, sind die Mumps-Technologien ausgereift, erprobt, getestet, gut unterstützt und verfügen über Analyse- und Verwaltungspakete. Sie bieten die Leistung, für die viele NoSQL-Datenbanken wie CouchDB sterben würden .

Warum fördern die Anbieter von Cache und GT.M nicht hart den NoSQL-Markt, anstatt jemanden das Rad neu erfinden zu lassen, wie Sie sagen?

In Bezug auf die müden alten Streitereien über die Sprache und die Verwendung dieses alten und überholten Beispiels von der Wikipedia-Site:

a) Auf die Mumps-Datenbank kann Ihr Haustier zugreifen, wenn Sie möchten

b) Diese Art der Programmierung ging mit der Arche aus und wurde zu dieser Zeit so geschrieben, um die erstaunliche Leistung von PDP-Computern zu verbessern, die weniger Rechenleistung als der Chip in Ihrer Uhr hatten. Die moderne Mumps-Codierung ist Python im Stil sehr ähnlich und kann genauso sauber, lesbar und wartbar sein.

c) Wie in jeder Sprache gibt es gute und schreckliche Beispiele. Gehen Sie nicht davon aus, dass die Mumps-Codierung so undurchsichtig und altmodisch sein muss wie das Beispiel auf der Wikipedia-Website.

..und Mason, meine Schlussfolgerung wäre, dass Sie mit der Datenbanklandschaft vielleicht nicht so vertraut sind, wie Sie dachten! :-) Wenn Sie in Ihrem Leben irgendeine Form von medizinischer Behandlung erhalten haben, wurden Ihre Informationen auf dem Weg durch unzählige Mumps-Systeme übertragen, einschließlich solcher, die die Anforderung Ihrer Tests verwalten. Der Inhalt Ihrer Tageszeitung kann von einem Mumps-System verwaltet werden, und selbst die Pizza, die Sie online bestellt haben, wurde wahrscheinlich auch über ein Mumps-System verwaltet. Die Logistik von Artikeln, die Sie möglicherweise nach Übersee verschickt haben, wurde wahrscheinlich über ein Mumps-System verwaltet. Wenn Sie zufällig ein Forscher waren, der ausgefallene Metalle oder Keramiken benötigte, haben Sie diese wahrscheinlich über ein Mumps-System bestellt.

Einer der Gründe, warum Sie selten von einer überraschend allgegenwärtigen Datenbank hören, ist, dass sich die Anbieter traditionell direkt mit Anwendungs- / Systementwicklern und nicht mit Endbenutzern befasst haben, sodass die Datenbank normalerweise hinter den Kulissen in Produkte eingebettet ist.


1
Ich denke die Sprache ist nicht schlecht. Ich habe es nicht versucht, aber es muss auf einer modernen Hardware ziemlich schnell gehen. Die neueste Version von MSM unterstützte die strukturierte Programmierung: lokale Variablen (neuer Befehl), Funktionsparameter, Inline-Unterprogramme für mehrere Zeilen. Wir waren mit diesen Funktionen sehr zufrieden und haben eine Reihe von Dienstprogrammen erstellt: Listen-Viewer, Menü usw. Schließlich ging uns der Stapel aus, und wir haben Micronetics gebeten, die Stapelgröße zu erhöhen. Sie haben uns eine benutzerdefinierte 32-Deep-Stack-Version von MSM anstelle der Standard-16-Deep-Version zusammengestellt.
ern0

1
Um Rob ein wenig zurückzudrängen, obwohl ich denke, dass die MUMPS-Datenbank es wert ist, beachtet zu werden, frage ich mich, ob nur die Datenbank, auf die aus einer anderen Sprache zugegriffen wird, noch MUMPS genannt werden kann. Jeder, der sich für MUMPS entscheidet, erwartet, dass er Legacy-Code ausführen kann. MUMPS, ob es Ihnen gefällt oder nicht, entspricht also der Datenbank + der Sprache.
Interstar

2
Wie ich bereits an anderer Stelle erwähnt habe, ist das eigentliche Scoping / Dealbreaker für die Sprache das dynamische Scoping. Ich glaube, kein Ingenieur kann heute die Wahl einer Sprache ohne lokale Variablen rechtfertigen, die lokal bleiben. Verwenden Sie also auf jeden Fall die MUMPS-Datenbank als Black-Box-Komponente, aber die Sprache ist nicht mehr zu retten und sollte zur Ruhe kommen.
Interstar

1
Mumps hat ein vollständiges lexikalisches Scoping von Variablen - das ist schon seit Jahren so, aber viele Leute scheinen es nicht bemerkt zu haben! Mumps-Code kann genauso sauber sein und sich gut verhalten wie jede andere Sprache. Tatsächlich hat Mumps sehr viele Ähnlichkeiten mit Javascript in Bezug auf das variable Scoping. zB Neu in Mumps ist praktisch dasselbe wie var in Javascript. Standardmäßig sind Variablen jedoch in beiden Sprachen global gültig.
Rob

1
Rauben. Ich habe das lexikalische Scoping von Variablen im Cache sicherlich nicht bemerkt. Was ist mit meinem Beispiel in cachetastic.blogspot.com/2008/07/… ? Das verwendet das Schlüsselwort "new", ist aber absolut NICHT die gewünschte Bereichsregel. Das x in f und das x in g sollten NICHT dieselbe Variable sein, OHNE g explizit jedes x ausblenden muss, das sich zufällig auf dem Stapel befindet. Dasselbe, das in Javascript konvertiert wurde und COSs "new" durch "var" ersetzt, ergibt x in f als undefiniert.
Interstar

6

MUMPS ist sehr lebendig. Es war eines der vertrauenswürdigsten Systeme, die in die richtigen Hände geraten sind. Das Programmpersonal ist normalerweise klein und die Betriebszeit ist beeindruckend. Es mag den Uneingeweihten erscheinen, dass MUMPS stumpf ist, aber es ist möglich, sehr klaren und hochfunktionalen Code in sehr wenigen Tastenanschlägen zu schreiben, und die von MUMPS unterstützten Datenstrukturen machen es extrem leistungsfähig und über verschiedene Architekturen hinweg sehr transportabel. Alle VA-Krankenhäuser verwenden MUMPS und die mittlere Reparaturzeit ist in den meisten Fällen sehr schnell. Das in MUMPS geschriebene VistA-System kann problemlos von Source Forge heruntergeladen werden, und die poly-modale Natur (auf die Datenbank kann auf viele Arten zugegriffen werden, Roll and Scroll, Thin Client, Browser oder RPC oder eine andere Programmschnittstelle) von VistA und MUMPS ist verfügbar durch für viele, die sich damit beschäftigen. MUMPS ist eine einfache Sprache mit sehr wenigen Befehlen und einem Datentyp. Es ist leicht zu erlernen, da es sich um eine interpretierte Sprache handelt und der Stapel und die Symboltabelle intakt bleiben, um genau zu sehen, was passiert ist, als die Anwendung zum Debuggen gestoppt wurde. VistA wurde verwendet, um die Krankenhäuser des Verteidigungsministeriums (Composite Health Care System, CHCS) sowie den indischen Gesundheitsdienst (IHS RPMS) zu betreiben, und das wurde einst vom US Public Health Service verwendet. Es sparte dem Land viele Millionen Dollar an Betriebskosten. MUMPS läuft auf fast allem. Es modelliert fast jedes andere Datenbankmodell einfach und bietet einen überraschend schnellen Zugriff auf die Datenbanken. Das MUMPS-Modell kann tatsächlich eine schnellere Leistung mit mehr Benutzern im System erzielen (in einigen Fällen Aufgrund der Cache-Aspekte von MUMPS, bei denen sich die zum Auffinden eines Datenblocks erforderlichen Zeigerblöcke bereits im Speicher befinden und nicht erneut abgerufen werden müssen, beträgt der Zeiger-Overhead für MUMPS übrigens nur etwa 2%, sodass der größte Teil Ihrer Datenbank ist tatsächliche Benutzerdaten). MUMPS wurde ursprünglich für die Ausführung auf einem 2K-Computer geschrieben. Der Ansturm neuer Technologien hat nur die vollen Funktionen der MUMPS-Umgebung zu einem Bereich erweitert, in dem jetzt ganze Krankenhäuser auf kostengünstigen Warenservern betrieben werden. Schon früh hat sich MUMPS von der Hardware getrennt und von dieser Entscheidung sehr gut profitiert. Wir kümmern uns nicht um die Wortgröße oder die Präzision oder wie viele oder wie groß. Die Datenbank ist spät bindend und wächst je nach den spezifischen Datensatzanforderungen. Kein Datensatz in einer Datenbank ist größer als nötig. Die Datenbank kann als Teil eines Datensatzes oder als ganzer Datensatz erweitert oder beschnitten werden. Ist MUMPS noch da?, Wetten Sie? Anstatt 8 Benutzer auf einem PDP-11/34 zu haben, können Sie ein paar hundert Benutzer auf dem Desktop-PC unter Ihrem Schreibtisch haben. Es wird im Bankwesen, an der Europäischen Börse, in der Reisebranche (Hotels und Buchungsagenten), in einigen Autoteilehäusern und in den erfolgreichsten Krankenhäusern (gewerblich, privat oder kommunal) eingesetzt, in denen MUMPS in irgendeiner Form betrieben wird. Die VA hat derzeit über 30 Jahre Outcome-Historie für ihre über 9 Millionen Patienten. Das an sich ist nichts, was kein anderes Gesundheitssystem erreicht hat, außer dem Beth Israel / Deaconess Hospital in Boston, das über 35 Jahre Erfahrung in seinem selbstgebauten MUMPS-System hat. darauf kannst du wetten? Anstatt 8 Benutzer auf einem PDP-11/34 zu haben, können Sie ein paar hundert Benutzer auf dem Desktop-PC unter Ihrem Schreibtisch haben. Es wird im Bankwesen, an der Europäischen Börse, in der Reisebranche (Hotels und Buchungsagenten), in einigen Autoteilehäusern und in den erfolgreichsten Krankenhäusern (gewerblich, privat oder kommunal) eingesetzt, in denen MUMPS in irgendeiner Form betrieben wird. Die VA hat derzeit über 30 Jahre Outcome-Historie für ihre über 9 Millionen Patienten. Das an sich ist nichts, was kein anderes Gesundheitssystem erreicht hat, außer dem Beth Israel / Deaconess Hospital in Boston, das über 35 Jahre Erfahrung in seinem selbstgebauten MUMPS-System hat. darauf kannst du wetten? Anstatt 8 Benutzer auf einem PDP-11/34 zu haben, können Sie ein paar hundert Benutzer auf dem Desktop-PC unter Ihrem Schreibtisch haben. Es wird im Bankwesen, an der Europäischen Börse, in der Reisebranche (Hotels und Buchungsagenten), in einigen Autoteilehäusern und in den erfolgreichsten Krankenhäusern (gewerblich, privat oder kommunal) eingesetzt, in denen MUMPS in irgendeiner Form betrieben wird. Die VA hat derzeit über 30 Jahre Outcome-Historie für ihre über 9 Millionen Patienten. Das an sich ist nichts, was kein anderes Gesundheitssystem erreicht hat, außer dem Beth Israel / Deaconess Hospital in Boston, das über 35 Jahre Erfahrung in seinem selbstgebauten MUMPS-System hat. Die Reisebranche (Hotels und Buchungsagenten), einige Autoteilehäuser und die erfolgreichsten Krankenhäuser (gewerblich, privat oder kommunal) betreiben MUMPS in irgendeiner Form. Die VA hat derzeit über 30 Jahre Outcome-Historie für ihre über 9 Millionen Patienten. Das an sich ist nichts, was kein anderes Gesundheitssystem erreicht hat, außer dem Beth Israel / Deaconess Hospital in Boston, das über 35 Jahre Erfahrung in seinem selbstgebauten MUMPS-System hat. Die Reisebranche (Hotels und Buchungsagenten), einige Autoteilehäuser und die erfolgreichsten Krankenhäuser (gewerblich, privat oder kommunal) betreiben MUMPS in irgendeiner Form. Die VA hat derzeit über 30 Jahre Outcome-Historie für ihre über 9 Millionen Patienten. Das an sich ist nichts, was kein anderes Gesundheitssystem erreicht hat, außer dem Beth Israel / Deaconess Hospital in Boston, das über 35 Jahre Erfahrung in seinem selbstgebauten MUMPS-System hat.


6

Es gibt ein paar ernsthafte Mumps-Fragen zu SO:

/programming/tagged/mumps


Warum das Downvote? Die Frage war, ob MUMPS noch lebt? Gibt es jemanden, der es benutzt? - Dies ist sicherlich ein relevanter Beweis dafür, dass jemand ernsthaft neuen Code schreibt und / oder MUMPS lernt.
Colin Pickard

4

Ja, MUMPS ist sehr lebendig. Ein großer Teil der VA-Krankenhäuser in den USA verwendet MUMPS.


3
Und ein großer Teil der Patienten lebt? :-)
Maniero

8
@ Bigown: Natürlich. Wenn nicht, wären sie immer noch keine Patienten.
Mason Wheeler


3

Ich bin auch neu bei g.tm, aber ich kann dies beantworten:

Ja, Mumps lebt. Es arbeiten immer noch Leute daran. Hier sind einige Beispiele :

http://georgejames.com/, der einen Openstreetmap-API-Server in gt.m geschrieben hat, den ich gerade lerne.

Es gibt jetzt auch moderne Enterprise-Web-Tools für g.tm http://gradvs1.mgateway.com/main/

und der letzte Beweis dafür, dass es lebt, ist, dass es auf die neuesten GNU / Linux- und Cloud-Plattformen portiert wurde.

Mike



1

Sie sollten dies lesen:

http://thedailywtf.com/Articles/A_Case_of_the_MUMPS.aspx

über MUMPS.

Andererseits arbeite ich im DC-Bereich und treffe ziemlich regelmäßig Leute, die nicht nur wissen, welche MUMPS sie häufig darin arbeiten.


Das ... das hat mich entsetzt. Ich habe das Gefühl, ich muss jetzt baden. :(
Matt DiTrolio

1
Im Zeitalter von SQL ist es schwer zu erklären, dass diese Probleme, die in diesem Artikel aufgeführt sind, Funktionen sind. Ein Buchstabe steht für Geschwindigkeit. Ein Typ ist weitaus besser als die automatische Eingabe. Etc.
ern0

1

Nun, ich habe noch nie von jemandem gehört, der es benutzt, in irgendeinem Kontext oder aus irgendeinem Grund, außer bei The Daily WTF. Welche Schlussfolgerungen daraus gezogen werden können, liegt beim Leser. ;)


1

Das Beispiel von Interstar wurde richtig geschrieben, um Funktionen zu verwenden:

f ;   
  new x  
  set x=$$g()  
  write x  
  quit  

g()  
  new x  
  set x = 5  
  quit x  

do f  

fist eine Prozedur, die mit einem do aufgerufen wird. Wenn es wie in diesem Fall keine formalen Parameter gibt, benötigen Sie das nicht (). Eine Prozedur wird einfach beendet und gibt nichts zurück.

g()auf der anderen Seite ist eine Funktion. Das Neue xist entscheidend für den korrekten Umfang x. Eine Funktion wird aufgerufen, indem ihrem Namen vorangestellt wird, $$und sie wird mit einem Rückgabewert beendet. Für eine Funktion muss eine formale Parameterliste deklariert sein, auch wenn sie wie hier leer ist. Eigentlich könnte man diese Instanz g()wie folgt schreiben :

g()  
 quit 5

Es wird sich jetzt alles perfekt verhalten. Aus irgendeinem Grund scheinen viele Mumps-Entwickler die Existenz von Funktionen nicht bemerkt oder verstanden zu haben oder den Unterschied zwischen ihnen und Prozeduren zu verstehen. Ich denke, dies ist einer der Gründe, warum Mumps-Neulinge entsetzt die Hände hochwerfen (nicht überraschend) - da draußen gibt es eine Menge schrecklichen Codes.

Geschrieben wie oben gezeigt, ist alles ziemlich sauber und respektabel. Es ist jedoch Sache des Programmierers, Variablen innerhalb von Funktionen und Prozeduren explizit zu erfassen. Lass sie weg und sie werden global sein und überall auslaufen. Der Trick besteht darin, jede Funktion einzeln zu erstellen und zu testen und sicherzustellen, dass sie sich nur auf ihre formalen Parameter stützt und am Ende nichts zurücklässt.


Einer der Gründe, warum Sie Mumps-Code sehen, der keine neuen Befehle verwendet und der davon abhängt, dass die Variablen global sind (es bricht also ab, wenn Sie die Variablen neu erstellen), ist, dass er zu einem Zeitpunkt in der Vergangenheit vor Funktionen und geschrieben wurde Die Sprache wurde um lexikalisches Scoping erweitert. Leider gibt es da draußen eine Menge Legacy-Code, und ja, es wird ein Albtraum, den man pflegen muss, aber das ist Legacy für Sie. Auf der anderen Seite ist es durchaus möglich, sauberen, modernen und gut erzogenen Mumps-Code zu schreiben, vorausgesetzt, Sie schreiben neue Inhalte von Grund auf neu, ohne dass Sie sich Sorgen machen müssen.
Rob

Wenn Sie sich Ihr ursprüngliches Beispiel ansehen, ist der Wert x, wenn er in Prozedur f neu ist, automatisch für g verfügbar - genau so ist Mumps. Ebenso sind Personen, die an C-Syntaxsprachen gewöhnt sind, überrascht, wenn sie feststellen, dass der Gültigkeitsbereich in Javascript nur auf Funktionen angewendet wird und nicht beispielsweise auf Schleifen oder Blöcke innerhalb einer Funktion. So ist es halt - sobald Sie es wissen, gehen Sie entsprechend damit um. Solche Eigenheiten haben die Menschen nicht davon abgehalten, Javascript zu akzeptieren und zu übernehmen.
Rob

Rob: "Wenn Sie sich Ihr ursprüngliches Beispiel ansehen, ist der Wert x, wenn er in Prozedur f neu ist, automatisch für g verfügbar - genau so ist Mumps." Tatsächlich! Und das bedeutet, dass MUMPS einen dynamischen und keinen lexikalischen Bereich hat. In einer Sprache mit lexikalischem Geltungsbereich muss das "neue x" in Funktion g nicht vorhanden sein, da die lexikalische Struktur des Programms (dh die Tatsache, dass g außerhalb der Definition von f definiert ist) ausreicht, um dies zu gewährleisten Die in g und f genannten xs sind zwei völlig unterschiedliche Variablen.
Interstar

Rauben. Im weiteren Sinne kann ein gut diszipliniertes Team von MUMPS-Programmierern, das von Grund auf neu schreibt und sorgfältig "neu" verwendet, um sicherzustellen, dass alle Variablen lokal sind, die Probleme des dynamischen Scoping vermeiden. Klar, ich stimme zu. Aber warum sollten wir eiserne Disziplin und Hunderte von zusätzlichen Codezeilen benötigen, um das zu replizieren, was Ihnen jede andere zeitgenössische Sprache kostenlos bietet? Wenn Sie mit Legacy-Code konfrontiert sind, der nicht mit dieser Disziplin geschrieben wurde, ist es fast unmöglich, ihn später einzufügen, da Sie nicht erkennen können, ob das System auf einen dieser Nicht-Einheimischen angewiesen ist, um Informationen weiterzugeben .
Interstar

Es gibt andere (ältere) Methoden zum Trennen von Unterprogrammvariablen: Alle Variablennamen von Systemdienstprogrammen beginnen mit dem Zeichen '%', sodass sie sich im "System-Namespace" befinden. Beim Benennen von Variablen in New geht es auch um die Geschwindigkeit: Wenn Sie einen expliziten Befehl verwenden, um wiederverwendete Variablen auf den Stapel zu verschieben, muss der Interpreter beim Eingeben einer Routine selbst nichts tun. Sie können auch Neu ohne Parameter verwenden, wodurch alle aktuellen Variablen ausgeblendet werden.
ern0
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.