Author Archives: Herr Rau

About Herr Rau

Lehrer, Leser, Blogger. Rüstiger Endvierziger.

Storyworld – ein Java-Projekt für die 10. Klasse

By | 21.3.2017

Paket für ILTB 2017 Download, Zip, ~20 MB (enthält Präsentation, Anleitung, Code)

Storyworld habe ich als Projekt für 10. Klassen am Gymnasium in Bayern im Rahmen des Fachs Informatik durchgeführt. Es geht dabei darum, dass Schülerinnen und Schüler für eine gemeinsame Fantasy-Spielwelt Geschichten schreiben, die in Form von Zustandsautomaten umgesetzt werden und die miteinander in Zusammenhang stehen können.

Vorgeschichte und Hintergrund

Eine beispielhafte Spielwelt

So sieht zum Beispiel eine Welt aus, die aus 6 Location-Objekten und 5 Connections besteht. Es ist Absicht, dass La Isla Bonita nicht so einfach zu erreichen ist.

Landkarte der Spielwelt

Im Spiel kann man sich zwischen den Orten, die durch Kanten verbunden sind, bewegen. Der eigentliche Clou: An manchen Orten werden zusätzlich zu den Ortsbeschreibungen Geschichten oder Teile von Geschichten präsentiert.

Die Geschichte vom Froschkönig, klassisch und linear

Klassische Geschichten sind linear in dem Sinn, dass sie Absatz für Absatz gelesen werden und man auch nicht mehr zurückspringt. Das gilt auch dann, wenn nicht chronologisch erzählt wird, sondern mit Sprüngen, wie etwa in der Odyssee. Deutschlehrer verlangen manchmal von ihren Schülern, die Geschichte in einzelne Stationen aufzuteilen. Das sieht dann, etwas formalisiert, so aus:

Zustandsübergangsdiagramm Froschkönig klassisch

Die Geschichte vom Froschkönig, als nichtlineares Spiel umgestaltet

Spiele sind of nicht-linear in dem Sinn, dass man zu vorherigen Zuständen zurück kann und bestimmte Phasen mehrfach durchläuft. Auch gibt es möglicherweise unterschiedliche Wege zwischen den Stationen. In der Informatik kann man so etwas als Zustandsautomat modellieren. Das sieht dann so aus, mit auslösenden Aktionen bei den Übergängen, ausgelösten Aktionen nach dem Schrägstrich, und zusätzlichen Bedingungen für den Zustandsübergang in eckigen Klammern.

Zustandsübergangsdiagramm Froschkönig nichtlinear

Die zentralen Methoden der Geschichtenklassen

Bewegt man sich durch die Welt, erscheinen Reiter mit den zur Verfügung stehenden Geschichten. Wählt man eine davon, sieht man zum Beispiel dieses schlichte Beispiel – der Spieler befindet sich gerade im Hafen, könnte nach Innismund wechseln, und hat gerade die Geschichte „Das öde Haus“ ausgewählt:
Benutzeroberfläche Spiel

Zu diesem Zweck hat jede Geschichtenklasse zwei Methoden: createReport und receiveMessage. Die erste Methode wird aufgerufen, damit die Geschichte einen Bericht oder eine Beschreibung abgeben kann, möglichweise mit einer oder mehreren Optionen, die der Spieler danach wählen kann. Die zweite Methode gibt an, was geschieht, wenn der Spieler die jeweilige Option wählt, sie entspricht mehr oder weniger der klassischen Zustandsübergangsmethode:

class LeeresHaus extends SingleLocationStory {
 
 public Report createReport() { 
  Report r = new Report("Ein leeres Haus.");
  r.addOption("Du untersuchst es", "anschauen");
  return r;
 }
 
 public void receiveMessage(String s) {
  if (s.equals("anschauen")) {
   sendMessage("Niemand zu Hause");
   if(get("Neugier")<10)increase("Neugier", 1);
  }
 }
 
 public String getName() { return "Das öde Haus"; }
 public String startStoryAt() { return "Hafen"; }
 public String getImageName() { return "resources/haus.png"; }
 
}

Die Methode getName gibt den Namen der Geschichte zurück, die für diese Unterklasse von Geschichten notwendige Methode startStoryAt gibt den Ort zurück, an dem die Geschichte spielt, die optionale Methode getImageName gibt den Ort und Namen eines passenden Bildes an.

Zu den typischen ausgelösten Aktionen bei der Zustandsübergangsmethode gehören set, increase, decrease von beliebigen Spielwelt- oder Spielerattributen. (Wenn ein Attribut dieses Namens noch nicht existiert, wird es angelegt.) Den Wert dieses geschichtenübergreifenden Attributs kann man auch mit get abfragen, um Anweisungen von bestimmten Bedingungen abhängig zu machen.
Außerdem kann man mit sendMessage Text ausgeben. Daneben gibt es viele Möglichkeiten, den Zustand der Spielwelt zu ändern – man kann diese Geschichte an einen anderen ort platzieren, den Spieler auch, neue Orte oder Verbinungen zwischen Orten erschaffen. Häufig wird man auch ein Zustandsattribut in die eigene Geschichtenklasse einbauen und dessen Wert ändern. Von dem Wert dieses eigenen Zustandsattributs hängt dann auch der zurückgegebene Report ab, und die damit verbundenen Optionen – und schon hat man einen einfachen Zustandsautomaten.

— Wer die Trennung oder Doppelung der zwei Methoden createReport und receiveMessage unübersichtlich findet, für den gibt es Alternativen: In einem Anhang unten habe ich die verschiedene anderen Geschichtenklassen gegenübergestellt. Sie sind alle Unterklassen von AbstractStory, und logisch alle äquivalent, bieten eben nur unterschiedliche Implementierungen.

ActionStory

Implementiert eine Geschichtenklasse das Interface ActionStory, so muss es eine Methode void act() geben. Diese Methode wird jedesmal aufgerufen, wenn der Spieler sich entscheidet, zu einem anderen Ort zu gehen. So kann man zum Beispiel einen Wanderer erschaffen, der sich bei jeder Bewegung des Spielers auch bewegt, zum Beispiel zu einem zufälligen Nachbarort.

Ausgelöste Aktionen

Typisch sind:

  • set(String, int), increase(String, int), decrease(String, int)
  • movePlayerTo(String)
  • sendMessage(String)
  • moveStoryTo(String) – das geht nur bei Objekten der Klasse SingleLocationStory und deren Unterklassen, da nur diese Geschichten an genau einem Ort spielen
  • addLocation(Location), removeLocation(Location)
  • addConnection(Location, Location, int), removeConnection(Location, Location)
  • enter() und exit() – optional: nachdem man mit enter() eine Geschichte betreten hat, kann man nicht mehr zu einer anderen Geschichte oder einem anderen Ort wechseln, bis man zu einem Ende gekommen ist, das einen mit exit() wieder aus der Geschichte entlässt (es gibt auch einen automaticEntryMode)
  • introduceStory(AbstractStory)
  • deleteStory(AbstractStory)

Bedingungen/Informationen über die Welt

  • int get(String)
  • boolean playerIsIn(String)
  • String getPlayerLocationName()
  • String getRandomNeighbourName(String)
  • Location [] getAllNeighbours(String)
  • Location getRandomLocation()
  • int getTimeSinceLastReport()

