Sonntag, 6. Dezember 2009

Text und Programm III

2. Ist jeder Text ein Programm?

b) Ein Gedicht

Dies ist meine Mütze,
dies ist mein Mantel,
hier mein Rasierzeug
im Beutel aus Leinen.

Konservenbüchse:
Mein Teller, mein Becher,
ich hab in das Weißblech
den Namen geritzt. [...]

Aus: Günter Eich, Inventur.

Vgl. http://www.philosophia-online.de/mafo/heft2007-1/Jo_Eich.htm.

Oder http://de.wikipedia.org/wiki/Inventur_(G%C3%BCnter_Eich)

Wenn man mit diesem Gedicht Ähnliches versucht, wie mit einer Einkaufliste, stößt man doch recht schnell an seine Grenzen. Mit den ersten zwei Versen wiederholt sich eine Form, im dritten Vers wird ein Teil der Form aus V1 und V2 einfach weggelassen. Der vierte erweitert den dritten. Der fünfte Vers ist dann noch kürzer, aber der Leser ahnt inzwischen auch so, was das einzelne Wort bedeuten kann.

Für menschliche Interpreter ist das alles kein besonderes Problem, weil man die Form des Gedichts im Vollzug lernt um den Inhalt zu erschließen, während man mögliche Bedeutungen mit seiner eigenen Lebenswirklichkeit abgleicht. Am Schluss bleibt man dann bei einer Interpretation hängen, die im Vergleich mit anderen Interpretationen anderer Menschen noch nicht mal die Wahrscheinlichste seien muss. - Erst wenn man dann mit anderen die Interpretation diskutiert, kann man zu einer oder mehreren Deutungen finden, die man weitgehend teilt.

Vergleichbares in der Maschinensprache hätte man, wenn man z.B. das Ende einer Schleife offenlassen könnte, weil der Interpreter dann schon irgendwie merkt, dass die Schleife fünf Codezeilen vorher zu Ende gewesen sein müsste.

Schluss: Nicht jeder Text ist ein Programm. Vielmehr sind Programme ganz spezielle maschinenlesbare Texte. Ihre Variabilität ist an die Fähigkeit der Maschine gebunden, Texte zu verstehen und ggfs. sinnvoll zu ergänzen. Diese Fähigkeit ist bislang recht gering.

- So richtig neu ist diese Erkenntnis jetzt auch nicht. Aber es ist doch überraschend, welche Wege es nimmt, wenn man mal etwas für sich plausibel machen möchte.

Mittwoch, 4. November 2009

Text und Programm II

2. Ist jeder Text ein Programm?

Das würde man ablehnen wollen, denn es gibt so viele verschiedenartige Texte, dass einfach gar nicht alle Texte Programme sein können. Die Bandbreite möglicher Texte variiert zum Beispiel vom Einkaufszettel über die Packungsbeilage der Kopfschmerztablette oder die Bedienungsanleitung für Kühlschränke bis hin zu Lyrik, Epik und dramatischen Werken.

a) Einkaufszettel
1 Paket Butter
1 Packung Toastbrot
2 Liter Milch
1 Tube Zahnpasta, ...

Man könnte das tatsächlich als ein Programm verstehen, weil die Abfolge der Punkte auf dem Einkaufszettel einer Aufforderung entspricht, jeden der Punkte zu kaufen. Das einfache Programm lautet etwa:

for a,b,c in zettel:
Kaufe a Stück nach b Maßeinheit von c Sache

Der Einkaufszettel ist also in seiner Kurzform als Programm denkbar, wenn wir annehmen, dass die enthaltenen Anweisungen implizit formuliert sind. Eine Maschine kann daher Einkaufszettel lesen und die implizierten Anweisungen ausführen, wenn sie weiß, dass ein Zettel ein Einkaufszettel sein soll. Was auf dem Einkaufzettel steht, ist dabei unerheblich, da man jeden Schleifendurchgang mit einer Fehlerbehandlung absichern könnte. Die Maschine startet dann oben, liest anschließend die einzelnen Punkte und versucht jeweils eine Ausführung. Am Ende des Einkaufszettels endet auch das Programm.

Montag, 2. November 2009

Text und Programm I

