SQL Cossacks

1984 — 2024

Dr. Carsten Kumke

Ziel

  • Daten über historisch belegte Personen in großer Zahl verwalten zu können.

  • Darstellung und Aufbereitung der Daten zu ermöglichen.

  • Möglichst keine redundante Arbeiten erledigen zu müssen.

  • Daten zu Erkenntnisgewinnen zu nutzen (Big Data ?)

    • Auswertungen über Karrieren

    • Statistiken über Organisationsentwicklung

    • Rückkopplungen zur Kosakenforschung (Verifikation, Neuanstöße)

Probleme

  • Historische Veränderung vs. Statik elektronischer Systeme

    • Abbildung von Veränderungen

    • Transparentmachen von Veränderungen

    • Vergleichbarkeit von Daten sicherstellen

  • Unschärfen in der Begrifflichkeit …​

    • …​ in historischen Quellen

    • …​ in unserem modernen Denken

  • Diffuser Datenbestand

    • Daten sind nicht immer repräsentativ (v.a. in steppennahen Regionen)

    • Register im 17. Jh. spiegeln nur eine Vollständigkeit vor

  • Banalitäten:

    • Schreibweisen von Namen

    • Nicht zweifelsfreie Zuordnung von Daten zu Strukturen

    • Lokalisierung von Geschehenem

Meilensteine

  • 1984 - Karteikasten

  • 1986 - Versuche in BASIC

  • 1987-1996 - WordPerfect Text-Datei (ca. 1.500 Seiten)

  • 1997-2015 - PHP4 - Beginn der Entwicklung auf LAMP-Basis

  • 2003 - 1. Auftritt im www

  • seit 2017 - PHP7

1984: Karteikasten

  • Erste Form der Erfassung

  • Intensive Verwendung von Abkürzungen

  • Strukturen:

    • Stand (Adelig: Ja/Nein)

    • Grundbesitzer (Ja/Nein)

    • Dienstdaten

  • Probleme:

    • keine Auswertungen und Suche möglich

    • Zugriff nur über Person möglich

Kalynovs'kyj resized

1986: Intermezzo - Programmierung mit BASIC

Basic Listing[1]
10 INPUT "Geben Sie bitte Ihren Namen ein: ", A$
20 PRINT "Guten Tag, "; A$
30 INPUT "Wie viele Sterne möchten Sie"; S
35 S$ = ""
40 FOR I = 1 TO S
50 S$ = S$ + "*"
55 NEXT I
60 PRINT S$
70 INPUT "Möchten Sie noch mehr Sterne"; Q$
80 IF LEN(Q$) = 0 THEN GOTO 70
90 L$ = LEFT$(Q$, 1)
100 IF (L$ = "J") OR (L$ = "j") THEN GOTO 30
110 PRINT "Auf Wiedersehen";
120 FOR I = 1 TO 10
130 PRINT A$; " ";
140 NEXT I
150 PRINT
  • Versuche auf der Basis einer Vereinsverwaltung aus einer Zeitschrift

  • Erste Standardisierung von Informationen durch Abkürzungen

  • Probleme:

    • Textfelder zu kurz

    • Pflege umständlich

    • Begrenzter Speicherplatz

    • Starrer Zeilencode

  • Naja, - eben BASIC …​

1. Sorry, von dem Programm sind leider keine Code-Zeilen mehr überliefert.

1987-1996: WordPerfect (1)

Für die Dissertation wurde aus der Not eine Tugend gemacht und die Karteikarten in eine 1.500 Seiten große WordPerfect-Datei übertragen …​

  • Strukturierte Erfassung möglich

    • pro Person

    • pro Rang/Organisation durch Listen

  • Suche (nach Namen und Positionen)

  • Über gekennzeichnete Zeilen (1,2 …​) bestanden Filtermöglichkeiten bei Abfragen

  • Probleme:

    • Nur Zugriffe auf Einzelinformationen möglich

    • Doppelte Pflege von Daten für Zweidimensonalität (Person/Listen)

    • Fehlerquote durch "Typer" hoch

    • Abfragen umständlich und begrenzt

1987-1996: WordPerfect (2)