Mögliche Geschichten

  • Ein Wanderer, der zufällig herumzieht.
  • Ein Tribble, das gefangen werden kann und dann verschwindet, sich ansonsten vermehrt, indem es als ActionStory in jedem Spielerzug mit einer gewissen Wahrscheinlichkeit neue Objekte der eigenen Klasse ins Spiel bringt. (Besser mit Obergrenze, da exponentielles Wachstum.)
  • Eine klassische Kuriermission, bei der ein Gegenstand von Ort A nach Ort B gebracht werden muss und man dafür eine Belohnung erhält.
  • Romeo und Julia: Man trägt Briefe zwischen beiden hin und her, bis beider Geschichte ein Ende findet.
  • Eine Begleitmission, bei der man einen Passagier zu einem möglicherweise unbekannten Ort geleiten und abliefern muss. (Die letzten drei sind Beispiele für Geschichten, die an mehr als einem Ort spielen.)
  • Ein bürokratisches Labyrinth, aus dem man herausfinden muss.
  • Eine Fähre zwischen dem Hafen und La Isla Bonita – als Geschichte, die nur an einem Ort spielt, der aber mit moveStoryTo geändert wird, oder als Geschichte an zwei Orten. (An dem einen hat man die Fähre und die Möglichkeit, sie zu besteigen; am anderen wird man auf die abwesende Fähre hingewiesen. Die Fähre wechselt natürlich den Ort, entweder durch Spieleraktion oder selbstständig.)
  • „Das öde Haus“ von E.T.A. Hoffmann, umgeformt in eine Minigeschichte, mit viel Originalzitaten.

Langer Anhang: Varianten der zentralen Methoden in verschiedenen Unterklassen

Ich finde die Trennung in zwei Methoden createReport und receiveMessage übersichtlich und praktisch. Aber gerade wenn man die Geschichte mit einem Zustandsattribut umsetzt, gibt es unschöne Doppelungen im Code: Man braucht für beide Methoden ein ähnliches if-else- oder switch-Konstrukt, um den aktuellen Zustand abzufragen, von dem ja sowohl der Report als auch der Zustandsübergang abhängen. Wem das nicht gefällt, für den gibt es andere Möglichkeiten. Es folgt ein kurzer Überblick über die verschiedenen Geschichtenklassen. Eine Schüler-Klasse ist jeweils eine Unterklasse einer davon; die in diesem Fall zu überschreibenden Methoden sind jeweils farblich markiert.

Klassendiagramm Story-Klassen

AbstractStory

Das ist die allgemeinste Klasse. Unterklassen davon müssen einfach nur drei Methoden implementieren; wem das reicht, der kann die restlichen Klassen ignorieren:

  • String getName() – das gilt für alle Geschichten-Klassen. Jede Geschichte braucht einen (eindeutigen) Namen.
  • Report createReport(String locationName) – die Geschichte wird bei jeder Bewegung und jeder Entscheidung eines Spielers gebeten, einen Bericht abzuliefern. Dieser Bericht hängt vielleicht vom Zustand der Geschichte ab, aber ganz sicher vom Ort des Spielers, dessen Bezeichner als Argument übergeben wird. Wenn eine Geschichte in Innismund und in Das Schloss spielt, wird sie nur in diesen beiden Fällen einen Report abgeben, in allen anderen Fällen null zurückgeben. So ein Null-Report wird dann nicht angezeigt.
    Einem Report kann man Optionen hinzufügen, die dann als anklickbare Knöpfe erscheinen. Das geht unter anderem mit der Methode addOption(String, String). (Man kann auch Option-Objekte erzeugen, die dann mehr Möglichkeiten bieten.) Der erste String ist der Text, den der Spieler zu sehen kriegt; der zweite String ist die Nachricht, die an die Geschichtenklasse geschickt wird, damit auf die Wahl des Spielers reagiert werden kann – siehe folgende Methode.
  • void receiveMessage(String message) – diese Methode wird aufgerufen, wenn der Spieler auf den entsprechenden Options-Knopf geklickt hat, dabei wird der String, der der Option als zweites Argument übergeben worden ist, zum Argument der receiveMessage(String)-Methode gemacht. (Tatsächlich wird vorher die Methode receiveMessage(Option) aufgerufen, wobei aus dem Option-Argument eine Reihe von Consequence-Objekten extrahiert und automatisch ausgeführt werden, bevor der Message-String extrahiert und an receiveMessage(String) übergeben wird.)
import storyworld.*;
public class Fischer extends AbstractStory {
    int zustand = 0;
    public Fischer () { }
    public String getName() { return "Der Angler"; }    
 
    public Report createReport(String locationName) {
        if (!locationName.equals("Hafen")) return null; // die Geschichte gibt nur für einen Ort einen Report zurueck
        if (zustand == 0) {
            Report r = new Report("Ein Fischer sitzt am Kai und angelt.");
            r.addOption("Du fragst ihn, wie es so läuft.", "ansprechen");
            return r;
        } else {
            Report r = new Report("'Toll!' Der Angler erzählt dir eine lange Geschichte, wie er einmal fast den größten Fisch gefangen hat, denn es je zu sehen gab, und gibt dir einen Fisch.");
            r.addOption("Du dankst für das Gespräch und den Fisch.", "beenden"); 
            return r;
        }
    }
 
    public void receiveMessage(String s) {
        if (zustand==0) {
            if (s.equals("ansprechen") ) // ausloesende Aktion
            { 
                if (get("Fische")<3) { // Bedingung des Zustandsuebergangs 
                    zustand = 1; 
                    increase("Fische", 1); // ausgeloeste Aktionen
                } else {
                    sendMessage("Du hast schon genug Fische."); 
                }
            }
        }
        else if (zustand==1) {
            if (s.equals("beenden")) // ausloesende Aktion
            {
                zustand = 0; 
            }
        }
    }    
}

SingleLocationStory

Diese Klasse ist für Einsteiger gedacht; bei ihr muss die Methode createReport() ohne Argument überschrieben werden. Diese Methode wird nämlich nur dann aufgerufen, wenn der Spieler sich an dem Ort befindet, an dem die Geschichte spielt, und der am Anfang durch startStoryAt() festgelegt wird. Dafür kann die Geschichte aber auch nur an einem Ort gleichzeitig spielen. Dieser Ort kann mit moveStoryTo(String) geändert werden.
Die Methoden getName() und receiveMessage(String) funktionieren wie oben.

import storyworld.*;
public class Fischer extends SingleLocationStory {
    int zustand = 0;
    public Fischer () { }
    public String startStoryAt() { return "Hafen"; }
    public String getName() { return "Der Angler"; }    
 
    public Report createReport() {        
        if (zustand == 0) {
            Report r = new Report("Ein Fischer sitzt am Kai und angelt.");
            r.addOption("Du fragst ihn, wie es so läuft.", "ansprechen");
            return r;
        } else {
            Report r = new Report("'Toll!' Der Angler erzählt dir eine lange Geschichte, wie er einmal fast den größten Fisch gefangen hat, denn es je zu sehen gab, und gibt dir einen Fisch.");
            r.addOption("Du dankst für das Gespräch und den Fisch.", "beenden"); 
            return r;
        }
    }
 
    public void receiveMessage(String s) {
        if (zustand==0) {
            if (s.equals("ansprechen") ) // ausloesende Aktion
            { 
                if (get("Fische")<3) { // Bedingung des Zustandsuebergangs 
                    zustand = 1; 
                    increase("Fische", 1); // ausgeloeste Aktionen
                } else {
                    sendMessage("Du hast schon genug Fische."); 
                }
            }
        }
        else if (zustand==1) {
            if (s.equals("beenden")) // ausloesende Aktion
            {
                zustand = 0; 
            }
        }
    }    
}

ShopStory

Eine Klasse, um Läden anzulegen, die Waren oder Gegenstände kaufen und verkaufen. Arbeitet viel mit Requirement– und Consequence-Objekten bei den Optionen. Überschrieben werden muss keine Methode, aber sinnvollerweise werden mit addItem im Konstruktor Waren hinzugefügt, die der Laden kauft und verkauft.