1. Sind alle Programme nicht auch Texte?

Wenn das stimmen soll, dann muss jedes Programm alles haben, was ein Text auch hat. Hervorstechende Textmerkmale sind die Kohäsion, die Kohärenz und die Situationsabhängigkeit.

a) Kohäsion
Die Syntax bei Programmen ist zwar variabel, aber nicht beliebig. Die Abfolge einzelner Anweisungen und Kontrollstrukturen ist grundsätzlich frei. Aber wenn eine Kontrollstruktur begonnen wird, muss sie auch beendet werden. Oder man muss Zuweisungen so schreiben, dass sie von rechts nach links funktionieren. Beachtet man das nicht, ist das Programm defekt. Überhaupt kann man defekte, d.h. nicht interpretierbare oder nicht kompilierbare Programme erzeugen,indem man die Syntaxregeln missachtet. In diesem Sinn darf man also von Kohäsion sprechen: Es gibt einen grammatischen Zusammenhang in Programmen, der falsifiziert werden kann.

b) Kohärenz

Kohärenz meint den Bedeutungszusammenhang, die durchgängig wahrnehmbare semantische Ebene. Man könnte das als Zustandsdeutungen in einem Programm suchen. Ein Programm operiert auf der Annahme einer Reihe von Zuständen, die je nach Programmablauf verändert werden können. Das Programm funktioniert nur dann richtig, wenn die Zustände immer gleich interpretiert, das heißt die Zustandsvariablen immer im gleichen Sinn verwendet werden. Ein Gegenbeispiel ist die Änderung der Zählvariable einer ForNext-Schleife aus dem Inneren der Schleife heraus. Diese Operation wäre syntaktisch möglich, aber eine Verletzung der Kohärenz. Die Folge ist wieder ein defektes Programm. Auch Kohärenz existiert in Programmen.

c) Situationsabhängigkeit

Ein großer Teil der Programmierarbeit ist es, von der Situation, in der das Programm läuft, soweit zu abstrahieren, dass es tatsächlich immer läuft. Das bedeutet aber nicht, dass es immer gleich abläuft. Teilweise sind die Situationen auch nur bedingt vorhersehbar. Etwa lebt die Idee der MMPORGs ja davon, dass einzelne Spieler miteinander interagieren und nicht alle zentral mit der Instanz eines Rechenhirns. Programmierte Spiele brauchen also eine gewisse Distanz von den Eingabemöglichkeiten und müssen trotzdem eine möglichst große Bandbreite von Spielverläufen ermöglichen. Grundlage dafür ist die Fehlerbehandlung, das Werfen einer Ausnahme. Programme sind also situationsabhängig. Andere Situationen produzieren andere Abläufe.

Die Betrachtung von Kohäsion, Kohärenz und Situationsabhängigkeit zeigt also, dass jedes Programm auch ein Text ist.

Dienstag, 27. Oktober 2009

Mergesort

Das Sortieren einer Liste gehört zu den Standardübungen beim Programmieren.

Mergesort wurde zum ersten Mal von John von Neumann präsentiert. Vgl. Art. s.v. Mergesort in Wikipedia. Die Idee ist, dass eine Liste, die aus einem Element besteht, bereits sortiert ist. Um eine größere List zu sortieren, muss man also nur eine Liste teilen können, bis jeder Teil sortiert ist und dann die entstandenen Teile neu sortiert zusammensetzen.

Implementierung in Python am Beispiel von Zeichenketten:


# ein Zeichen in eine sortierte Kette einfuegen
def eins_sortiert_einfuegen(p,q):
z = 0
for n in q:
if p <= n:
return q[:z]+p+q[z:]
z = z + 1
return q+p

# viele unsortierte Zeichen in eine sortierte Kette einfuegen
def viele_sortiert_einfuegen(a, b):
y = 0
for n in a:
b = eins_sortiert_einfuegen(n, b)
return b

# zwei sortierte Ketten sortiert miteinander verbinden
def merge(a,b):
x = 0
for m in a:
t = 0
y = len(b)
for n in range(x, y):
if m <= b[n]:
b = b[:n]+m+b[n:]
x = n
break
if y == len(b):
b = b + m
x = n + 1
return b

