Kurzfassung
F¨ ur Anf¨ anger ist das Erlernen einer Programmiersprache schwierig. Das liegt daran, dass im heuti- gen Unterricht bevorzugt mit Sprachen aus der Industrie gelehrt wird. Studenten wollen in der In- dustrie Jobs bekommen, und legen deshalb Wert darauf, dass gefragte Technologien Bestandteil ih- rer Ausbildung sind. Die Industrie wiederum will ihren Bedarf befriedigen. Dabei wird ¨
ubersehen, dass Programmiersprachen keine Technologien selbst, sondern Werkzeuge f¨ ur Technologien sind. Im Unterricht muss eine Programmiersprache ein Werkzeug sein, mit dessen Hilfe es m¨ oglich ist, die fundamentalen Ideen eines Unterrichtsgegenstandes zu vermitteln, ohne in einen Unterricht ¨
uber die Programmiersprache selbst abzudriften.
Die vorliegende Arbeit stellt Python als ein solches Werkzeug vor. Sie zeigt auf, dass Python, im Gegensatz zu heute h¨ aufig im Unterricht zum Einsatz kommenden Sprachen (wie C, C++ oder Java), gut f¨ ur Anf¨ anger geeignet ist. Aufgrund des einfachen Zugangs k¨ onnen mit Python viel fr¨ uher relevante Konzepte der Informatik und Softwareentwicklung diskutiert werden. Ein weiterer wesentlicher Vorteil ist, dass auch die Arbeit der Unterrichtenden erleichtert wird. Die Sprache ist kompakt und simpel gehalten und versucht sich dem Entwickler nicht in den Weg zu stellen. Gleichzeitig ist sie eine allgemein anerkannte Sprache und findet Verwendung in der Industrie.
F¨ ur fortgeschrittene Konzepte der Softwareentwicklung kann auf komplexere Sprachen umgestie- gen werden, wobei die Studenten dabei von ihren Erfahrungen mit Python stark profitieren. Der Unterricht kann aber durchaus weiter auf Python aufbauen. So zeigt diese Arbeit, wie das Kom- ponentenframework Zope hierbei Verwendung finden k¨ onnte. Dabei werden Themen wie Kompo- nentenorientierung, Reuse, Datenbanken, das Erleben eines Softwareentwicklungsprozesses und Testen und Dokumentieren von Software erl¨ autert. Auch Zope, das auf Python basiert, hat den Vorteil, dass im Vergleich zu anderen Applikationsframeworks ein einfacherer Zugang schnelle Lernerfolge erm¨ oglicht.
Vorliegende Arbeit zeigt, wie mit Python der komplette Bedarf eines auszubildenden Software- entwicklers abgedeckt wird. Durch die Schnelllebigkeit der Technik wird es immer wichtiger, die grundlegenden Konzepte einer Wissenschaft zu beherrschen, anstatt das Erlernen eines Werkzeugs, das in der Industrie aktuell ist.
Abstract
For beginners the learning of a programming language proves to be quite difficult. This is due to the fact that today’s educational system focuses primarily on languages related to industry. Students want to get jobs in the industry. Therefore they demand to be sufficiently trained in these technolo- gies. The industry again wants to satisfy its need. But programming languages are not technologies by themselves, though, they are tools for technologies. However, programming languages for edu- cational purposes must be such tools which help students gain fundamental understanding of a topic without the need for expert knowledge in a programming language itself.
This paper introduces Python as one example for such a tool. It points out that, unlike languages such C, C++ or Java widely used today, Python is highly suitable for beginners. Due to the easy access it is possible to teach relevant concepts of computer science and software development earlier in the learning process. A further substantial advantage is relief of the instructor´s. The language is compactly and simply held without hinderung the developer. Python is a generally a well respected language and finds use in the industry.
For advanced concepts of software development, teaching can be directed to more complex lan- guages, whereby the students strongly profit from their experience with Python. If knowledge of other languages is not required, it is also possible to stay with Python, which performs well in this situation.
Thus this paper shows how the component-framework Zope could be of use in this field. The following topics, such as component orientation, reuse, databases, experiencing a software deve- lopment process and tests- and documenting of software are discussed. Also Zope, which is based on Python, has the advantage of easy access, thus creating the possibility of fast successes in lear- ning. This paper shows how the complete need of a software developer is covered by teaching with Python.
Verwendete Abk ¨
urzungen
AJAX
Asynchronous JavaScript and XML
AOP
Aspektorientierte Programmierung
APE
Adaptable Persistence Engine
API
Application Programming Interface
BSD
Berkeley Software Distribution
CBSE
Component Based Software Engineering
CI
Corporate Identity
CORBA Common Object Request Broker Architecture
COTS
Commercial off-the-shelf
CPS
Collaborative Portal Server
CSS
Cascading Style Sheets
CWI
Centrum voor Wiskunde en Informatica
DBC
Design By Contract
DTML
Document Template Markup Language
EJB
Enterprise Java Beans
FH
Fachhochschule
GNU
GNU’s Not Unix
GUI
Graphical User Interface
HLL
High Level Language
HTML
Hypertext Markup Language
HTTP
Hypertext Transfer Protocol
IDLE
Integrated Development Environment
MUW
Medizinische Universit¨ at Wien
NASA
National Aeronautics and Space Administration
NATO
North Atlantic Treaty Organisation
OOP
Objektorientierte Programmierung
ORB
Object Request Broker
Portable Document Format
PROLOG PROgramming in LOGic
PSA
Python Software Activity
PSF
Python Software Foundation
RDBMS
Relational Database Management System
RMI
Remote Method Invocation
RPC
Remote Procedure Calls
RSS
Really Simple Syndication
SDL
Simple DirectMedia Layer
SIG
Python Special Interest Group
SOAP
Simple Object Access Protocol
SQL
Structured Query Language
Tcl
Tool command language
TDD
Test Driven Development
Tk
Toolkit
TTW
Through the Web
UML
Unified Modeling Language
URL
Uniform Resource Locator
WWF
World Wide Fund For Nature
XML
Extensible Markup Language
XP
Extreme Programming
ZCML
Zope Configuration Markup Language
ZEO
Zope Enterprise Objects
ZMI
Zope Management Interface
ZODB
Zope Object Database
Zope
Z Object Publishing Environment
ZPL
Zope Public Licence
ZPT
Zope Page Templates
Inhaltsverzeichnis
Inhaltsverzeichnis
1 Einleitung 2
1.1 Motivation und Zielsetzung 2
1.2 Aufbau der Arbeit 2
1.3 Fundamentale Ideen als Unterrichtsprinzip 3
1.4 Programmiersprachen im Unterricht 5
1.5 Grundlagen Python 6
1.5.1 Geschichte und Entwicklung 8
1.5.2 High-Level Sprache und Skriptsprache 10
1.6 Grundlagen Zope 12
1.6.1 Zope 2 12
1.6.2 Zope 3 14
2 Python lehren 16
2.1 Python als erste Programmiersprache 16
2.2 Programmierparadigmen 23
2.2.1 Programmierparadigmen im Unterricht 24
2.2.2 Imperative Programmierung 25
2.2.3 Deklarative Programmierung 28
2.2.4 Weitere Paradigmen 30
2.3 Algorithmen 32
2.4 Python in Fachgegenst anden 37
2.5 Open-Source und Community 38
2.6 Material Werkzeuge und Frameworks f ur den Schuleinsatz 40
3 Softwareentwicklung im Unterricht mit Zope 45
3.1 Komponentenarchitektur 45
3.2 48
3.3 Softwareentwicklungsprozess erleben 50
3.4 Testen und Dokumentieren von Software 54
3.5 Beispielimplementierung 58
3.6 Die Zukunft von Zope 66
3.7 Alternative Python Frameworks 67
4 Diskussion 68
4.1 Zusammenfassung und Bewertung 68
4.2 Kritik 70
4.3 N achste Schritte 71
4.4 ¨
Ahnliche Arbeiten 72
A Quelltexte 81
FH Technikum Wien Seite 1
1 Einleitung
1.1 Motivation und Zielsetzung
Geht es um das Aneignen von Programmierkenntnissen, ist die momentane Situation nach Ansicht des Autors nicht optimal. Sie ist verbesserungsw¨ urdig. Gerade in der schnelllebigen Informatik sollte im Unterricht nicht auf Trends oder Modeerscheinungen zur¨ uckgegriffen werden, sondern die fundamentalen Ideen der Wissenschaft Informatik mit einem guten Konzept an die Studieren- den herangetragen werden. Erste Programmierkenntnisse mit z.B. C oder Java zu vermitteln bzw. vermittelt zu bekommen, ist problematisch. Diese Arbeit hat zum Ziel, einen einfacheren Weg auf- zeigen und soll begr¨ unden, warum erste Programmiererfahrungen mit Python didaktisch sinnvoller sind.
Die Programmiersprache Python soll als Programmiersprache f¨ ur den Unterrichtseinsatz vorge- stellt werden und es wird gezeigt, wie gewisse Grundkonzepte mittels dieses Werkzeugs vermittelt werden k¨ onnen. Weiterf¨ uhrend wird Z Object Publishing Environment (Zope) als Applikationsser- ver, basierend auf Python, f¨ ur fortgeschrittenere Themen der Softwareentwicklung, und vor allem f¨ ur den praktischen Teil dieser Arbeit verwendet.
Die Arbeit hat das Ziel, die Verbreitung von Python an Schulen und Universit¨ aten zu unterst¨ utzen, um damit den Sch¨ ulern 1 und Studenten den Einstieg in die Programmierung und diese selbst zu erleichtern.
Weiters ist Zope f¨ ur den Einsatz an Universit¨ aten vorzustellen; der einfache Zugang zu einem Open-Source Produkt soll die Vorteile f¨ ur Lektoren und Studenten bei fortgeschrittenen Themen der Softwareentwicklung aufzeigen.
Die vorliegende Arbeit soll dabei als Entscheidungs- und Argumentationsgrundlage an genannten Ausbildungseinrichtungen dienen k¨ onnen.
1.2 Aufbau der Arbeit
Die Arbeit gliedert sich in Einleitung, zwei Hauptkapitel und abschließende Diskussion. Sie ist nicht klassisch in Theorie- und Praxisteil gegliedert. Eine solche Aufteilung ist bei dieser Thema- tik schwer zu vollziehen, die vorgestellte Theorie wird immer wieder durch praktische Beispiele unterst¨ utzend erl¨ autert. Im zweiten Kapitel ist eine Beispielimplementierung abgehandelt. In der Einleitung werden die Argumentationsgrundlagen f¨ ur die Arbeit aufgebaut. Die in der Arbeit verwendeten Technologien Python und Zope werden vorgestellt.
Nach Erkl¨ arung allgemeiner, in der Arbeit verwendeter Begrifflichkeiten und Technologien, folgt im ersten Kapitel die Abhandlung der Programmiersprache Python. Darin wird erl¨ autert, warum sich Python als eine Einstiegsprogrammiersprache, und vor allem f¨ ur Unterrichtszwecke beson- ders gut eignet. Danach werden Grundkonzepte des Informatikunterrichts, wie Paradigmen und 1 Wenn in dieser Arbeit die m¨ annliche Form verwendet wird, sind Frauen gleichermaßen gemeint, sofern nicht explizit Gegenteiliges behauptet wird.
Algorithmen mit Python als unterst¨ utzendes Werkzeug analysiert. Weiters wird behandelt, welche andere Fachgegenst¨ ande neben Informatik von Python profitieren k¨ onnen, wie das Thema Open- Source auf den Unterricht angewandt werden kann, und welche Materialien und Werkzeuge als Unterst¨ utzung f¨ ur den Unterricht bzw. die Unterrichtsgestaltung zur Zeit zur Verf¨ ugung stehen.
Zope ist das Thema des zweiten Kapitels. Zope ist ein Applikationsframework basierend auf Py- thon und eignet sich f¨ ur das Lehren fortgeschrittener Softwareentwicklungsmethoden. Darin wird untersucht, ob Zope als Komponentensystem betrachtet werden kann, und wie das Framework mit Component Based Software Engineering (CBSE) in Verbindung gebracht werden kann. Dass das Testen und Dokumentieren von Software im Unterricht vernachl¨ assigt wird, wird ebenso behan- delt, wie das Lehren eines Softwareentwicklungsprozesses. Den Abschluß des Hauptteils bildet die Beispielimplementierung aus einem realen Projekt im Arbeitsumfeld des Autors.
1.3 Fundamentale Ideen als Unterrichtsprinzip
Eine Argumentationsgrundlage dieser Arbeit ist die Definition einer fundamentalen Idee nach
Schwill [Sch93]. In seiner Arbeit untersucht er die philosophische Sicht der Idee nach Plato und Kant, und formuliert diese mit den Strukturen nach J.S. Bruner [Bru60] zur fundamentalen Idee. J.S. Bruner hat das didaktische Prinzip an den Strukturen der zugrundeliegenden Wissenschaft, an denen sich der Unterricht orientieren soll, formuliert.
“Eine fundamentale Idee (bezgl. einer Wissenschaft) ist ein Denk-, Handlungs-, Beschreibungs- oder Erkl¨ arungsschema, das
1. in verschiedenen Bereichen (der Wissenschaft) vielf¨ altig anwendbar oder er-
kennbar ist (Horizontalkriterium),
2. auf jedem intellektuellen Niveau aufgezeigt und vermittelt werden kann (Verti-
kalkriterium),
3. in der historischen Entwicklung (der Wissenschaft) deutlich wahrnehmbar ist
und l¨ angerfristig relevant bleibt (Zeitkriterium),
4. einen Bezug zu Sprache und Denken des Alltags und der Lebenswelt besitzt (Sinn-
kriterium).“
Das Horizontalkriterium veranschaulicht Schwill wie in Abbildung 1. Eine Idee wird so- weit abstrahiert, dass fachspezifische Elemente herausfallen. Damit kann themen- und
fach¨ ubergreifend gearbeitet werden. Der Lernende erkennt durch immer wiederkehrende Prinzi- pien die ¨
ubergreifende Relevanz der Thematik. Anschließend wird durch Wiederholung das Wich- tige gefestigt. Die gemeinsame Idee kann jedoch wiederum nur durch umfassendes Spezialwissen herausgearbeitet werden. Das ist die Aufgabe der Lehrkr¨ afte.
Das Vertikalkriterium kann wie ein Faden im Bildungsweg gesehen werden. Diesem Faden wird im Laufe der Ausbildung gefolgt. Dabei steigen das Niveau und die Detaillierung der Materie
(Abbildung 2).
Das Zeitkriterium ist in der Informatik nicht schwer zu erf¨ ullen. Die Schnelllebigkeit der Tech- nik birgt zwar viele Modeerscheinungen, jedoch sichert das Kriterium die Kontinuit¨ at des Unter- richts und den Wert der Kenntnisse und Erfahrungen der Unterrichtenden und verhindert fachliche Moden.[Mod02] Dabei ist die Tr¨ agheit der Lehre eine Art Vorauslese, um das Zeitkriterium einer fundamentalen Idee zu erf¨ ullen.
Der Autor interpretiert das Sinnkriterium als das tats¨ achliche Wertempfinden beim Empf¨ anger der Idee, beim Lernenden. Wie gut kann die Thematik als praxisrelevant oder als sinnvoll erkannt werden? Kann der Bezug zur sp¨ ateren Verwendung in der Arbeitswelt hergestellt werden? Der Einsatz fundamentaler Ideen wird von [Mod02] wie folgt beschrieben:
“Der Unterricht muss dann so angelegt werden, dass sich diese - wenigen - funda- mentalen Ideen bei den Sch¨ ulerinnen und Sch¨ ulern bilden k¨ onnen, er muss Kenntnisse und Erfahrungen vermitteln, die anhand dieser Ideen zu ordnen sind, und er muss diese Ideen zu einem geeigneten Zeitpunkt explizit thematisieren, um die spezifischen M¨ oglichkeiten und Beschr¨ ankungen der Informatik in Abgrenzung gegen andere Dis- ziplinen erkennbar zu machen.“ Einige Beispiele fundamentaler Ideen und die dazugeh¨ origen Kriterien sind in [Sch94] zu finden.
1.4 Programmiersprachen im Unterricht
Ein vieldiskutiertes Thema ist, welche Sprache sich f¨ ur den Unterricht am besten eignet.
[LGS06, Pal90] meint, dass der Lernerfolg von der Zeit abh¨ angt, die f¨ ur tats¨ achliches Program- mieren aufgewendet werden kann. Es sollte keine Zeit mit sprachspezifischen Eigenheiten und Syntaxproblemen “verschwendet“ werden. Geht es nach [LGS06, Mil93], hat eine Programmier- sprache f¨ ur Unterrichtszwecke einen einfachen Zugang. Sie sollte leicht erlernbar sein, eine klare Struktur haben und vielf¨ altig einsetzbar sein. Die Sprache hat eine einfache Syntax, einfaches I/O Handling, verst¨ andliche String-Manipulation, aussagekr¨ aftige Schl¨ usselw¨ orter und verst¨ andliches Feedback im Fehlerfall.
W¨ ahrend Pascal und Logo vor einigen Jahren noch oft im Unterricht zum Einsatz kamen, sind bei- de heute stark aus der Mode gekommen. Gr¨ unde daf¨ ur sind sicher die mangelnde Einsatzf¨ ahigkeit in der Industrie und die, so gut wie nicht m¨ ogliche, Verwendbarkeit der Sprache bei steigender Komplexit¨ at der Software.
Heute z¨ ahlen Sprachen wie C, Java und C++ zu den beliebtesten Programmiersprachen. Das ist an der Anzahl der verf¨ ugbaren Entwickler, Lehrg¨ ange und Dienstleister weltweit zu erkennen [TIO07]. Studien wie [dWT02], [Md03] und [SW98] belegen, dass Java, C++ und C die Spra- chen mit der gr¨ oßten Verbreitung an Universit¨ aten sind.
Trotz dieser Beliebtheit (oder gerade deswegen) wird viel ¨
uber die Tauglichkeit dieser Sprachen im Unterricht diskutiert, gerade wenn es um geeignete Sprachen f¨ ur Programmieranf¨ anger geht. Die oben genannten Sprachen werden als ¨
uberladen betrachtet. Die Studierenden plagen sich eher mit
der Notation, als mit dem tats¨ achlichen Algorithmen. [LGS06] erl¨ autert, dass die meisten Probleme von Programmierneulingen immer dasselbe Muster zeigen:
“[...] construct-based problems, which make it difficult to learn the correct semantics of language constructs, and plan composition problems, which make it difficult to put plans together correctly [...] students lack the skills needed to trace the execution of short pieces of code after taken their first course on programming.“ Im Zuge einer Studie an der finnischen Universit¨ at in Tampere ist eine Umfrage an europ¨ aischen Hochschulen durchgef¨ uhrt worden. 559 Studenten und 34 Lektoren an 6 verschiedenen Univer- sit¨ aten wurden unter anderem zu deren Schwierigkeiten beim Lernen und Lehren von Program- miersprachen befragt. Die daraus abgeleiteten Folgerungen besagen:
“the most difficult concepts to learn are the ones that require understanding larger entities of the program instead of just details [...] abstract concepts like pointers and memory handling are difficult to learn [...] However, the biggest problem of novice programmers does not seem to be the understanding of basic concepts but rather lear- ning to apply them.“[LAMJ05] Die Studenten haben Probleme, wenn es darum geht, den Gesamtumfang eines Programmes zu er- fassen und umzusetzen, dh. wie setze ich eine mir gestellte Aufgabe mit den Konzepten um, die ich gelernt habe. Dabei darf die Syntax einer Sprache nicht im Wege stehen, da sie daran hindert eine Probleml¨ osung zu finden und nur neue, andere Probleme schafft. Zeiger und Speichermanipulation z¨ ahlen zu den als sehr schwierig eingestuften Konzepten.
Die in diesem Kapitel zitierte Literatur deckt sich mit den Beobachtungen des Autors aus der ei-
genen Ausbildung und der Abhaltung eines C Tutoriums f¨ ur Programmieranf¨ anger. Die Studenten konnten genau wiedergeben, wie sie das Problem l¨ osen w¨ urden, doch konnten sie es nicht “zu Papier“ bringen, also als Quelltext wiedergeben. Die Syntax wurde als unnat¨ urlich und teilweise unverst¨ andlich empfunden. Manche syntaktische Eigenheiten sind f¨ ur den Tutor auch schwer zu erkl¨ aren, da die Studenten die dahinterliegenden Konzepte noch nicht verstehen k¨ onnen. Nahezu alle Fehler resultierten aus einem Fehler in der Syntax. Der Autor konnte dabei ein hohes Maß an Frustration und Demotivation der Studenten im Unterricht feststellen. Die Sinnhaftigkeit des Lehrinhaltes wurde weiters angezweifelt.
Die pers¨ onlichen Erkenntnisse des Autors und jene der obig angef¨ uhrten Literatur lassen Hand- lungsbedarf erkennen. Diese Arbeit wird im weiteren Verlauf diese Problematik behandeln und zwei Werkzeuge f¨ ur m¨ oglichst reibungsfreien und effektiven Unterricht vorstellen.
1.5 Grundlagen Python
Python ist eine dynamische ” High-Level“ Programmiersprache, die den interpretierten Skriptspra- chen zugeordnet und oft mit Perl, Ruby, Scheme oder Java verglichen wird. Sie wurde mit dem Ziel entwickelt, m¨ oglichst einfach und ¨ ubersichtlich zu sein, gleichzeitig aber nicht an Flexibilit¨ at und funktionaler Skalierbarkeit einb¨ ußen zu m¨ ussen.
Die Syntax ist sehr ¨
ubersichtlich gehalten, was unter anderem durch zwingende Einr¨ uckung des
1 def faculty(n):
2
3
4
5
Python arbeitet mit dynamischer Typverwaltung. Variablen haben somit keinen festen Typ. Anders als bei statischer Typverwaltung wie in Compilersprachen, wird der Typ zur Laufzeit und abh¨ angig vom Einsatz der Variable bestimmt. Das erspart dem Entwickler vieles an zus¨ atzlicher Arbeit, da der Quelltext, durch die Ersparnis der explizit anzugebenden Typinformation, ¨ ubersichtlicher und k¨ urzer wird. Weiters k¨ onnen Funktionen, die ja ohne Typinformation geschrieben sind, auf vielen verschiedenen Objekttypen wiederverwendet werden. Man spricht auch von Duck Typing: ” If it
looks like a duck and quacks like a duck, it must be a duck“
[DT00]. Die Kehrseite der Medaille sind nat¨ urlich Performanceeinbußen.[CG97], [Lej06], [GH]
In Programmiersprachen wie C oder C++ ist der Programmierer f¨ ur Speicherreservierung und Spreicherfreigabe selbst verantwortlich. Unter C wird das z.B. mit den Funktionen malloc() und free() durchgef¨ uhrt. Pythons Strategie hiezu hat den Namen ” Referenzz¨ ahler“ (reference counting). Das Prinzip ist einfach: jedes Objekt enth¨ alt einen Z¨ ahler, der mit jeder Referenz auf das Objekt inkrementiert wird. Wird eine Referenz wiederum gel¨ oscht, wird der Z¨ ahler dekrementiert. Erreicht dieser den Wert Null, kann der Speicher freigegeben werden.
2 Mit Python 2.5 sind das 31 Schl¨ usselw¨ orter. Zum Vergleich C/C++ mit 63 und Java mit 53 Schl¨ usselw¨ ortern.
Der Pythonentwickler ist an kein Programmierparadigma gebunden. Auch wenn Python sich als objektorientierte Sprache vorstellt, ist die Entwicklung mit verschiedenen Programmierstilen m¨ oglich. Das erlaubt Flexibilit¨ at bei der Erstellung von Programmen. Die Entwicklung ist durch die Sprache nicht an ein Paradigma gebunden, sondern kann das, f¨ ur die momentane Situation effizienteste Paradigma w¨ ahlen, eventuell sogar verschiedene Paradigmen anwenden. Das macht nat¨ urlich Python f¨ ur den Unterricht sehr interessant.
Die Python-Distribution wird mit einer Standardbibliothek in Form von Python-Modulen ausgelie- fert, die von der Community als ” batteries included“ bezeichnet wird. Die Komplexit¨ at wurde aus
der Sprache entfernt, die Spezialisierung liegt in den Bibliotheken. Das Spektrum reicht von Bi- bliotheken zur Graphical User Interface (GUI)-Gestaltung ¨ bis hin zu verteilten Systemen [Lin02]. Großes Augenmerk wird hierbei auf Webapplikations- entwicklung gelegt, die g¨ angigen Protokolle und Standards sind plattformunabh¨ angig verf¨ ugbar
3
. Findet der Entwickler die gew¨ unschte Funktionalit¨ at nicht in den Standardbibliotheken, kann er das gew¨ unschte Modul aus einer großen Sammlung von Drittanbietern w¨ ahlen. Die Module der Standardbibliothek k¨ onnen mit C oder Python erweitert werden, auf gleiche Art k¨ onnen eigene Module entwickelt werden.
1 import urllib 2 data = urllib.urlopen("http://www.technikum-wien.at/") 3 text = data.read() 4 data.close() Listing 2: Lesen einer Website durch Verwendung eines Moduls der Standardbibliothek
Python ist portierbar und somit plattformunabh¨ angig. Der Python Interpreter kann auf jeder be- liebigen Architektur installiert werden, wenn es daf¨ ur einen C Compiler gibt. Die popul¨ arsten Betriebssysteme mit verf¨ ugbaren Python Interpretern sind Linux, Berkeley Software Distribution (BSD), Mac OS X, Solaris und Microsoft Windows. F¨ ur diese gibt es auch sehr gut gewartete Bibliotheken.
Die Python Implementierung steht unter einer Open-Source Lizenz. Der Quelltext ist frei verwend-
bar und verteilbar, auch f¨ ur den kommerziellen Gebrauch. Die Python Lizenz 4 wird von der Python Software Foundation (PSF) 5 verwaltet. Hinter Python steht nat¨ urlich eine Open-Source Communi- ty, die regelm¨ aßig, aktiv und ambitioniert ihr Produkt verbessert. Jeder kann sich an der Entwick- lung beteiligen. Internationale Mailinglisten, Foren, Arbeitsgruppen und Konferenzen werden auf
den Internet-Seiten der Python Software Activity (PSA) 6 organisiert. Eine wichtige Rolle in der Entwicklung von Python tr¨ agt die Special Interest Group (SIG) 7 .
Es gibt zahlreiche Projekte, die mit Python am Markt und in der Industrie erfolgreich ihre Arbeit verrichten. Zu den gr¨ oßten Referenzen z¨ ahlen Firmen wie Google, Yahoo, National Aeronautics and Space Administration (NASA) und viele andere 8 .
Peter Norvig, ” director of search quality“ bei Google meint:
3 TCP/IP, FTP, NNTP, HTTP, POP, SMTP, MAPI, SGML, XML, CGI, ...
4 Python Lizenz: http://www.python.org/psf/license/ 5 Python Software Foundation: http://www.python.org/psf/ 6 Python Software Activity: http://www.python.org/psa/ 7 Special Interest Groups: http://www.python.org/community/sigs/ 8 Erfolgsgeschichten: http://www.python.org/about/success/
“Python has been an important part of Google since the beginning, and remains so as the system grows and evolves. Today, dozens of Google engineers use Python, and we’re looking for more people with skills in this language.“ Bei Google ist Python ein wichtiges Werkzeug; Google sucht immer wieder nach talentierten Ent- wicklern, in deren Portfolio Python zu finden ist.
Python ist zu einer bedeutenden Gr¨ oße in der Softwareindustrie geworden.
1.5.1 Geschichte und Entwicklung
Ihren Namen verdankt die Programmiersprache Python der britischen Comedy-Gruppe Monty Py- thon, nicht der gleichnamigen Schlangenart, wenngleich diese auch zu einem wesentlichen Be- standteil der Python Corporate Identity (CI) geworden ist.
Pythons Erfinder und momentaner Hauptbetreuer ist Guido van Rossum. Python basiert auf ABC, einer Programmiersprache, die in den achtziger Jahren verwendet wird. 1989 beginnt Van Rossum
mit der Entwicklung von Python am Centrum voor Wiskunde en Informatica (CWI) 9 in Amster- dam. Das Ziel ist, die H¨ urden, die ABC an der Weiterverbreitung hindern, zu ¨
uberwinden. ABC ist wie Pascal: eine gute Lehrsprache f¨ ur den Unterricht, aber in der Industrie nicht zu gebrau- chen. Ein Grund ist Unflexibilit¨ at, wenn es um Skalierbarkeit geht. So wird Python von Grund auf f¨ ur den Einsatz in der Ausbildung an Lehranstalten konzipiert. Hinzu kommen mehr fortge- schrittene M¨ oglichkeiten zur Softwareentwicklung, eine Standardbibliothek voller Erweiterungen und die leichte Ankn¨ upfbarkeit an andere Programmiersprachen (vor allem C), damit Python auch
außerhalb des Unterrichts Verwendung finden kann.[Wil02]
Abbildung 3: Ein߬ usse anderer Sprachen auf Python
Abbildung 3 zeigt eine kompakte ¨ ¨
Ubersicht zur Entstehung von Programmiersprachen im Allgemeinen ist auf [Pix01] zu finden. Python wird 1991 ver¨ offentlicht; die Entwicklung der ersten Version geht bis Python 1.6.1. Oktober 2000 wird Python 2.0 freigegeben, zum Zeitpunkt dieser Arbeit ist Python in Version 2.5 aktuell, welche seit September 2006 zur Verf¨ ugung steht. Momentan wird an Version 3.0 (Py3K, Python
10 Python 3000, Google Tech Talk, Guido van Rossum, 2006
Diese Arbeit greift nun den Versuch auf, die Popularit¨ at Pythons anhand einer Google Suche zu messen. Das ist keine sehr wissenschaftliche Messung, spiegelt aber doch eine gewisse Relevanz und vor allem deren Ver¨ anderung in den letzten Jahren, in der weltweit gr¨ oßten Suchmaschine
wider. Basis der Untersuchung sind die Ergebnisse aus dem Jahr 2002 von [Wil02]:
Tabelle 1: Google-Suche: Platzhalter-Sprache AND ( language OR code OR program). Zugriff auf http://www.google.com/ am 22.10.2006.
Tabelle 1 stellt die Ergebnisse einer Anfrage an die Suchmaschine Google dar. Dabei wird die ur- spr¨ ungliche Anfrage von [Wil02] aus dem Jahr 2002 mit der gleichen - nur zeitlich aktuelleren - Anfrage verglichen. Wie zu erkennen ist, ist die Anzahl der Treffer immens in die H¨ ohe geschnellt. Das kann in erster Linie durch die technologische und inhaltliche Entwicklung der Suchmaschine begr¨ undet werden, wie auch durch die Relevanz der einzelnen Suchanfragen.
Die hohe Trefferanzahl der Sprache C ist mit Vorsicht zu genießen, da angenommen werden kann, dass hier einige Treffer zu C++ mitgerechnet werden. Trotzdem steht C ungeschlagen an der Spit- ze dieser Auswertung, was auch nicht weiter verwunderlich ist. Nach wie vor wird C in der Sy- stemprogrammierung verwendet, Schnittstellen zu Anwendungsprogrammen sind typischerweise ebenso in C implementiert. Ein C-Compiler exisitiert f¨ ur eine Vielzahl an Plattformen. Gerade im rasant gewachsenen Embedded Systems Bereich ist C quasi Standard.
Die anderen Programmiersprachen sind interessant zu beobachten, wobei Python im Vergleich zu 2002 das gr¨ oßte Wachstum verbuchen kann und sich im Gesamtvergleich mit Anwendungsent- wicklungssprachen wie C++ oder Java durchaus messen kann. Im Vergleich der Skriptsprachen hat Perl vor Python die h¨ ohere Trefferanzahl.
Tabelle 2: Google-Suche: Platzhalter-Sprache AND ( (language OR code OR programm) AND ( education OR teaching)). Zugriff auf http://www.google.com/ am 22.10.2006.
1.5.2 High-Level-Sprache und Skriptsprache
High Level Language (HLL) nach [Fed96, Lin02]:
“A computer programming language that is primarily designed for, and syntactically oriented to, particular classes of problems and that is essentially independent of the structure of a specific computer or class of computers.“
Nach diesem Zitat ist eine HLL eine Programmiersprache, die unabh¨ angig von der Maschine ist. Programmiersprachen ab der dritten Generation z¨ ahlen zu den h¨ oheren Programmiersprachen oder High-Level-Languages. In der Literatur wird oft auch der Begriff “Systemsprache“ verwendet.
Eine HLL hat eine f¨ ur Menschen lesbare Syntax, die von einem Compiler oder Interpreter 1:n in Maschinensprache ¨ Instruktionen in Maschinensprache ausgedr¨ uckt wird. Assembler, z¨ ahlend zur zweiten Generation, ¨
ubersetzt 1:1 in Maschinensprache, die wiederum zur ersten Generation gez¨ ahlt wird.
Zwei verschiedene Programme verarbeiten eine HLL in Maschinensprache (Bin¨ arcode): Compiler und Interpreter. Ein Interpreter liest ein High-Level Programm und f¨ uhrt es aus. Die Analyse des Quelltextes erfolgt also zur Laufzeit des Programms.
Ein Compiler analysiert das Programm und ¨
wird. Der somit entstandene Code wird Objektcode genannt. Das Programm kann ohne weitere ¨
Ubersetzung wiederholt ausgef¨ uhrt werden.
Python wird zu den interpretierten Programmiersprachen gez¨ ahlt; Programme werden von einem Interpreter ausgef¨ uhrt. Es gibt hierbei zwei Varianten: den Kommandozeilenmodus und den Skript- modus. Im Kommandozeilenmodus werden Befehle Zeile f¨ ur Zeile eingegeben, der Interpreter gibt
11 Im Laufe der Arbeit werden immer wieder Quelltexte eingearbeitet. Dabei gibt es zwei Formen. Die interaktive Session einer Interpreter Shell und den Skriptmodus. Die Interpreter Sessions sind erkennbar an der typischen Python Eingabeaufforderung (engl. “prompt“), die durch drei aufeinanderfolgende spitze Klammern (>>>) symbolisiert wird. Die Eingabe ist dabei immer fett ausgepr¨ agt, die Ausgabe des Interpreters normal.
$ python
Python 2.4.4c1 (#1, Oct 13 2006, 12:10:43) Type "help", "copyright", "credits" or "license" for more information. >>> print 10 * 2
20
Im Skriptmodus wird das Programm in einem File gespeichert. Der Inhalt wird dann vom Inter- preter ausgef¨ uhrt.
Der Skriptmodus f¨ uhrt zum Begriff Skriptsprache. Wie zu Beginn des Kapitels erw¨ ahnt, wird Py-
thon den interpretierten Skriptsprachen zugeordnet. Eine Skriptsprache ist eine HLL, jedoch mit noch h¨ oherer Abstraktion zur Maschine. [Ous98] unterscheidet dabei Systemsprachen von Skript- sprachen wie folgt:
“Scripting languages are designed for different tasks than system programming lan- guages, and this leads to fundamental differences in the languages. System pro- gramming languages were designed for building data structures and algorithms from scratch, starting from the most primitive computer elements such as words of memory. In contrast, scripting languages are designed for gluing: they assume the existence of a set of powerful components and are intended primarily for connecting components to- gether. [...] Scripting languages are sometimes referred to as glue languages or system integration languages. [...] The growth of the Internet has also popularized scripting languages. The Internet is nothing more than a gluing tool.“ Skriptsprachen haben andere Aufgaben als “Systemsprachen“. Sie sind nicht darauf ausgelegt Da- tenstrukturen oder Algorithmen von Grund auf neu zu entwickeln, sondern als Bindeglied f¨ ur vor- handene Applikationen zu dienen. Skriptsprachen bedienen sich also anderer Komponenten, um daraus eine eigene Applikation entstehen zu lassen.
Den immer wieder kritisierten Geschwindigkeitsunterschied zu kompilierten Sprachen versuchen Skriptsprachen wie Python zu verbessern. So wird der Quelltext nicht direkt interpretiert, son- dern zuerst in den sogenannten “Bytecode“ umgewandelt. Dieser wird wesentlich schneller in- terpretiert. Wirklich Geschwindigkeitskritisches oder Rechenintensives wird in einer kompilierten Sprache geschrieben. Wie schon erw¨ ahnt, wird bei Python C verwendet. Weiters relativiert immer schnellere und billigere Hardware die Kritik an der Performance.
Einige weitere Eigenschaften von Skriptsprachen sind in diesem Kapitel schon erw¨ ahnt. Zur ¨
Ubersicht sei eine Darstellung in kompakter Form aufgelistet:
• noch “h¨ ohere“ Implementierung als eine typische HLL
• interpretiert
• dynamische Typverwaltung
• optimal f¨ ur schnelle Softwareentwicklung bzw. Prototyping [Lin02]
• hoher Re-Use Faktor
• leichter erlernbar als Systemsprachen
Weitere Beispiele f¨ ur Skriptsprachen sind Perl 12 oder Tcl 13 .
1.6 Grundlagen Zope
Zope 14 ist ein Applikations- und Backend Server Framework, das Entwicklern erlaubt, schnell Protokolle einzubinden, Applikationen (¨ ublicherweise webbasierte) zu entwickeln, und Konnex
Zope wird großteils mit Python entwickelt. Geschwindigkeitskritisches wird in C umgesetzt.
Ublicherweise wird die mit Zope mitgelieferte Zope Object Database (ZODB) verwendet, um transaktionssicher 15 (Python) Objekte zu persistieren. Zope ist mit der Zope Public Licence (ZPL) 16 , einer freien Softwarelizenz, verf¨ ugbar.
Momentan werden zwei stabile Zope Versionen von der Community gepflegt. Mit Oktober 2006 ist Zope 2.10 die letzte stabile Version der Zope 2 Generation. Zope 3.3 ist die letzte stabile Version des neuen Zope 3. Diese Arbeit konzentriert sich auf Zope 3, wobei zuerst einige Unterschiede zu Zope 2 aufzeigt werden sollen.
1.6.1 Zope 2
Bevor Zope ins Leben gerufen wird, entwickelt die Zope Corporation 17 (urspr¨ unglich Digital Crea- tions) 1996 das Produkt Bobo, ein in Python entwickelter Object-Publisher, welcher Entwicklern erlaubt, Python Objekte im Web abzubilden. Bobo ist weiters eine Objektdatenbank und ein Object
Request Broker (ORB), der Uniform Resource Locator (URL) in Objektpfade umwandelt. 1998 wird dieses Produkt als Open-Source unter dem Namen Zope ver¨ offentlicht.[Ric05a]
Zope 2 erfreut sich anfangs großer Beliebtheit durch die Through the Web (TTW) Entwicklung und Administration. Komplette Projekte k¨ onnen per Web entwickelt werden, ohne auch nur einmal eine Kommandozeile zu sehen. Die schnelle Projektabwicklung durch die Produktivit¨ at mit Python
plus die Zope Templatesprachen Document Template Markup Language (DTML) und Zope Page Templates (ZPT) mobilisieren viele Entwickler, ihre Projekte mit Zope umzusetzen.
Zope 2 hat jedoch mit einer Vielzahl von Problemen zu k¨ ampfen. Die anfangs, vor allem bei un-
erfahrenen Entwicklern, sehr beliebte TTW Entwicklung st¨ oßt schnell an Grenzen. So muss f¨ ur fortgeschrittenere Methoden, wie etwa das Verwenden von regul¨ aren Ausdr¨ ucken, das Zope 2 Si- cherheitssystem umgangen werden. Zope 2 TTW wird vom Framework aus Stabilit¨ atsgr¨ unden mit eingeschr¨ anktem Zugriff auf Pythonbibliotheken versehen. Mit Zope 3 gibt es hier keine Ein- schr¨ ankung, da Funktionalit¨ at mit Hilfe von Pythonpaketen implementiert wird. Innerhalb dieser Pakete kann auf die komplette Funktionalit¨ at Pythons zur¨ uckgegriffen werden. Das ist unter Zope
12 Perl: http://www.perl.com/
13 Tcl: http://www.tcl.tk/ 14 Zope: http://www.zope.org/ 15 siehe Maillinglisteneintrag “ZODB implementiert kein ACID“: https://mail.dzug.org/pipermail/zope/2007- June/003937.html 16 Zope Public Licence: http://www.zope.org/Resources/ZPL/ 17 http://www.zope.com/
2 auch m¨ oglich, nur ist die Dokumentation dazu schlecht zug¨ anglich und die Implementierung nur
mit einigen Tricks m¨ oglich. Listing 3 zeigt ein Beispiel dazu: wird das Initialisieren der Klasse in Zeile 27 vergessen, ist schnell und einfach eine potentielle Sicherheitsl¨ ucke produziert. Das Zope
2 Framework liefert dem Entwickler hierzu keine Hinweise oder Warnungen.
1 from Globals import DTMLFile, InitializeClass 2 from OFS.SimpleItem import SimpleItem 3 from OFS.PropertyManager import PropertyManager
4
5 class Contact(SimpleItem, PropertyManager):
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Listing 3: Typische Zope 2 Content Klasse
Um existierende Funktionalit¨ at zu erweitern, muss unter Zope 2 das sogenannte ” Monkey- Patching“ angewandt werden. Hierbei wird die urspr¨ ungliche Funktionalit¨ at zur Laufzeit ge¨ andert, ohne den Originalquelltext zu ver¨ andern. Eine gef¨ ahrliche Methodik, da der Monkey-Patch nach einer ¨
Anderung des Originalquelltextes, mit hoher Wahrscheinlichkeit nicht mehr funktional ist. Bei exzessiver Anwendung dieser Methodik kommt der Entwickler schnell in Teufels K¨ uche. Kon- kurrierende Monkey-Patches sind schwer nachvollziehbar, die Wartung wird somit teuer erkauft.
Auch die schlechte Trennung von Inhalt, Konfiguration und Pr¨ asentation tr¨ agt einen Teil dazu bei. Unter Zope 2 muss jede Instanz einer Klasse Attribute und Methoden bereitstellen, die Zope f¨ ur die
Interaktion im Framework ben¨ otigt. Das f¨ uhrt zu ¨ ein und erschwert nachtr¨ agliche Erweiterungen.[vW05b]
Trotzdem sind in den letzten Jahren hunderte von sogenannten Produkten unter Zope 2 ver¨ offentlich worden. Die Palette reicht von einfachen Erweiterungen, wie z.B. unterschiedli- che Datenbankadapter, Wikis, Blogs, bis zu e-Commerce L¨ osungen. Seine Praxistauglichkeit
18 WWF: http://www.wwf.at/
managementsysteme wie Plone 19 oder der Collaborative Portal Server (CPS) 20 st¨ utzen sich auf Zope.[M¨ ol05] F¨ ur mehr Literatur zu Zope 2 empfiehlt der Autor [MB02], [AL01].
1.6.2 Zope 3
Dieses Kapitel umfasst die allgemeinen Eigenschaften und Merkmale von Zope 3. Tiefergehende Informationen und Praxisbezug sind in Kapitel 3 zu finden.
Das Zope 3 Projekt wird im Februar 2001 ins Leben gerufen. Die Community spricht sich f¨ ur eine komplette Neuentwicklung des Frameworks aus, um die grundlegenden Schwierigkeiten mit Zope
2 auszumerzen. Seit Oktober 2005 ist Zope 3 auch f¨ ur den Produktionseinsatz freigegeben.
Die Komponentenarchitektur, als wichtigeste Neuerung, teilt die Zust¨ andigkeit f¨ ur Inhalt (Con- tent), Dienste (Utilities), Sichten (Views) und Adapter auf. Sie erm¨ oglicht es, Software in kleinen und wiederverwertbaren Bausteinen zu entwickeln. Ziel einer solchen Aufteilung ist vor allem die h¨ ohere Wartbarkeit der Software. Ein anderes Datenbank-Backend, oder ein neuer Skin f¨ ur eine Webapplikation soll keine Konsequenzen auf die tats¨ achliche Programmlogik haben. Außerdem wird f¨ ur eine gewisse ¨
Ubersicht und Ordnung durch Reduzierung der Komplexit¨ at gesorgt.
Auch die Wiederverwendung existierender Python-Komponenten aus den Bibliotheken gestaltet sich einfacher, als in der Vorg¨ angerversion. Das d¨ urfte helfen, die bisher vorhandene Spaltung zwischen Python- und Zope-Entwicklern zu ¨
uberwinden [vW05a].
Damit Komponenten austauschbar bleiben, m¨ ussen ihre Schnittstellen definiert sein. Daf¨ ur zust¨ andig sind Interfaces, die als Vertr¨ age f¨ ur die Komponenten fungieren. So ist es m¨ oglich, dass unterschiedliche Implementierungen f¨ ur ein Interface entwickelt werden k¨ onnen, da ein Interface nur das ” Was“ beschreibt, nicht aber das ” Wie“.
Zope 3 Komponenten kurz beschrieben:
Content Komponenten sind Datenobjekte. Die Daten sind anhand eines Schemas definiert. Ih- re einzige Aufgabe besteht darin, ihre Daten zu verwalten. Das erm¨ oglicht eine Zope- unabh¨ angige Weiterverwendung unter Python.
Utilities Utilities sind kontextunabh¨ angige Komponenten, die f¨ ur bestimmte Aufgaben im Frame- work zust¨ andig sind (z.B. Emailversand, Kodierung, Suche).
Adapter Adapter nutzen eine Komponente mit definiertem Interface, um ein neues Interface be- reitzustellen. Das erm¨ oglicht existierende Funktionalit¨ aten zu erweitern, ohne die Origina- limplementierung zu ver¨ andern.
Views sind Komponenten, die f¨ ur die Darstellung anderer Komponenten zust¨ andig sind. Views
19 Plone: http://www.plone.org/
20 CPS: http://www.cps-project.org/
Die Konfiguration des Frameworks und der Applikationen erfolgt bei Zope 2 im Quelltext selbst. Ver¨ anderungen der Konfiguration hat eine ¨
Anderung des Quelltextes zur Folge. Zope 3 Konfigu-
ration wird in seperaten Extensible Markup Language (XML)-Dateien abgelegt. Der verwendete Dialekt ist Zope Configuration Markup Language (ZCML).
Um Entwicklern und vor allem bestehenden Applikationen die Umstellung auf Version 3 zu erm¨ oglichen, wurde das Projekt Five (Zope 2 + Zope 3 = Five) ins Leben gerufen. Five ist ein Zope 2 Produkt, das einiges an Zope 3 Funktionalit¨ at zur Verf¨ ugung stellt. Zuk¨ unftige Zope 2 Versionen und Five werden langsam zu einer gemeinsamen Zope Version, basierend auf Zope 3, f¨ uhren.
Der Großteil der momentanen Zope Projekte basiert auf Version 2. Anhand des stark wachsenden
Interesses in den Communityforen und Mailinglisten 21 , und der stetig steigenden Anzahl an Zo- pe 3 Modulen im Zope Repository 22 , kann in Zukunft mit einer gr¨ oßeren Anzahl an Referenzen gerechnet werden. Ende 2006 sind folgende gr¨ oßere Projekte bekannt:
Schooltool 23 ist eine Applikation f¨ ur die Administration einer Schule. Launchpad 24 ist ein Framework rund um Opensource Produkte, wie die Linux Distribution Ubuntu 25 oder die Versionierungssoftware Bazaar 26 .
Weiterf¨ uhrende Zope 3 Literatur: [vW06], [Ric05a]
21 Zope Users Mailingliste: http://mail.zope.org/pipermail/zope3-users/
22 Zope Repository: http://svn.zope.org/ 23 Schooltool: http://www.schooltool.org/ 24 Launchpad: https://launchpad.net/ 25 Ubuntu: http://www.ubuntu.com/ 26 Bazaar: http://bazaar-vcs.org/
Quote paper:
Dominique Lederer, 2007, Python und Zope als Unterrichtswerkzeuge, Munich, GRIN Publishing GmbH
This text can be quoted and accessed from this url:
Embed
DOI
Formatvorlage (Microsoft Word) für eine Diplomarbeit, Masterarbeit, Ha...
Für MS Word 2003 - Update 2010
Presentations, Models, Tutorials, Instructions
Elaboration, 25 Pages
Formatvorlage (OpenOffice) für eine Diplomarbeit, Masterarbeit, Hausar...
Presentations, Models, Tutorials, Instructions
Elaboration, 35 Pages
Formatvorlage / Vorlage zur Erstellung einer Diplomarbeit, Bachelorarb...
Presentations, Models, Tutorials, Instructions
Elaboration, 15 Pages
Formatvorlage / Vorlage für eine Diplomarbeit / Hausarbeit
Für MS Word 2007 - dotx
Presentations, Models, Tutorials, Instructions
Elaboration, 25 Pages
Anleitung zum Erstellen schriftlicher Arbeiten: Der Aufbau einer wisse...
Presentations, Models, Tutorials, Instructions
Elaboration, 20 Pages
Erstellen einer schriftlichen Hausarbeit
Presentations, Models, Tutorials, Instructions
Termpaper, 14 Pages
Grundtechniken wissenschaftlichen Arbeitens
Bibliografieren - Reden - Schr...
Presentations, Models, Tutorials, Instructions
Script, 46 Pages
Ratgeber zur Erstellung wissenschaftlicher Arbeiten. Diplomarbeiten - ...
Presentations, Models, Tutorials, Instructions
Elaboration, 39 Pages
Dominique Lederer's text Python und Zope als Unterrichtswerkzeuge is now available as a printed book
Dominique Lederer has published the text Python und Zope als Unterrichtswerkzeuge
Dominique Lederer has uploaded a new text
0 comments