import storyworld.*;
 
public class KleinerLaden extends ShopStory {
    public String startStoryAt() {  return "Innismund"; }
    public String getName() { return "Der kleine Laden";}
    public KleinerLaden() {
        setDescription("Hier gibt es allerlei Dinge.");        
        addItem("Wasser",50, "Geld", 2, "Geld", 1); // 50 Wasser vorhanden, fuer 2 Geld zu kaufen, fuer 1 Geld an den Laden verkaufen 
        shopSells("Kräuterbaguette",5, "Geld",1000); // 1 Kraeuterbaguette für 1000 Geld kaufen (5 vorhanden)             
        shopBuys ("Seele",1, "Geld", 1000); // 1 Seele fuer 1000 Geld verkaufen
        shopBuys ("Ansehen",10, "Geld", 1); // 10 Ansehen fuer 1 Geld verkaufen
        shopBuys ("Tribble",1, "Geld", 1); // 1 Tribble fuer 1 Geld verkaufen
    }
}

TestableStory

Eine Unterklasse, die speziell für das Projekt eingerichtet wurde; sie hat eine test-Methode, die eine Welt erzeugt und die Geschichte, die die Methode aufgerufen hat, in die Testwelt einbaut. Diese Methode muss von der Unterklasse am Ende des Konstruktors aufgerufen werden.

SimpleStory

Ist identisch zu SingleLocationStory, nur mit der zusätzlichen Möglichkeit des Testens, indem am Ende des Konstruktors test() aufgerufen wird.

MultiplaceStory

Entspricht letztlich der Klasse AbstractStory – das heißt, die createReport-Methode wird jetzt wieder bei jeder Location aufgerufen, dafür erhält sie jetzt wieder als String-Argument den Namen der aktuellen Location. Am Ende des Konstruktors wird test() aufgerufen.

ModifiedSimpleStory

Vielleicht stört den einen oder anderen die Doppelung der if-Anweisung in den beiden Methoden. Deshalb bietet diese Klasse eine Methode Report receiveChoice(String message), die überschrieben werden muss. Sie ersetzt die beiden Methoden receiveMessage und createReport der Oberklasse, die demnach nicht überschrieben werden müssen.
Auch diese Methode wird nur dann aufgerufen, wenn der Spieler an dem einen Ort ist, an dem die Geschichte spielt. Man muss also nie einen Null-Report zurückgeben.
In dieser Klasse muss man zwar nur eine zentrale Methode schreiben, aber dese Methode enthält wieder zwei gro0ße if/switch-Blöcke: Zuerst einen für das Auswerten der Nachricht, dann einen für das Senden des aktuellen Zustands-Reports.

import storyworld.*;
public class Fischer extends ModifiedSimpleStory {
    int zustand = 0;
    public Fischer () { }
    public String startStoryAt() { return "Hafen"; }
    public String getName() { return "Der Angler"; }    
 
    public Report createReport(String s) {
        //Teil 1   
        if (zustand==0) {
            if (s.equals("ansprechen") ) // ausloesende Aktion
            { 
                if (get("Fische")<3) { // Bedingung des Zustandsuebergangs 
                    zustand = 1; 
                    increase("Fische", 1); // ausgeloeste Aktionen
                } else {
                    sendMessage("Du hast schon genug Fische."); 
                }
            }
        }
        else if (zustand==1) {
            if (s.equals("beenden")) // ausloesende Aktion
            {
                zustand = 0; 
            }
        }
        //Teil 2
        if (zustand == 0) {
            Report r = new Report("Ein Fischer sitzt am Kai und angelt.");
            r.addOption("Du fragst ihn, wie es so läuft.", "ansprechen");
            return r;
        } else {
            Report r = new Report("'Toll!' Der Angler erzählt dir eine lange Geschichte, wie er einmal fast den größten Fisch gefangen hat, denn es je zu sehen gab, und gibt dir einen Fisch.");
            r.addOption("Du dankst für das Gespräch und den Fisch.", "beenden"); 
            return r;
        }
    }
}

ModifiedMultiplaceStory

Analog zu MultiplaceStory wird hier Report receiveChoice(String message) an jedem Ort des Spiels aufgerufen, man muss in dieser Methode also für die meisten Orte einen Null-Report zurückgeben. (Die Methoden receiveMessage und createReport entfallen wieder.)

Letztlich wie die Oberklasse, nur mit einem zusätzlichen if (!s.equals("Hafen")) return null;

YetAnotherModifiedSimpleStory

Diese Klasse ist für Leute, die die zwei if/switch-Blöcke stören: Hier gibt es nur einen davon. Da der verlangte Report ja erst am Schluss der Methode zurückgegeben werden kann, hat die zu implementierende Methode void createReport(String message) hier keinen Rückgabetyp; dafür wird mit Aufrufen von setReport(Report) der später zurückzugebende Report festgelegt.

import storyworld.*;
public class Fischer extends YetAnotherModifiedSimpleStory{
    int zustand = 0;
    public Fischer () { }
    public String startStoryAt() { return "Hafen"; }
    public String getName() { return "Der Angler"; }    
 
    public void receiveChoice(String s) {        
        if (zustand == 0) {
            Report r = new Report("Ein Fischer sitzt am Kai und angelt.");
            r.addOption("Du fragst ihn, wie es so läuft.", "ansprechen");
            setReport(r);
            if (s.equals("ansprechen")) {
               if (get("Fische")<3) { // Bedingung des Zustandsuebergangs 
                   zustand = 1; 
                   increase("Fische", 1); // ausgeloeste Aktionen
               } else {
                   sendMessage("Du hast schon genug Fische."); 
               }
           }
        } else {
            Report r = new Report("'Toll!' Der Angler erzählt dir eine lange Geschichte, wie er einmal fast den größten Fisch gefangen hat, denn es je zu sehen gab, und gibt dir einen Fisch.");
            r.addOption("Du dankst für das Gespräch und den Fisch.", "beenden"); 
            setReport(r);
            if (s.equals("beenden")) {
                zustand = 0;
            }
        }
    }
}

SimpleStoryChrisGraessl

Eine weitere, sehr elegante Methode. Hier muss man nur Report createReport() überschreiben, die Methode receiveMessage(String) entfällt beziehungsweise ist in der Oberklasse festgelegt. Das zweite Argument von:

addOption(String, String)

wird dabei als Methodenbezeichner verwendet. Setzt man diese Option:

addOption("Du isst den Kuchen.", "essen");

so wird, wenn der Spieler sich für sie entscheidet, die Methode void essen() aufgerufen, die natürlich existieren muss.

import storyworld.*;
public class Fischer extends SimpleStoryChrisGraessl {
    int zustand = 0;
    public Fischer () { }
    public String startStoryAt() { return "Hafen"; }
    public String getName() { return "Der Angler"; }    
 
    public Report createReport() {        
        if (zustand == 0) {
            Report r = new Report("Ein Fischer sitzt am Kai und angelt.");
            r.addOption("Du fragst ihn, wie es so läuft.", "ansprechen");
            return r;
        } else {
            Report r = new Report("'Toll!' Der Angler erzählt dir eine lange Geschichte, wie er einmal fast den größten Fisch gefangen hat, denn es je zu sehen gab, und gibt dir einen Fisch.");
            r.addOption("Du dankst für das Gespräch und den Fisch.", "beenden"); 
            return r;
        }
    }
 
    public void ansprechen() {
        if (get("Fische")<3) { // Bedingung des Zustandsuebergangs 
            zustand = 1; 
            increase("Fische", 1); // ausgeloeste Aktionen
        } else {
            sendMessage("Du hast schon genug Fische."); 
        }
    }
 