def mergesort(zeichenkette):
a = len(zeichenkette)
if a > 1:
#return viele_sortiert_einfuegen(
mergesort(zeichenkette[:int(a/2)]),
mergesort(zeichenkette[int(a/2):])
)
return merge(mergesort(zeichenkette[:int(a/2)]),
mergesort(zeichenkette[int(a/2):]))
else: return zeichenkette

## Voruebung
print eins_sortiert_einfuegen("r", "abcmnopz")
print viele_sortiert_einfuegen("rdz", "abcmnopz")

## Sortierung
print mergesort("rio bravo john hugo")

Mittwoch, 14. Oktober 2009

Das Medium für die Didaktik der Informatik


Wie trage ich den Lernstoff zum Schüler? Das heißt: Welches Medium setze ich ein?

Erzählen

Das klingt ganz nett. Hin und wieder eine kleine Geschichte zu großen Geistern der Informatik mag ganz nett sein. Nur wer möchte die rekursiv definierte Fakultätsfunktion in eine Geschichte fassen? Das wird schwer. Und man würde nicht darauf wetten wollen, dass diese Geschichte jemand hören möchte. Aber natürlich, wenn jemand etwas Spannendes zu erzählen weiß, dann hört man auch zu.

Lehrbücher

Da geht grundsätzlich mehr als mit Erzählen. Wir können Diagramme betrachten, Texte wiederholt nachschlagen, Programmcode abdrucken und analysieren. Es kann illustrierende Bilder geben. Wer etwas wissen will, der kann in aller Regel ein geeignetes Buch finden, das ihm den gesuchten Sachverhalt aufschlüsselt und irgendwie näher bringt. Wer Bücher liest, der lernt Bilder und Texte zu analysieren und im Gegenzug je nach Bedarf zu reproduzieren. Nur: Informatik lernt man ja nicht mit dem Vorsatz Texte zu produzieren.

Online-Medien

Online-Medien bieten alles, was ein Buch auch bietet. Und: Das Medium ist Teil der Zielplattform des Informatikunterrichts, des Computers. Oder würden Sie Informatik lernen wollen, weil Sie einen Algorithmus zur Entfachung eines Lagerfeuers brauchen? Niemals. Mag auch die Wissenschaft der Informatik Ziele verfolgen, die jenseits eines Rechners angesiedelt sind. Gelernt wird Informatik, weil die Leute programmieren wollen. Und programmiert wird am Rechner. Daher ist der Druck von Schulbüchern für das Fach Informatik allenfalls kein Fehler. Nützen wird er niemandem.
Weil der Online-Kurs Teil der Zielplattform ist, darum sind auch Tutorials im Internet und Foren so beliebt. Es ist einfach total praktisch, ein Code-Beispiel zu kopieren, in der IDE der Wahl einzufügen, zu testen und dann ggfs. anzupassen. Das Buch kann da nicht mithalten. Man müsste ja erstmal alles abtippen.
Speziell für den Unterricht gibt es als Lernplattform zum Beispiel Moodle. Virtuelle Klassenräume erstellen oder Thematische Kurse einrichten: Beides ist möglich. Aufgaben können eine Upload-Möglichkeit beinhalten und von Trainern bewertet werden. Links ins Internet sind mit drei bis vier Klicks geschafft. Interaktive Elemente erlauben es, mit anderen Teilnemern zusammenzuarbeiten.

Wer sich Gedanken über Medieneinsatz imInformatikunterricht macht, der wird zwangsläufig bei Online-Medien enden, selbst wenn er sich die Gestaltung von Lernplattformen wie Moodle noch anders vorstellen könnte.

Sonntag, 19. Juli 2009

Vektoren und Animation von Bewegungen