wordperfect Dascenko

  • Strukturierte Personendaten im Kopf

  • Datums orientierte Darstellung der Karriere

  • Erweiterbar

  • Ohne Abkürzungen würde es unübersichtlich

  • Bemerkungen und Kommentare zur Person

wordperfect Poltava

  • Örtliche Register pro Rang möglich

  • Darstellung wie bei George Gayecki

  • Für jede Position steht eine Quellenangabe zur Verfügung

  • 1 Zeile = 1 Eintrag

  • Erfassung auch der Gesandtschaften bzw. Teilnehmer von Gesandtschaften

Ab 1997: LAMP

LAMP ist ein Akronym und steht für die Kombination aus

  • L inux - Betriebssystem

  • A pache - Webserver

  • M ySQL (Maria) - Datenbank

  • P HP - PHP: Hypertext Preprocessor (Programmier- bzw. Skriptsprache).

Die Gründe für die Wahl dieser Umgebung zur Lösung der Probleme waren:

  • Ich war seit Anfang der 90er Jahre auf Linux als Betriebsumgebung umgestiegen,

  • Der Open-Source-Gedanke überhaupt,

  • Die Open-Source-Gemeinde stellte zu einem sehr frühen Zeitpunkt bereits professionelle, kostenlose Entwicklungsumgebungen (IDEs) zur Verfügung,

  • Das Bedürfnis - v.a. ab 1997 - sich technisch weiter zu entwickeln.

seit 1997: Architektur

plantumllamp
Figure 1. LAMP Architektur

Seit 1997: Konsequenzen

Der Einsatz von LAMP zog zahlreiche Konsequenzen nach sich. Man musste lernen:

  • Programmabläufe als Use-Cases (Anwendungsfälle) zu betrachten

  • Zwischen Darstellung, Logik und Daten in ihren verschiedenen Ebenen zu unterscheiden

  • Daten in Objekte bzw. Datentümpel aufzuteilen und ihre Relationen zu organisieren

Schnell (und manchmal sehr schmerzlich zu erfahren) war auch:

  • Traue keinem Code, den Du nicht getestet hast!

  • Daten-Backups sind nicht nur nützlich, sondern lebenswichtig (Im Zweifel sparen sie im Desasterfall viel Zeit :-) )!

  • Für experimentelles Programmieren, aber auch zur Absicherung des jeweiligen Bearbeitungsstands, ist die Nutzung eines Versionierungsmanagement-Systems unabdingbar!

  • Ziehe strikte Linien zwischen Entwicklung, Test und Produktion, indem Du einen Deployment-Prozess initiierst!

1997-2016: PHP4

Weitgehend selbst gestrickter Code unter Zuhilfenahme einer Template-Funktionalität.

if(isset($pid)) {
	$hier_select="polk_id=$pid";
	$org_select="SELECT polk_name AS name, polk_arm AS arm, polk_comment AS comment FROM polky WHERE polk_id='$pid'";
	$template->AddVar("body", "TAG", "PID");
	$template->AddVar("body", "ID", $pid);
	$template->AddVar("noindiv", "ID", $pid);
	$template->AddVar("noindiv", "LEV", "P");
	$string_org="zu diesem <em>polk</em>";
	} elseif (isset($sid)) {
			$hier_select="sotnja_id=$sid";
			$org_select="SELECT sotnja_name AS name, sotnja_comment AS comment FROM sotni WHERE sotnja_id='$sid'";
			$template->AddVar("body", "ID", $sid);
			$template->AddVar("noindiv", "ID", $sid);
			$template->AddVar("noindiv", "LEV", "S");
			$string_org="zu dieser <em>sotnja</em>";
	} elseif (isset($kid)) {
			$hier_select="kurinnja_id=$kid";
			$org_select="SELECT kurinnja_name AS name, kurinnja_comment AS comment FROM kurinni WHERE kurinnja_id='$kid'";
			$template->AddVar("body", "ID", $kid);
			$template->AddVar("noindiv", "ID", $kid);
			$template->AddVar("noindiv", "LEV", "K");
			$string_org="zu dieser <em>kurinnja</em>";
	}

1997-2016: GUI

Hier ein paar Beispiele der ersten Version der "SQL Cossacks"-Webseite (Version 0.75 vom 12.12.2015).

cossack search