    public void beenden() {
        zustand = 0; 
    }    
}

Death Race 2000 – Frankensteins Todesrennen

By | 18.3.2017

Gestern zufällig auf ein Interview mit Roger Corman vom letzten Herbst gestoßen, das jetzt erst veröffentlicht wurde. Wie schön – ich wusste nicht, dass er noch lebt, aber mit 90 Jahre ist er auch weniger alt, als ich gedacht hätte. Anlass des Interviews war der Film Death Race 2050, der Anfang des Jahres 2017 herauskam, ein Remake von Death Race 2000 (deutsch: Frankensteins Todesrennen) aus dem Jahr 1975, produziert von Roger Corman. (2008 gab es schon mal ein Remake.)

Und just diesen Originalfilm (Regie: Paul Bartel), dessen Titel ich seit frühen Jahren kenne, habe ich vor wenigen Monaten zum ersten Mal gesehen, und er hat mit sehr gut gefallen. Schön fand ich das Sparsame der Produktion. Da ist nichts Überflüssiges daran, keine lyrische Landschaft, kein episches Herumgucken, keine, uh, Schauspielerei, und kein ordentliches Bühnehnbild. Als zum ersten Mal die zentrale der geheimen Widerstandsbewegung gezeigt wurde, meinte Frau Rau: „Das sieht aus wie bei der Probe eines Brechttheaters“, und exakt so sieht es auch wirklich aus.

Die Geschichte: Ein dystopisches USA der nahen Zukunft. Es gibt einen Präsidenten, eine möglicherweise repressive Regierung (aber das wird allenfalls angedeutet), eine Widerstandsbewegung, und das jährliches Toderesrennen, bei dem Fahrer schnellstmöglich durch die USA fahren und dabei außerdem Punkte für überfahrene Passanten erhalten. Dazu überdrehte Medienberichterstattung vom Rennen. Die Fahrer – in der Hauptrolle David Carradine, als Konkurrenz Sylvester Stallone – versuchen einander umzubrinnen; der Widerstand versucht Frankenstein umzubringen; Frankenstein hat eigene Pläne und einen Spion im Auto. Dazu ein paar blanke Busen, mäßig motiviert. Alles ohne schauspielerische Leistung, ohne große Kulissen oder Innenausstattung. Wie schön, dass man früher einfach solche Filme machen konnte!

ILTB 2017 in Passau

By | 17.3.2017

Ach! Am Anfang der Woche war ich in Passau auf dem 10. ILTB, das ist der Tag der Informatiklehrerinnen und -Lehrer). Das ist ein inzwischen jährlicher Fortbildungstag, der ursprünglich rotierend von den verschiedenen Unis ausgerichtet wurde – einmal habe ich das mitgekriegt, kurz bevor ich an die LMU ging, und diese Organisation ist so viel Arbeit, dass eine Uni allein das nur mit Anstrengung stemmen kann. Die Informatikabteilungen sind ja oft sehr klein. Inzwischen teilen sich die Organisation eine Universität, die Gesellschaft für Informatik, und die jeweilige regionale Lehrerfortbildung, also der Fachreferent oder die Fachreferentin für Informatik für den Regierungsbezirk. Und das klappt wohl sehr gut, jedenfalls sind die ILTBs tadellos organisiert und immer sehr interessant.

2009 war ich auf meinem ersten, noch vor meiner Unizeit, als Referent, und habe darüber gebloggt. Seitdem war ich tatsächlich jedesmal dabei, meist auch als Referent. Ich fahre stets mit gemischten Gefühlen hin, weil ich ohnehin ein wenig ein Stubenhocker bin (oder sagen wir, weil ich mich zu Hause sehr wohl fühle und sehr gerne Zeit mit Frau Rau verbringe) und weil mich wie ein Hochstapler fühle. Ist mein Workshop verständlich? Sinnvoll? Habe ich – so ist das mit Gästen – zu viel aufgetischt oder zu wenig, so dass sie intellektuell hungrig nach Hause gehen müssen? Außerdem sitzen da lauter wichtige Leute, die sich alle kennen, und echte Informatiker, die noch dazu wirklich schlau sind. Ein bisschen bin ich ja doch stereotyper Nerd, weil ich sozial eher zurückhaltend bin und ungeschickt, bis ich – nach langer Zeit – endlich auftaue. Im Klassenzimmer übrigens nicht, da bin ich ganz Rampensau.

Schild Workshop

Inzwischen – darf ich’s wagen? – fühle ich mich ein bisschen zugehörig zu der Gruppe dieser Leute, die sich alle kennen. Als ich aus dem Bahnhof ausstieg und mich hilflos auf der Karte meines kleinen Tablets zu orientieren versuchte, fragte mich gleich ein vorbeikommender Passant, ob ich der Herr Rau sei, und half mir zu meinem Hotel zu kommen. (Ein Leser meines Blogs und ILTB-Referent, der zufällig des Wegs kam. Das war lustig.)

Passau Uni Außengelände

Passau ist übrigens sehr schmuck. Zum Pokémonsammeln bin ich aber kaum gekommen – Bahnhof, Hotel, abendliche Pizzeria und Uni waren jeweils so gut fünf Minuten von einander entfernt, da bin ich gar nicht zum Spazieren gekommen.

An Anregungen habe ich wieder sehr viel mitgenommen. Ein Blatt, wild bekritzelt mit Stichworten und Links, zu allen möglichen informatischen und anderen Themen, das ich jetzt am Wochenende in den Computer sortieren werde. So mache ich das immer mit meinen Notizen, das sind stets Blätter oder Zettel mit Kritzeleien darauf. Gestern habe ich schon die Kinect des Kollegen mit Scratch verbunden und mit Schülern ein bisschen herumprobiert, das wird gleich das nächjste Projekt.

Außerdem ist es doch immer weider schön, Leute zu treffen. Zwei, die ich seit meinem Studium nicht mehr gesehen habe, andere aus meiner Unifrühzeit, und auch die, die ich jedes Jahr am ILTB sehe. Ich freue mich schon auf 2018.

Der Richter und sein Henker, und heldenhafte Lehrer

By | 10.3.2017

Ich habe zum Halbjahr zwei Informatikklassen mit zusammen 4 Stunden abgegeben und eine Klasse in Deutsch neu erhalten, mit vier Stunden. Das kommt öfter vor: Zum Halbjahr gehen immer einer paar Referendare und Referendarinnen, andere werden der Schule neu zugewiesen, und deren Fächerkombinationen sind selten genau die gleichen, so dass sie nicht einfach die Klassen der Vorgänger übernehmen können. Also gibt es Tausche und Ringtausche, und mit meiner Deutsch-Informatik-Englisch-Kombination bin ich da eine geeignete Tauschstelle, ein sehr kurzer Weg zwischen Sprachen und den exakteren Wissenschaften.

Das Arbeiten mit der neuen Klasse macht Vergnügen. Eine Schülerin liest gerade sogar Stalky & Co.. Tiralala-itu! Dass es so etwas noch gibt!

Wir lesen Der Richter und sein Henker, von der Referendarin ererbt. Ich glaube, ich habe das Buch 1998 in meinem ersten halben Jahr als Lehrer als Schullektüre eingesetzt und in guter Erinnerung; allerdings weiß ich auch, dass es mich als Schüler überhaupt nicht interessiert hatte. (Denn ich arbeite immer noch mit der Ausgabe, die ich 1982 als Lektüre erwarb; damals ein deutlichg jüngeres Buch als heute; Seitenzahl identisch, aber die – aus der Seitenzählung herausgenommene – zweiseitige Reklame für Pfandbriefe und Kommunalobligationen gibt es heute nicht mehr.)