Was passiert, wenn zwei animierte Objekte auf dem Bildschirm kollidieren? Wenn die Regeln der Physik gelten sollen, beobachten wir zentrale und nicht zentrale, elastische Stöße.
Aus dem Physikunterricht kennt man den zentralen, elastischen Stoß aus dem Experiment mit der Reihe von Kugeln, die zwischen zwei parallelen Streben an jeweils zwei Fäden aufgehängt sind. Zieht man auf der einen Seite der Reihe eine Kugel weg und lässt sie zurückfallen, löst sie durch ihren eine gleichgerichtete Bewegung auf der anderen Seite der Reihe aus.
Dieses Beispiel kann man noch eindimensional betrachten: Durch die Fadenaufhängung bewegt sich die Kugel immer auf einer Linie, die durch die Zentren der aufgehängten Kugeln verläuft. Die einzelne Kugel läuft in der senkrechten Projektion wie ein Zug auf Gleisen.
Andere Fälle erfordern eine zwei- oder dreidimensionale Betrachtung: Der Zusammenstoß von zwei Billardkugeln ist ein Beispiel für einen zweidimensionalen, einen nicht zentralen, elastischen Stoß. Durch die Abweichung des Treffpunktes vom Bewegungsvektor ergibt sich eine Ablenkung der Kugeln nach dem Stoß aus der vorherigen Bahn. Ein Beispiel für dreidimensional zu betrachtende Kollisionen wäre die Betrachtung von Gasteilchen in einem Raum. Der Zusammenstoß von Planeten ist nochmals etwas anderes, weil die Körper hinterher verändert sind, es sind ja nicht elastische Stöße.

Zu Vektoren und ihrer Verwendung in Bewegungsanimationen

Dienstag, 9. Juni 2009

Modelleisenbahn

Einmal - vor ziemlich langer Zeit - hat mein Vater eine Modelleisenbahn für mich gekauft. Das war so eine kleine Minitrix-Bahn, mit einem winzigen Zug, Gleisen, Weichen, Signalen, elendig vielen Schaltern, Kabeln und einem Trafo. Alles war zusammen auf eine Pressspanplatte genagelt. Es war ein tolles Geschenk, das ihn viel Zeit gekostet hat. Mittlerweile beobachte ich meine eigenen Kinder, wie sie Brio- oder Legobahnen aufbauen und großen Spaß daran haben, weil sie den ganzen Aufbau selbst machen können.
Da ich jetzt also auch etwas brauche, das ich basteln kann, habe ich mal versucht, eine Modelleisenbahn in Software nachzubauen. Als Grundlage wähle ich Python, weil ich es einigermaßen kann, weil's gut zu lesen ist und man damit ziemlich schnell voran kommt. Python hat selbst keine Oberfläche. Aber ich werde die Zeichenmethode der Objekte so gestalten, dass ich zunächst mit der Turtle arbeiten kann und werde danach auf Pygame umstellen.

Entwicklungziele:
So ein Eisenbahnset besteht aus Gleiskörper, Zug, Kontrollsystem und Energieversorgung.
  1. Der Gleiskörper - den braucht man sowieso: Gleise (Gerade, Kurven, Poller, Weichen ...). Er soll eine doppelt verkettete Liste sein. Jedes Element der Liste hat eine graphische Komponente.
  2. Das Kontrollsystem: Weichen und Signale. Eine Weiche kann aus Gerade und Kurve zusammengesetzt werden, aber sie hat einen Vorgänger und zwei Nachfolger. Signal muss die aktuelle Weichenstellung angeben und umschalten können. Signal und Weiche sollen zunächst zusammengehören.
  3. Zug - eine Lok und mehrere Wagons. An der Lok hängen die Wagons. Das sollte eine einfach verkettete Liste werden. Der Zug muss ein Gleisstück nach dem anderen befahren können und anhalten, wen ein Signal auf Rot steht.
  4. Die Energieversorgung = CPU-Spinner, Animationsschleife.

Einen ersten Entwurf findet man hier: Eisenbahn-0.1.py
Der Entwurf beinhaltet einen ersten Gleiskörper mit Weichen und Signalen. Eine einfachste Animationsschleife lässt das Ganze ein paar Mal zeichnen.

Donnerstag, 30. April 2009

Gimp-Plugin 'batch_convert2tifgray'

Da man das Plugin 'batch_convert2tifgray' bei Gimp 2.6 nicht mehr vernünftig einsetzen konnte, habe ich es mal wieder aktualisiert. Es wird jetzt bei den Filtern unter 'batch' angezeigt.