Anzahl der Frauen im Buch: 3, davon 2 mit Namen. Keine ist wichtig, zwei sind dezidierte Anhängel von Männern, eine davon wird als Besitz quasi weitervererbt, wenn auch ganz höflich: „Werden Sie mir […] das gleiche wie Ihrem verstorbenen Bräutigam sein?“
Der ermittelnde Polizist verrät seine dem Leser verborgenen Informationen über den Täter nicht etwa dadurch, dass er den diesen als „Mann“ deklariert. An eine Frau in so aktiver Rolle denkt man im Rahmen dieser Männergeschichte gar nicht.
In der Parallelklasse lese ich „Schachnovelle“, eine Schülerwahl. Anzahl der Frauen: 1, ohne Namen, eine beiläufig erwähnte Krankenschwester, wenn ich mich richtig erinnere. Darauf sollte man Schülerinnen und Schüler immer wieder mal hinweisen, bis es ihnen vielleicht selbst einmal auffällt.

***

Bin ich der einzige, der bei Der Richter und sein Henker von Friedrich Dürrenmatt an The Maltese Falcon von Dashiell Hammett denken muss? Ich sehe da Parallelen. Der übermächtige Gegenspieler des Ermittlers begegnet dem Leser in dem einen Buch zuerst als mysteriöse Initiale G, von der man nicht weiß, wer sich dahinter verbirgt. Im anderen Buch erscheint der mächtigste Gegenspieler des Ermittlers dem Leser zuerst als ein von einem anderen Schurken in die Luft gezeichnetes G – das Kapitel heißt sogar „G in the Air“. Bei Dürrenmatt steckt dahinter „Gastmann“, bei Hammett „Gutman“ – gespielt von Sydney Greenstreet in der bekanntesten Falcon-Verfilmung, und auch wenn wir über Gastmanns äußere Erscheinung nicht mehr erfahren als dass er „bäuerlich“ wirkt, was alles und nichts heißen kann, habe ich mir immer Sydney Greenstreet in dieser Rolle vorgestellt.

In beiden Romanen geht es um eine jahrzehnte dauernde Jagd, nach Gastmann im einen, nach dem Falken im anderen. Beide Romane haben eine philosophische Note: Das Gespräch von Gastmann und Bärlach in Istanbul; die Anekdote, die Sam Spade von Charles Pierce erzählt. Istanbul ist der Ausgangspunkt der Fehde Bärlach-Gastmann, und Konstantinopel (also Istanbul) ist der Punkt, von dem die Falkenjäger nach San Francisco gehen und zu dem sie am Ende des Romans wieder hinwollen, um die Spur weiter zu verfolgen.
Eine Falkenstatue haben wir nicht bei Dürrenmatt, aber einen Schlangendolch.

***

Neulich beim Ukuleletreffen im Gastwirtschafts-Nebenraum gesellten sich Mutter und Kind zu uns, die uns von außen durch ein Fenster gesehen und zugehört hatten. Dann wollten sie halt noch mehr hören und kamen herein. Wir haben dann ein paar Wünsche erfüllt und hatten überhaupt seine sehr schöne Zeit.

***

Mein Freund B. hat mir eine Fernsehserie der frühen 1970er Jahre empfohlen. Die weiteren Episoden – es gibt insgesamt nur 13 – sollen überraschend gut und ihrer Zeit weit voraus sein. Die erste Episode ist es noch nicht so sehr.

Die Geschichte: Eine Geheimorganisation sucht für internationale Einsätze hochkarätige Agenten, sogenannte Alphas. „Persönlichkeiten, die fähig sein müssen, für die Menschheit zu entscheiden.“ Nicht jeder ist qualifiziert, viele arbeiten nur als Betas – schon auch wichtig, aber halt nur Helferlinge.
So futuristisch die Organisation ist: Am Anfang kriegen wir zu sehen, wie Nachrichten aus aller Welt eingehen und verteilt werden – von Frauen, versteht sich. Die Führungsriege der Organisation besteht aus fünf – Männern, versteht sich.

Anklänge von The Prisoner, Mission Impossible, durchaus ehrenhaft. Sehenswert die Drehorte: München zur Baustellenzeit vor den Olympischen Spielen 1972. Eine Szene spielt auf dem Olympiaturm.
Produktionsqualität: Na ja, schon okay, öffentlich-rechtlich. Aber wegen eines Schauspieler-Versprechers hat man da noch lange keine zweite Aufnahme einer Einstellung gemacht.

Für unsereiner zusätzlich interessant: Der Held und zukünftige Alpha, der in der ersten Episode allerlei Prüfungen besteht und schließlich in die Organisation aufgenommen wird, ist — ein Studienrat. Graumeliert, Mathematik und Sport. Bewährt sich gegen fiese Rockerbanden („Bill, Jim, erledigt das!“); setzt bei der Exkursion in die Satellitenzentrale seine anwesenden Mathematikschüler, männlich, zur Berechnung ein, weil ein Computer ausfällt; vertauscht erfolgreich – wenn auch nicht überzeugend – den Medizinball in der Sporthalle gegen Kampfkunstmanöver, um sich eines Pistolenheinis zu erwehren.

Zoobesuch 2017

By | 2.3.2017

Heulende Wölfe„Listen to them, the children of the night. What music they make!“ (Bram Stoker, Dracula.) Haben alle drei geheult, und es hört sich so an wie im Kino. Aber beeindruckender.

Roter PandaRoter Panda, englisch: Firefox.

Königspinguine mit JungtierKönigspinguine. Einer davon erst fünf Monate alt… man sieht den Unterschied, glaube ich.

NashörnerNashörner. Sehe ich immer wieder gern.

„It is one thing to describe an interview with a gorgon or a griffin, a creature who does not exist. It is another thing to discover that the rhinoceros does exist and then take pleasure in the fact that he looks as if he didn’t.“ (G. K. Chesterton)

PelikanePelikane. Auf Deutsch: Rosapelikan. Auf Englisch: Great white pelican.

LöweLöwe, schauend.

Pfau, liegendPfau, liegend.

Kattas in KorbKattas. Waren alle sehr müde.

RhesusaffenRhesusaffen sitzen noch ein Weilchen nach dem Essen zusammen.

FlinkwallabysFlinkwallabys mit rosa Ohren. Gibt es dann auch Plumpwallabys?

AmeisenbärAmeisenbär, alter Freund.

Bücherausstellung

By | 22.2.2017

In der wirklich schönen Bibliothek meiner Schule ist gerade die Quasi-Wanderausstellung „Die 100 besten Kinder- und Jugendbücher“ aufgebaut, und mit meiner 9. Klasse war ich sie heute eine Viertelstunde anschauen.

Tisch mit Büchern darauf ausgebreitet

Schon schöne Idee. Aber für so viele Jahrgangsstufen sind hundert Bücher nicht viel, und es sind vor allem halt die hundert besten Neuerscheinungen und nicht Klassiker. Natürlich hat es mich sofort gereizt, die hundert besten Kinder- und Jugendbücher nach Herrn Raus Meinung vorzustellen. Vielleicht kriege ich gar nicht so viel zusammen, aber interessant wären ja vermutlich auch Bücher für alle Altersstufen, und außerdem müssten meine alten Exemplare auch pfleglich behandelt werden.

Man könnte ja auch 50 Bände aus der Bibliothek selber empfehlen, aber ob ich da so viel finde… Empfehlungen der Schülerinnen und Schüler selber wären auch möglich, aber ich denke, wenn eine konkrete Person hinter der Zusammenstellung steckt, kommt mehr heraus als bei einer Auswahl durch ein Schülerkomitee.

– Außerdem war diese Woche wieder ein Sportturnier an der Schule. Da ist Unterricht schwer möglich, wenn die meisten Schüler einer Klasse mitspielen und der Rest zuschauen möchte. Sehr stolz war ich auf zwei Unterstufenschüler, die fragten, ob sie nicht stattdessen den Unterricht einer anderen Jahrgangsstufe bei einem anderen Lehrer besuchen könnten. Das machen die wohl ab und zu, auch in Freistunden. Da machen die Kollegen wohl irgendwas richtig.

Verschwörungstheorien in den Zeiten vor dem Internet: Das Foucaultsche Pendel

By | 18.2.2017

Titelbild Das Foucaultsche Pendel

(Nach meinen ersten Gedanken zur erneuten Lektüre hier der Rest.)

Inhalt

Die erste Hälfte des Romans ist die Vorgeschichte: Casaubon schreibt in den 1970er Jahren in Mailand an einer Dissertation über die Templer. Er lernt die etwas älteren Diotallevi und Belbo kennen, die bei einem Verlag arbeiten, der als Nebengeschäft Möchtegernautoren für obskure Produktionen Geld aus der Tasche zieht. Ein solcher ist Oberst Ardenti, der ein Manuskript, ein Dokument und eine Verschwörungs-Räuberpistole mitbringt. Bevor aus dem Geschäft etwas werden kann, verschwindet Ardenti unter mysteriösen Umständen; die Polizei unter Inspektor De Angelis munkelt von Mord und ermittelt, kommt aber zu keinem Ergebnis.

Nach einem Zwischenspiel in Brasilien kehrt Casaubon zurück; mit Belbo und Diotallevi spinnt er die Geschichte des Oberst Ardenti weiter – aus dem ursprünglichen Dokument entwickeln sie eine Verschwörung der Verschwörungen, die die wichtigsten Ereignisse der (europäischen) Weltgeschichte erklärt und die mit den Templern beginnt, dann Freimaurer, Rosenkreuzer, Illuminaten, Juden, Assassinen, den Eiffelturm, die Pyramiden, Kathedralen, U-Bahnen, Stonehenge, Ley-Linien, Crowley und Cthulhu und alles einbaut, was einem sonst noch dazu passen zu scheint. Diese Megaverschwörung ist gänzlich erfunden, das Dokument, das ihre Basis bildet, ein Witz – aber sie entwickelt ein Eigenleben und damit doch so etwas wie Realität. Inspektor De Angelis fragt Casaubon, ob ihm eine Gruppe „Tres“ etwas sage, und sie geben ihrer Verschwörungsverschwörung diese Bezeichnung, samt erfundener Hintergrundgeschichte. Und prompt bildet sich diese Gruppe, oder bildet es sich ein.

Gedanken

Das Buch hat mich etwas weniger beeindruckt als beim ersten Lesen, aber mir wohl noch etwas besser gefallen. Den Aufbau finde ich etwas unausgeglichen; die ganze erste Hälfte des Buchs (von Rahmenhandlung/Rückblenden abgesehen) ist Vorbereitung, die Figuren werden in Position gebracht, wir kriegen viel Zeitkolorit und ein wenig Mystik. Das ist aber auch interessant zu lesen. Die zweite Hälfte besteht zu einem Großteil einfach aus der beeindruckend ausführlichen Konstruktion der Verschwörung und einem Finale mit Nachspiel.

Illuminaten, Rosenkreuzer, Weltverschwörung kannte ich vorher schon. (Ich sage nur: Illuminatus!-Trilogie.) Aber dass mein vages Interesse für esoterische Spinnervereinigungen massiv von diesem Buch beeinflusst worden war, das hatte ich vergessen. Es gab eine Zeit, da habe ich die Plakate der regelmäßig in Augsburg veranstalteten esoterischen Vorträge gesammelt – ich bin im Besitz einer umfangreichen, vermutlich weltweit einzigartigen Sammlung von mehr oder weniger billig kopierten Plakaten des Zentrums für Studien Gnostischer Anthropologie aus den mittleren 1990er Jahren.

Sehr nett dieses Plakat, alleridngs von einer anderen Gruppe:

Poster: Wer möchte Prophet werden?

Auch die eine oder andere Ausgabe einer esoterischen Weltverschwörungszeitschrift ist in meinem Archiv. Da steht übrigens genau das gleiche drin wie bei den Spinnern bei Eco: Weltverschwörung, Freimaurer, die Weisen von Zion, Illuminaten, mindestens Kokettieren mit Nazi-Gedankengut. Das war noch alles vor dem Internet, wie wir es kennen, aber die Verschwörungstheoretiker und Aluhüte gab es schon damals. Nur halt per Post – das sieht man schön an diesem Band von 1988:

Buch: High Weirdness by Mail

(Alter Blogeintrag dazu, dort auch Links zu den Publikationen.) Das ist ein kommentierter Katalog von Zeitschriften und Vereinen, sortiert in Kategorien wie etwa: Weird Science, New Age Saps, Cosmic Hippie Drug-Brother Stuff, Weird Politics, Rantzines und UFO Contactees. Da schickte man früher self-addressed envelopes hin, oder Briefmarken, und kriegte ein mehr oder weniger schlecht kopiertes Heftchen.

Heute… ich sage nur: Pizzagate, bringe aber nicht die Energie auf, darüber zu schreiben. Bei Wikipedia gibt es einen Überblick, bei Cracked.com ein paar Details.

Es war geradezu deprimierend, bei Eco von genau diesen Prozessen der Konstruktion von Sinn und Verschwörung zu lesen, die einem heute im Internet begegnen.

Achten Sie verstärkt auf Symbole! Achten Sie darauf, welche Logos verschiedene Firmen benutzen!

Das steht nicht bei Eco, sondern in einer meiner Spinnerzeitschriften. Das könnte auch bei Pizzagate so stehen. Seufz.

Keine Information ist weniger wert als die andere, das Geheimnis besteht darin, sie alle zu sammeln und dann Zusammenhänge zwischen ihnen zu suchen. Zusammenhänge gibt es immer, man muss sie nur finden wollen.

Das ist jetzt von Eco, ebenso wie das:

Die Bücher der Entschleierten Isis müssen genau von denselben Sachen handeln, die auch in den anderen stehen. Sie bestätigen sich gegenseitig, also sind sie wahr.

Restliche Gedanken

Verpasste Gelegenheit? Am Ende des Romans taucht ein Doppelpendel auf, also ein Pendel, an dem unten ein zweites Pendel befestigt ist. Dem Kapitel ist ein Zitat aus einem Antwortbrief eines (realen) Architekten und Mathematikers vorangestellt, in dem das Verhalten eines solchen Pendels in einer konkreten Situation beschrieben wird: Letztlich würde – wohl: zumindest in dieser Situation – der obere Teil des Pendels still stehen, der untere weiterschwingen. Innerhalb des Romans stammt das Zitat aus einem Brief, den eine der Personen aus Interesse an einen Wissenschaftler geschrieben hat. — Irre ich mich, oder müsste eine – zumindest: ideales – derartiges Pendel nicht quasi-unregelmäßig schwingen? Das ist doch das Standardbeispiel für ein chaotisches System. Und Chaos war zu Zeiten des Pendels (oder war das erst knapp danach?) das neueste heiße Ding. Dass Eco damit nicht gearbeitet hat, wundert mich.

Erwähnen möchte ich noch den Interpretationsansatz, den mir mein Freund B. genannt hat: Das Foucaultsche Pendel als Teil deines Diptychons, mit dem Name der Rose als Kritik des Rationalismus und dem Pendel als Kritik des Irrationalismus.

Programmieren in der 9. Jahrgangsstufe