Nächste Ziele: Die Vorwahl der Filtereinstellungen wieder durch eine eigene Wahl einsetzen und das Schreiben eines Log-Files wieder einzuschalten. - Lustig wäre überhaupt mal eine dynamische Kombination von Filtern zu ermöglichen. Die müsste man dann jeweils einmal kombinieren und einstellen können und anschließend das ganze Set von Filtern auf ein einzelnes Bild, ein Verzeichnis von Bildern oder einen ganzen Verzeichnisbaum anwenden können. Weil: In aller Regel hat man ja nicht ein Bild, sondern eher 300.

Dienstag, 28. April 2009

Gimp-Plugin

Vor einiger Zeit hatte ich mal das Problem Massen von JPG's für den Graustufen-Offset-Druck vorzubereiten. Die Vorgaben der Druckerei waren dabei, dass die Bilder um ca. 10% im Tonwert zunehmen. Außerdem musste man die reinen Weißtöne soweit reduzieren, dass Sie z.B. in Bildern noch ein bisschen Farbe abbekamen. Im Endeffekt durften die Bilder also nicht zu schwarz und nicht zu weiß werden. In Gimp kann man das Problem lösen, indem man bei den Farbwerten das Spektrum der Zielwerte entsprechend reduziert, das also nach der Bearbeitung die Farbwerte von minimal 25 bis maximal 252 reichen, statt von 0 bis 255.
Wenn man das oft mit der Maus machen muss, wird es schnell grausam. Und um mir das zu ersparen, habe ich das Gimp-Plugin "Batch Convert to Tif-grayscale" programmiert. Damit kann man die Bilder in Graustufen umwandeln, dann durch "Unscharf maskieren" etwas kontrastreicher machen und die Konturen betonen und schließlich die Verteilung der Farbwerte wieder reduzieren. Das geht dann auch automatisch in den Unterverzeichnissen. Für misslungene Fälle sollte eine Log-Datei produziert werden. Leider ist die alte Fassung des Plugins noch für Gimp 2.3 und es geht sowieso nur, wenn die Python-Unterstützung mit installiert ist.

Bei starken Kontrasten sieht man die Farbwertreduktion am Bildschirm praktisch gar nicht. Das macht sich erst bemerkbar, wenn der Druck fertig ist.

Freitag, 24. April 2009

Pygame-Experimente

Seit einiger Zeit versuche ich kleine 2D-Spiele mit Python und Pygame zum Laufen zu bringen. Alle Versuche beginnen mit den Tutorials von www.pygame.org. Besonders dankbar bin ich für das Tutorial von Shandy Brown.

Mein letzter Versuch pygame_gui beinhaltet eine Art GUI mit Engine und kleinem Testprogramm. Zwei Spielfiguren - als Boxes oder Bilder - kann man über die Pfeiltasten bzw. w-a-s-d gleichzeitig steueren kann. Dazu kommt als Simulation haufenweise zufällig herunterschwebende Rechtecke. Was auch geht, ist ein Klappmenü im normalen Fensterstil und eingeblendeter Text.

Weitere Ziele sind eine Hintergrundmap, Kollisionserkennnung und die Möglichkeit, dass Spielfigur A oder B etwas wegwerfen. Dann eine Texteingabemöglicheit, dann die Umsetzung von einer Art Laufbewegung ...

Donnerstag, 23. April 2009

Homepage für GM-Film


GM-Film wollte seinen Webauftritt völlig umgestalten. In ca. drei Monaten wurde dafür ein winziges CMS auf der Grundlage von PHP5, Mysql und Ajax-Elementen entwickelt. Die daraus entstandene Website www.gm-film.net habe ich in enger Zusammenarbeit mit GM-Film entworfen und dann die ersten Schritte realisiert. Die Website ist nun eigenständig und wird vom Besitzer selbst weitergepflegt.

Hier finden sich die Dateien für das CMS: Damnsmallcms. Wer will kann sich noch tinyMCE in das Javascript-Verzeichnis legen. Dann wird der Editor etwas komfortabler. Bei der nächsten Gelegenheit packe ich noch ein Setup für die Datenbank dazu.

Bachkiesel

Das sind meistens kleine, vom Herumpoltern im Wasser rundgewaschene Steine. Solange sie nass sind, zeigen sie viele verschiedene Farben und glitzern in der Sonne.