By | 16.2.2017

In Bayern beschäftigen sich Schülerinnen und Schüler der 9. Jahrgangsstufe (Gymnasium, naturwissenschaftlich-technologischer Zweig) mit Tabellenkalkulations- und Datenbanksoftware. Das ist bei dem aktuellen, etwa zehn Jahre alten Lehrplan so, und bei dem kommenden neuen ebenfalls. Dabei sollen die Schülerinnen nicht Excel lernen, sondern vor allem: Datenflussmodellierung, und ein Verständnis für Funktionen im informatischen Sinn. Und sie sollen auch bei Datenbanken neben SQL vor allem Datentypen und die Modellierung mit Klassendiagrammen lernen, als Vorarbeit für die 10. Jahrgangsstufe, die ganz unter dem Stern der Objektorientierten Programmierung steht.

Ein halbes Jahr Excel, ein halbes Jahr SQL – das hängt einem zum Hals heraus. Beides braucht man danach im Informatikunterricht nur spärlich, jedenfalls nicht bis in die jeweiligen Feinheiten.

Da ich dieses Jahr zum Halbjahr unter anderem meine 9. Klasse abgeben muss (und stattdessen eine Deutschklasse übernehme; so etwas kommt zum Halbjahr immer mal wieder vor), habe ich nicht mit Datenbanken angefangen, obwohl ich schon vor einer Weile mit Tabellenkalkulation abgeschlossen habe. Stattdessen habe ich mit den Schülern das getan, was sich logischerweise anschließt an die Auseinandersetzung mit Tabellenkalkulation unter funktionalem Begriff: selber Funktionen programmiert.

Das geht mit Python so kinderleicht und so natürlich, dass die Schüler damit keine Probleme haben. Man kann fast die gleichen Aufgaben, die sie vorher mit Calc gelöst haben, jetzt mit Python programmieren. Aus Zellbezeichnern werden Variablenbezeichner, schließlich ist so eine Zelle fast auch nur ein Behälter für einen Wert – wie Variablen.

Arbeiten mit der Programmiersprache Python

Python ist eine einfache Programmiersprache. Du schreibst die Befehle dazu in eine Datei (Menü: “File>New Window” oder einfach STRG+N), die du dann mit der Taste F5 (“Run”) ausführen lässt.
Die Funktionen darin ähnen denen in Tabellenkalkulationsprogrammen, nur dass du die Zellen nicht siehst:

a1 = 14 in Zelle a1 wird 14 eingetragen
b1 = 12 in Zelle b1 wird 12 eingetragen
c1 = a1+b1 in Zelle c1 wird die Summe von a1 und b1 eingetragen
a1 = -5 in Zelle a1 wird -5 eingetragen – anders als bisher ändert sich dabei c1 nicht, die Werte anderer gemerkter Sachen werden nicht automatisch aktualisiert

Um die Werte anzuzeigen, kannst du die print-Funktion verwenden:

print(c1) druckt “26” aus
print(„Ergebnis:“, c1) druckt “Ergebnis: 26” aus
print(a1, b1, c1) druckt “-5 12 26” aus

Vordefiniert sind diese Funktionen in Infix-Schreibweise: +, -, /, *

Andere Funktionen musst du dir selber schreiben. Das geht so:

def quadrat(x):
    return x*x

Wichtig sind dabei das Schlüsselwort def für Definition, die Klammern, der Doppelpunkt und die automatische Einrückung nach dem Doppelpunkt. Mit dem Schlüsselwort return bestimmst du, was die Funktion zurückgeben soll.
Sobald du das getan hast, kannst du die Funktion in den Zeilen darunter benutzen:

d1 = quadrat(3)
print(d1) druckt “9” aus
print(quadrat(quadrat(3+2)) druckt “625” aus

AUFGABE 1: Ergänze und teste folgende Funktionen

Testwerte

Ergebnis

def quader_volumen(laenge, breite, hoehe)

2,3,4

24

def kreis_flaeche(radius)

3

28.27431

def kreis_umfang(radius)

3

18.84954

def zylinder_volumen(radius, hoehe)

3,4

113.09724

def quadrat_umfang(seitenlaenge)

3.5

12.25

Hinweise: Nimm für Pi den Wert 3.14159 – achte darauf, wie bisher kein Komma zu nehmen, sondern einen Dezimalpunkt.
Umlaute und Sonderzeichen funktionieren meistens bei Programmiersprachen, machen aber ab und zu doch Probleme, deshalb verzichte ich meistens ganz auf sie

AUFGABE 2: Schreibe dir eine Funktion, mit der du die vorherigen Funktionen testest:

def test():
    print("Quadrat von 2:", quadrat(2))
    print("Volumen Quader 2*3*4:", quader_volumen(2,3,4))
    print("Kreis Umfang Radius 1:", kugel_umfang(1))

Und so weiter. (Diese Funktion gibt nichts zurück.)
Starte den test mit der Zeile: test()

AUFGABE 3: Ergänze Funktionen

  • zum Berechnen des Durchschnitts zweier Zahlen
  • zum Berechnen der Fläche eines Trapezes
  • zum Berechnen der Blutalkoholkonzentration, abhängig von Masse des Menschen, Menge des Getränks, Alkoholgehalt des Getränks – entscheide dich dabei für die Formel für Männer oder Frauen

AUFGABE 4:

  1. Schreibe eine Funktion verschieben(zeichen), die
    1. ein eingebenes Zeichen in eine Zahl umwandelt. Das geht mit der bereits vorhandenen Funktion ord(zeichen) (=> wandelt Zeichen in Zahl um).
    2. Zähle dann 1 zu dem Ergebnis dazu
    3. und wandle das Ergebnis mit der vorhandenen Funktionen chr(Zahl) (=> wandelt
      Zahl in Zeichen um) wieder in ein neues Zeichen um,
    4. das die Funktion dann zurückgibt
  2. Schreibe eine entsprechende Funktion zurueckschieben(zeichen)
  3. Schreibe die neuen Funktionen verschiebenUm(zeichen, verschiebung_um) und zurueckschiebenUm(zeichen, verschiebung_um)
  4. Teste das jeweils mit der folgenden Funktion an einem ganzen Satz:
def verschluesseln(satz):
    for buchstabe in satz:
        print (verschiebenUm(buchstabe, 2))

Aufgabe 5: Die Kontrollstruktur: Wenn, dann, sonst (“Bedingte Anweisung”)

Es gibt keine wenn-Funktion, aber so etwas Ähnliches. Du kennst das noch von Robot Karol:

def darfBierBestellen(alter, eltern_sind_dabei):
    if alter>16:
        return True
    else:
        if alter>14 and eltern_sind_dabei==True:
            return True
        else:
            return False

Zum Testen:

x1 = darfBierBestellen(15, False)
print (x1) druckt “False” aus

Warum steht das nicht im Lehrplan, wo es sich doch organisch an die Tabellenkalkulation anfügt? Und eine gute Vorbereitung für die 10. Klasse ist? Außerdem halte ich es für äußerst sinnvoll, erst einmal nicht objektorientiert zu programmieren, Algorithmik zu üben – nur dann erkennen Schüler später auch den Sinn und Nutzen von objektorientierter Programmierung.

Ich vermute mal, dass das mit der Geschichte des Pflichtfachs Informatik in Bayern zu tun hat. Bayern ist da ja mit Vorreiter, und wenn ich mir anschaue, wie schwer sich andere Länder mit dem Einführen eines solchen Fachs tun, dann war das wohl auch hier eine große Leistung. Bei den Entscheidungsträgern hatte Informatik, und das ist wohl immer noch so, den Ruf, etwas mit Programmierung zu tun – und das war ja total verpönt. Das brauchte man allenfalls in der Berufsbildung, aber doch nicht an allgemeinbildenden Schulen. — Und so hat man sich mit dem Verzicht auf frühes Programmieren vielleicht den Pflichtfachstatus erkauft. Trotzdem schade, dass der neue Lehrplan keien Verbesserung gegenüber dem alten bringt.

Abitur 2017: Neue Termine

By | 11.2.2017

Das Abitur in Bayern: Es wird zentral gestellt, aber an den Schulen vom jeweiligen Fachlehrer korrigiert; eine zweite Lehrerin an der Schule ist Zweitprüferin der Klausuren; die beiden einigen sich auf eine Note. (Können sie sich nicht einigen, wird ein dritter Prüfer herangezogen.) Es gibt in drei Fächern schriftliche Klausuren, im Anschluss daran mündliche Prüfungen in zwei Fächern. Die erste der schriftlichen Prüfungen war traditionell Deutsch, vielleicht aus historischen Gründen, vielleicht weil die Korrektur dieser Aufgaben am längsten dauert.

Inzwischen ist die Reihenfolge aber offen, und das liegt daran, dass immer wieder Teile der Aufgaben bundeslandübergreifend gestellt werden. Und damit müssen diese Prüfungen natürlich am selben Tag stattfinden, und das wird erschwert durch die unterschiedlichen Ferien- und Schuljahrestermine in den veschiedenen Ländern.

Und so begab es sich, dass die Abiturprüfungstermine für 2017 so festgelegt wurden:

  • 03.05.2017 Mathematik
  • 09.05.2017 Deutsch
  • 12.05.2017 3. Fach (häufig und zum Beispiel Englisch)
  • 22.05. – 26.05.2017 1. Mündliche Prüfung
  • 29.05. – 02.06.2017 2. Mündliche Prüfung

Damit hätten die Lehrer und Lehrerinnen in Bayern je nach Fach etwas mehr oder etwas weniger als drei Wochen Korrekturzeit gehabt; an diese hätten sich die Pfingstferien angeschlossen, in denen die Zweitkorrektoren die Klausuren bearbeitet und mit den Erstprüfern besprochen hätten.

Denn als Termin für die Bekanntgabe der Noten war der Montag nach den Pfingstferien festgelegt und mitgeteilt worden: der 19.06.2017.

Das ist jetzt aber nicht mehr so. Am Freitag, 10.02.2017 hat das bayerische Kultusministerium die Gymnasien informiert, dass die Ergebnisse bereits am 02.06.2017 am Nachmittag mitgeteilt werden müssen, das ist der Freitag vor den Pfingstferien. Hier die Pressemitteilung des Kultusministeriums: Nach „eingehender Prüfung“ habe man „pädagogische Erwägungen“ vorgenommen und danke jetzt „allen, insbesondere den betroffenen Lehrkräften, für die Bewältigung der mit der Terminverlegung verbundenen Auswirkungen.“

Denn die Lehrer und Lehrerinnen sind alles andere als begeistert. Für eine reguläre Klausur hat man laut Schulordnung drei Wochen Korrekturzeit, und für diese Abiturprüfung hat man jetzt weniger als das – obwohl die Prüfungen umfangreicher und wichtiger sind und nach der Korrektur noch die Korrektur durch den Zweitprüfer erfolgen und mit diesem besprochen werden muss.

– Was waren das für „pädagogische Erwägungen“ des Kultusministeriums, die zu dieser Entscheidung geführt haben? Ich vermute, dass es keinesfalls nur solche waren. Vielmehr gab es eine vom Kultusministerium nicht erwähnte Petition, die am 05.02.2017 um eben diese Terminverlegung bat:
https://www.openpetition.de/petition/online/abi-nomtenbekanntgabe-am-2-juni (Tippfehler bereits im Original).

Die Petition wurde etwa 25.000 mal unterschrieben, zum Großteil von Bürgern aus Bayern. Eingereicht wurde die Petition von Schülerinnen und Schülern; den Text der Petition und Pro-Contra-Kommentare dazu kann man durchaus mal lesen. Die Kurzfassung: Wenn man erst nach den Ferien seine Noten erfährt, und danach erfährt oder entscheidet, dass man in die mündliche Ergänzungsprüfung in einem oder mehreren Fächern muss, dann bleibt zu wenig Zeit zur Vorbereitung darauf – diese Prüfungen finden tatsächlich in der Woche nach den Ferien statt. Sie sind verpflichtend für die Schülerinnen und Schüler, die bei den schriftlichen Abiturprüfungen zu schlechte Ergebnisse hatten und sie verbessern müssen, um das Abitur überhaupt zu bestehen. Und im Vergleich zu früheren Jahrgängen fühlen sich die Petitionseinreicher dadurch benachteiligt.

Meine Beurteilung des Verhaltens der Petitionsunterzeichner:

Den Vergleich mit früheren Jahren halte ich für zu simpel; in früheren Jahren war die Gewichtung schriftlicher zu mündlicher Noten auch 2:1 statt wie jetzt 1:1 – da hat sich auch keiner beklagt, dass es jetzt leichter ist, gute Noten zu kriegen und überhaupt bis zum Abitur zu kommen. Mich stört, dass die Ergänzungsprüfung, die eigentlich als Maßnahme für den Notfall gedacht war, jetzt schon bereits vorher mit eingeplant wird. Ich kenne keinen Statistiken, wie viele Schüler in Bayern in diese Prüfungen gehen, ich nehme mal an, Tendenz steigend. (Dazu passt auch, dass immer mehr Schüler schon sehr früh planen, die 11. Jahrgangsstufe als Versuchsballon zu besuchen – deren Wiederholung wird schon eingeplant, bevor sie nötig ist.) Allerdings finde ich es gut, wenn Schülerinnen und Schüler Werkzeuge wie Petitionen kennen und nutzen.

Meine Beurteilung des Verhalten des Kultusministeriums:

Pädagogische Erwägungen, my foot. Es ist Wahljahr und man will nichts riskieren, und die Rechtsabteilung warnt sicher davor, irgendwem irgendwas zu geben, was irgendwie der Anlass zu einer Klage sein könnte. Bloß nicht noch mehr schlechte Presse in der Bildungspolitik.

Meine Beurteilung des Verhalten der Schulleitungen:

Man wünschte sich, die würden wenigstens beim Kultusministerium anrufen und sich beschweren. Aber Behördenleiter denken da realistisch, fürchte ich. (Mit meiner Schulleitung habe ich noch nicht gesprochen, versteht sich.)

Wie es weitergehen wird:

(Reines Raten meinerseits. Ich bin eh nur am Rande betroffen.) Die Verbände werden darauf hinweisen, dass das aber nicht schön ist. Das Kultusministerium wird den Schulen erlauben, den korrigierenden Lehrkräften falls nötig einen Tag frei zu geben für die Korrektur, wobei der Unterricht dieses Tages dann von anderen Lehrkräften zu vertreten ist. Diese werden sich ärgern. Die Lehrkräfte werden ein wenig schneller und weniger sorgfältig korrigieren als sonst, die Noten werden zum Ausgleich nicht schlechter werden, die Zweitprüfer werden nur pro forma kurz über die Arbeiten schauen. Das lässt sich alles schon irgendwie regeln. Man wird mit dem Gedanken spielen, die mündlichen Ergänzungsprüfungen dann besonders schwer zu machen, aber das natürlich nicht umsetzen. (Ernsthaft und völlig unironisch.) Der Respekt der Lehrer vor dem Kultusministerium wird nicht weiter sinken, weil das nicht geht, und dem Kultusministerium wird das egal sein und egal sein dürfen.