Upload
andreas-schreiber
View
8.504
Download
1
Embed Size (px)
DESCRIPTION
Vortrag auf der Python Users Group Köln (05.10.2009)
Citation preview
Folie 1Java Users Group Köln > Andreas Schreiber > Java und Python > 05.10.2009
Java und Python
Das Beste aus beiden Welten nutzen
Java Users Group Köln (05.10.2009, Köln)Andreas Schreiber <[email protected]>Deutsches Zentrum für Luft- und Raumfahrt e.V.http://www.dlr.de/sc
Folie 2Java Users Group Köln > Andreas Schreiber > Java und Python > 05.10.2009
Das DLR
Folie 3Java Users Group Köln > Andreas Schreiber > Java und Python > 05.10.2009
Das DLRDeutsches Zentrum für Luft- und Raumfahrt
ForschungseinrichtungRaumfahrt-Agentur Projektträger
Folie 4Java Users Group Köln > Andreas Schreiber > Java und Python > 05.10.2009
Köln
Lampoldshausen
Stuttgart
Oberpfaffenhofen
Braunschweig
Göttingen
Berlin-
Bonn
Trauen
Hamburg
Neustrelitz
Weilheim
Bremen-
Standorte und Personal
6.200 Mitarbeiterinnen und Mitarbeiter arbeiten in 29 Forschungsinstituten und Einrichtungen in
13 Standorten.
Büros in Brüssel, Paris und Washington.
Folie 5Java Users Group Köln > Andreas Schreiber > Java und Python > 05.10.2009
Leitbild - Mission
Erforschung der Erde und des Sonnensystems, Forschung zum Erhalt der Umwelt, zur Mobilität, zur Gewährleistung der Sicherheit und zur Bearbeitung gesellschaftlicher Fragen im öffentlichen Auftrag
Brückenfunktion von Grundlagenforschung und innovativen Anwendungen sowie Transfer von Wissen und Forschungsergebnissen zu Industrie und Politik durch Vermittlung, Beratung sowie Dienstleistungen
Gestaltung des deutschen Raumfahrtengagements und internationale Interessenvertretung als hoheitliche Aufgabe
Leistung eines signifikanten Beitrags zum Wissenschafts- und Wirtschaftsstandort Deutschland und zum europäischen Wachstumsraum
Ausbildung des wissenschaftlichen Nachwuchses zur Steigerung der Innovationsfähigkeit Deutschlands
Folie 6Java Users Group Köln > Andreas Schreiber > Java und Python > 05.10.2009
Einrichtung Simulations- und Softwaretechnik
Mission: Erarbeitung neuer Software-Technologien und Untersuchung der Relevanz für das DLREinführung neuer Software-Technologien in DLR-InstitutenEntwicklung eigener und Support externer Software-Produkte
Forschungsgebiete: Software Engineering, Verteiltes Rechnen, Integration, Daten- und Wissensmanagement, High-Performance Computing, Concurrent Engineering, VR
Mitarbeiter: ca. 30
Folie 7Java Users Group Köln > Andreas Schreiber > Java und Python > 05.10.2009
Software-Entwicklungim DLR
Folie 8Java Users Group Köln > Andreas Schreiber > Java und Python > 05.10.2009
Software-Entwicklung im DLRGrößenordnung
Über 1000 Mitarbeiter des DLR entwickeln Software
DLR ist eines der größten Software-Häuser Deutschlands
Das sind >100 Millionen EUR Personalkosten pro Jahr
Folie 9Java Users Group Köln > Andreas Schreiber > Java und Python > 05.10.2009
Software-Entwicklungen in Luft- und RaumfahrtKlassifizierung
Software für missionskritische SystemeEmbedded Software und Real-Time-Software in Flugzeugen, Satelliten, Raumfahrzeugen, …
Software mit großen UserzahlenInternet/Intranet/Email, Webshop für Satellitendaten
Software zur Unterstützung Prozessunterstützung, Datenmanagement, Modellierungs- und Simulationsumgebungen, …
Software deren Effizienz wichtig istNumerische Simulationscodes
Folie 10Java Users Group Köln > Andreas Schreiber > Java und Python > 05.10.2009
Folie 11Java Users Group Köln > Andreas Schreiber > Java und Python > 05.10.2009
The Right Tool for the Job
Folie 12Java Users Group Köln > Andreas Schreiber > Java und Python > 05.10.2009
JavaWarum wird Java verwendet?
Weite Verbreitung in vielen AnwendungsgebietenIndustrie, Forschung, Universitäten
Verfügbar auf vielen PlattformenGute Performance
Guter Garbage Collector (kein GIL)Viele viele Bibliotheken
z.B. für Datenbankzugriff, XML-Verarbeitung, Report/PDF-Generierung, Security, Benutzeroberflächen
Verfügbarkeit guter und umfangreicher Dokumentation für alle Aspekte der Java-Programmierung
Sehr gute EntwicklungswerkzeugeEclipse, NetBeans, IntelliJ IDEA, …
Folie 13Java Users Group Köln > Andreas Schreiber > Java und Python > 05.10.2009
Python Warum wird Python verwendet?
Sehr leicht zu erlernen und einfach zu benutzen
( = steile Lernkurve)
Rapid Application Development
( = kurze Entwicklungszeit)
„Inherent great maintainability“
def fakultaet(x): if x > 1: return x * fakultaet(x - 1) else: return 1
Folie 14Java Users Group Köln > Andreas Schreiber > Java und Python > 05.10.2009
Python in Forschung und Wissenschaft
Python ist verbreitet in Forschung und Entwicklung
Wissenschaftler und Ingenieure wollen eigentlich
keine Software entwickeln sondern ihre Probleme
lösen
Möglichst schnelles Umsetzen ihrer Ideen in
laufenden Code
Wenn sie Code schreiben, sollte es so einfach wie
möglich sein
“I want to design planes,
not software!”
Folie 15Java Users Group Köln > Andreas Schreiber > Java und Python > 05.10.2009
“Python has the cleanest, most-scientist- or engineer friendly syntax and semantics.
-Paul F. Dubois
Paul F. Dubois. Ten good practices in scientific programming. Comp. In Sci. Eng., Jan/Feb 1999, pp.7-11
Folie 16Java Users Group Köln > Andreas Schreiber > Java und Python > 05.10.2009
Das Beste aus beiden Welten nutzen
Großartige Libraries und Tool-Unterstützung Unschlagbar leicht zu
erlernende Sprach-Syntax
Folie 17Java Users Group Köln > Andreas Schreiber > Java und Python > 05.10.2009
Das Beste aus beiden Welten nutzen Embedded Scripting…
Es gibt viel ausgereifte Java-Software
Applikationen, Frameworks, Bibliotheken
Kommerzielle Software und Open Source Software
z.B. Das Eclipse Universum, Apache-Software, Portal-Frameworks, Workflow-Systeme, …
Häufig auftretende Use Cases
Integration von eingebetteten Skript-Interpretern in Java-Anwendungen
Benutzung von Java-Bibliotheken aus Python-Code
Folie 18Java Users Group Köln > Andreas Schreiber > Java und Python > 05.10.2009
Das Beste aus beiden Welten nutzen Integration von Python-Code in Java-Anwendungen…
Bestimmter Code existiert nur entweder für Java oder Python
Aufwand zur Neu-Implementierung kann sehr hoch sein
Für bereits sehr gut getestete Bibliotheken ist der Aufwand beträchtlich, ein vergleichbares Qualitätsniveau zu erreichen
Häufig auftretende Use Cases
Einfach ein Bibliothek in der jeweils „anderen“ Sprache nutzen
Spezielle die Nutzung von Python-Code aus Java-Anwendungen
Oder C/Fortran/WASAUCHIMMER-Code mit Python-Wrapper
Es ist schwieriger, C-Code für Java zu wrappen als für Python
Folie 19Java Users Group Köln > Andreas Schreiber > Java und Python > 05.10.2009
Tools zur Python-Java-Integration
Folie 20Java Users Group Köln > Andreas Schreiber > Java und Python > 05.10.2009
Tools zur Python-Java-IntegrationÜbersicht
Python von Java aus benutzen
Jython
JEPP
Java von Python aus benutzen
JPype
JCC
Interprozess-Kommunikation
CORBA
SOAP
Andere Remote Object Libraries
Python Interpreter
Python Interpreter
Java Virtual Machine (JVM)
Java Code(Anwendung)Java Code
(Anwendung)
JEPPJEPP
JNI
Python Code
Python Code JPypeJPype
JythonJython
Python Code
Python Code
Interface/P
roto
koll
Python Code
Python Code
Python Code
Python Code
Folie 21Java Users Group Köln > Andreas Schreiber > Java und Python > 05.10.2009
Nutzung von Python aus Java-Anwendungen
Use Cases
Die Anwendung soll eingebettete Skripting-Funktionalität haben
Die Anwendung soll einen externen Python-Code nutzen
Die Applikation soll einen externen Code mit Python-Schnittstelle nutzen
C, C++, Fortran, …
Tools
Jython
JEPP
Folie 22Java Users Group Köln > Andreas Schreiber > Java und Python > 05.10.2009
Java Virtual Machine
Jython
Vollständige Neu-Implementierung des Python-Interpreters in 100% Java
Python-Code wird in der Java VM ausgeführt
Website: http://www.jython.org
Letzte Version: Jython 2.5.1 (26.09.2009)
JythonJython
Python Code
Python Code
Java Application
Code
Java Application
Code
Folie 23Java Users Group Köln > Andreas Schreiber > Java und Python > 05.10.2009
JythonCode-Beispiel 1: Java Code
Ausführen von Python-Code
import org.python.util.PythonInterpreter ;import org.python.core.*;class TestClass { public static void main(String[] args) { try { org.python.util.PythonInterpreter python = new org.python.util.PythonInterpreter (); python.execfile("python_script.py"); } catch (Exception e) { System.out.println(“Some error!"); }}
Folie 24Java Users Group Köln > Andreas Schreiber > Java und Python > 05.10.2009
JythonCode-Beispiel 2: Python Code
Swing
from javax.swing import *
frame = JFrame("Hello Jython")label = JLabel("Hello Jython!", JLabel.CENTER)frame.add(label)frame.setDefaultCloseOperation(
JFrame.EXIT_ON_CLOSE)frame.setSize(200, 100)frame.show()
Folie 25Java Users Group Köln > Andreas Schreiber > Java und Python > 05.10.2009
JEPPJava Embedded Python
Einbettung des CPython-Interpreters über das Java Native Interface (JNI) in Java
Python-Code wird im CPython-Interpreter ausgeführt
Website: http://jepp.sourceforge.net/
Python Interpreter
Java Virtual Machine
Java Application Code
Java Application Code
Python Code
Python Code
JNI
JEPPJEPP
Folie 26Java Users Group Köln > Andreas Schreiber > Java und Python > 05.10.2009
JEPPCode-Beispiel
Ausführen (“evaluate”) von Python-Befehlen
Ausführen eines Python-SSkripts
Jep jep = new Jep(false, SCRIPT_PATH, cl);jep.eval("print 'hello'");jep.close();
Jep jep = new Jep(false, SCRIPT_PATH, cl);jep.runScript(SCRIPT_PATH + file);jep.close();
Folie 27Java Users Group Köln > Andreas Schreiber > Java und Python > 05.10.2009
Nutzung von Java aus Python-Anwendungen
Use Cases
Die Anwendung soll eine externe Java-Applikation nutzen
Die Anwendung soll eine Java-Bibliothek nutzen
Tools
JPype
JCC
Folie 28Java Users Group Köln > Andreas Schreiber > Java und Python > 05.10.2009
Python Interpreter
JNI
JPypeJPype
Python Application Code
Python Application Code
Java Virtual Machine
Java ApplicationCode
Java ApplicationCode
JPypeJava to Python Integration
Verbindung über die Native Interfaces der Java VM und des Python-Interpreters
Startet eine Java Virtual Machine
Website: http://jpype.sourceforge.net
Folie 29Java Users Group Köln > Andreas Schreiber > Java und Python > 05.10.2009
JPypeCode-Beispiel (1)
„Hello World“
from jpype import *# Start JVMstartJVM (path to jvm.dll, "-ea")# Print "Hello World"java.lang.System.out.println("Hello World")# Shutdown JVMshutdownJVM()
Folie 30Java Users Group Köln > Andreas Schreiber > Java und Python > 05.10.2009
JPypeCode-Beispiel (2)
Aufruf einer Java-Methode aus Python
import jpype# Start JVMjpype.startJVM(path to jvm.dll, "-ea")# Create reference to java packagejavaPackage = jpype.JPackage("JavaPackageName")# Create reference to java classjavaClass = javaPackage.JavaClassName# Create instance of java classjavaObject = javaClass()# Call java methodsjavaObject.JavaMethodName()# Shutdown JVMjpype.shutdownJVM()
Folie 31Java Users Group Köln > Andreas Schreiber > Java und Python > 05.10.2009
JCCPyLucene's Code Generator
C++ Code-Generator zum Aufruf von Java aus C++/Python
C++ Objekte zum Wrappen von Java-Bibliotheken über JNI
Generiert komplette CPython-Extensions
Unterstützt werden Mac OS X, Linux, Solaris and Windows
C++-Compiler ist notwendig
Website: http://lucene.apache.org/pylucene/jcc
Teil von PyLucene
Python Interpreter
JNI
PythonCode
PythonCode
Java Virtual Machine
Java ApplicationCode
pythonExtension()
Java ApplicationCode
pythonExtension()
Generated C++Wrapper CodeGenerated C++Wrapper Code
JCC CodeGeneratorJCC CodeGenerator
Folie 32Java Users Group Köln > Andreas Schreiber > Java und Python > 05.10.2009
JCCCode-Beispiel
Notwendig: Initialisierung einer VM
import jcc# Start JVMjcc.initVM(maxheap=‘2000m’, …)
Folie 33Java Users Group Köln > Andreas Schreiber > Java und Python > 05.10.2009
JCC Code-BeispielNutzung von PyLucene: Durchsuchen des Lucene Index
Suche nach „Query“ in Verzeichnis „index“
from lucene import QueryParser, IndexSearcher, StandardAnalyzer, FSDirectory, Hit, VERSION, initVM, CLASSPATH
initVM(CLASSPATH)directory = FSDirectory.getDirectory(“index”, False)searcher = IndexSearcher(directory)analyzer = StandardAnalyzer()command = raw_input("Query:")query = QueryParser("contents", analyzer).parse(command)hits = searcher.search(query)for hit in hits: doc = Hit.cast_(hit).getDocument() print 'path:', doc.get("path"), 'name:', doc.get("name")searcher.close()
Folie 34Java Users Group Köln > Andreas Schreiber > Java und Python > 05.10.2009
Interprozess-Kommunikation
Interprozess-Kommunikation (IPC) Datenaustausch zwischen unterschiedlichen Prozessen auf einem oder mehreren, über Netzwerk verbundenen, Computerns
Typische IPC-Techniken Remote Procedure Calls (RPC)Message Passing
Die meist verwendeten APIsObject Request Broker (ORB)Web-Services-Protokolle basierend auf XML
Nachteil: Zusätzliche Services sind notwendigz.B. ein Directory Service zur Registrierung und Lokation von entfernten Objekten
Naming Service für CORBAUniversal Description, Discovery and Integration (UDDI) für Web Services
Folie 35Java Users Group Köln > Andreas Schreiber > Java und Python > 05.10.2009
Java Virtual Machine
GeneratedJava Code
(Stub)
GeneratedJava Code
(Stub)
Python Interpreter
Object Request Broker (ORBs)CORBA
OR
B
Python Application
Code(Server)
Python Application
Code(Server)
Generated Python Code
(Skeleton)
Generated Python Code
(Skeleton)
JavaApplication
Code(Client)
JavaApplication
Code(Client)
IDL CompilerIDL Compiler
IDLIDL
Folie 36Java Users Group Köln > Andreas Schreiber > Java und Python > 05.10.2009
CORBA-Implementierungen für Python
Fnorb
Reine Python-Implementierung, funktioniert mit CPython und Jython
Leichtgewichtige CORBA-Implementierung
Interoperabel mit dem Standard-ORB von Java
Die Entwicklung von Fnorb wurde eingestellt
omniORB
ORB-Implementierung für C++ und Python, kann von CPython benutzt werden
Der Python ORB (omniORBpy) benutzt die C++-Implementierung von omniORB.
omniORB wird aktiv weiterentwickelt mit regelmäßigen Releases
Website: http://omniorb.sourceforge.net
Folie 37Java Users Group Köln > Andreas Schreiber > Java und Python > 05.10.2009
CORBA-BeispielInterface
Hello World Interface in Interface Definition Language (IDL)
module HelloWorld {
const string Message = "Hello CORBA World!";
interface Hello {string hello_world();
};};
Folie 38Java Users Group Köln > Andreas Schreiber > Java und Python > 05.10.2009
CORBA-BeispielPython Server (Fnorb): Implementierung des Interfaces
# Standard/built-in modules.import sys# Fnorb modules.from Fnorb.orb import BOA, CORBA# Stubs and skeletons generated by 'fnidl'.import HelloWorld, HelloWorld_skel
class HelloWorldServer(HelloWorld_skel.Hello_skel): """ Implementation of the 'Hello' interface. """
def hello_world(self): print HelloWorld.Message return HelloWorld.Message
Folie 39Java Users Group Köln > Andreas Schreiber > Java und Python > 05.10.2009
CORBA-BeispielPython Server (Fnorb): Main Function
def main(argv): # Initialise ORB and BOA orb = CORBA.ORB_init(argv, CORBA.ORB_ID) boa = BOA.BOA_init(argv, BOA.BOA_ID) # Create object reference obj = boa.create('fred', HelloWorldServer._FNORB_ID) # Create an instance of the implementation class. impl = HelloWorldServer() # Activate the implementation boa.obj_is_ready(obj, impl) # Write the stringified object reference to a file open('Server.ref', 'w').write(orb.object_to_string(obj)) boa._fnorb_mainloop() # Start the event loop return 0
Folie 40Java Users Group Köln > Andreas Schreiber > Java und Python > 05.10.2009
CORBA-Beispiel Java Client
public class Client { public static void main ( String args[] ) { java.util.Properties props = System.getProperties(); try { org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args,props); org.omg.CORBA.Object obj = null; java.io.BufferedReader in = new java.io.BufferedReader( new java.io.FileReader(“Server.ref")); String ref = in.readLine(); obj = orb.string_to_object(ref); Hello hello = HelloHelper.narrow(obj); hello.hello_world(); orb.destroy(); } catch (Exception e) { e.printStackTrace(); }}
Folie 41Java Users Group Köln > Andreas Schreiber > Java und Python > 05.10.2009
Web ServicesSOAP
Java Virtual Machine
Servlet Container
JavaApplication
Code(Server)
JavaApplication
Code(Server)
Python Interpreter
Generated Python Code
(Stub)
Generated Python Code
(Stub)
Python Application
Code(Client)
Python Application
Code(Client)
GeneratedJava Code(Skeleton)
GeneratedJava Code(Skeleton)
WSDL CompilerWSDL Compiler
WSDLWSDL
Folie 42Java Users Group Köln > Andreas Schreiber > Java und Python > 05.10.2009
Web ServicesSOAP
Java
Gute Unterstützung
Java API for XML-Based Web Services (JAX-WS)
Gute Referenz-Implementierung
Python
Mittelmäßige bis schlechte Unterstützung
Zolera SOAP Infrastructure (ZSI)
Einzige SOAP Bibliothek für Python, die halbwegs nutzbar ist
Folie 43Java Users Group Köln > Andreas Schreiber > Java und Python > 05.10.2009
Weitere Remote Object Libraries
Python Remote Objects (Pyro)
Pyro ist ähnlich zu Java's Remote Method Invocation (RMI)
Sehr einfach und portabel, funktioniert mit Jython
Hat einen eigenen Naming Service
omniORB wird aktiv weiterentwickelt mit regelmäßigen Releases
Simple Python Interface to Remote Objects (SPIRO)
SPIRO implementiert einen ORB uns dient zur Kommunikation zweischen CPython und Jython
Die Entwicklung von SPIRO wurde eingestellt
Folie 44Java Users Group Köln > Andreas Schreiber > Java und Python > 05.10.2009
Beispiele
Folie 45Java Users Group Köln > Andreas Schreiber > Java und Python > 05.10.2009
BeispielQF-Test – Automatisiertes Test von GUIs
Folie 46Java Users Group Köln > Andreas Schreiber > Java und Python > 05.10.2009
BeispielTENT – Software Integration and Workflow Management
Folie 47Java Users Group Köln > Andreas Schreiber > Java und Python > 05.10.2009
Use Cases für Python-Scripting (1)
Steuern und kontrollieren des Programms durch Benutzerskripte
Beispielsweise für komplexe Parametervariationen oder die Steuerung multidisziplinärer gekoppelter Simulationen
Automatisierung sich wiederholender Aufgaben
Meistens wird das „Makro“-Aufzeichnung und –Abspielung genannt
Erweiterung der Benutzeroberfläche
Beispielsweise durch zusätzliche problemangepasste Dialoge oder sonstige Erweiterungen
Für Java muss die Skriptsprache die GUI-Bibliotheken nutzen können (AWT, Swing, SWT)
Integration zusätzlicher Legacy-Applikationen
Wichtig und verbreitet bei Integrations- und Workflow-Systemen
End-Anwender können externe Codes ohne Änderung des Java-Programme selber integrieren
Folie 48Java Users Group Köln > Andreas Schreiber > Java und Python > 05.10.2009
Use Cases für Python-Scripting (2)
Interaktives Experimentieren und Debuggen des Java-Programms
Leicht machbar mit einem eingebettete interaktiven Interpreter
Erlaubt Endanwendern und Entwickler das Debuggen und Analysieren des Java-Programms zu Laufzeit
Erzeugen automatischer Tests zur Qualitätssicherung
Aufzeichnen der Benutzeraktionen zur Laufzeit in Form eines Python-Skripts („Journaling“)
Editieren und Verallgemeinern des aufgezeichneten Skripts
Wieder-Abspielen des Skript entweder manuelle oder automatisch
Folie 49Java Users Group Köln > Andreas Schreiber > Java und Python > 05.10.2009
Beispiel: Codes mit Python-SchnittstellenNumerische Simulations-Software in C++ bzw. Fortran
Beispiele für hochauflösende CFD-Löser mit Python-Schnittstellen
DLR TAU-Code (http://www.dlr.de/as)
ONERA elsA-Code (http://elsa.onera.fr)
Integration in Java-Workflow-Systeme über die vorgestellten Techniken
EurofighterEurofighterX-31X-31
Folie 50Java Users Group Köln > Andreas Schreiber > Java und Python > 05.10.2009
DataFinder
Datenmanagement-System
Für Daten aus
Simulationen
Experimenten
Erdbeobachtung
Programmiersprache
Python
GUI-Toolkit Qt
Folie 51Java Users Group Köln > Andreas Schreiber > Java und Python > 05.10.2009
DataFinder-Erweiterung mit Java-Bibliotheken (1)Grid Application Toolkit (GAT)
Nutzung von Grid-Ressourcen
Entwickelt durch Albert-Einstein Institut (MPI für Gravitationsphysik) und Vrije Universiteit Amsterdam
Implementiert in Java (JavaGAT)
Anbindung anDataFinder überJPype
Folie 52Java Users Group Köln > Andreas Schreiber > Java und Python > 05.10.2009
DataFinder-Erweiterung mit Java-Bibliotheken (1)Provenance-Aufzeichnung
Aufzeichnung von Provenance-Daten
Aufzeichnung von Prozessinformationen zur Laufzeit des Prozesses
Zur Ermittlung von
Ursprung der Daten
Konformität des (Daten-) erzeugenden Prozesses
Provenance-Software implementiertin Java
Server
Client-Bibliothek
Anbindung überJPype
Provenance System
ProvenanceStore
ManagementInterface
QueryInterface
RecordingInterface
Processing Services
Management UIs Presentation UIs
Application Services· Simulation Codes· Workflows· Grid Services
· Provenance Analysis· Process Tracking· Result Validation
· Visualisation· Process Evaluation
Folie 53Java Users Group Köln > Andreas Schreiber > Java und Python > 05.10.2009
Interaktionen:
Konfiguration
Prozessablauf
Monitoring
Datentransfer
BeispielProvenance-Informationen in Simulations-Workflows
Processcontrol File-Server
Pre-Processing
Parametervariation
Simulation Visualization
i0
i1 i2
i3
i4
m1
d1
d2
c1 c-1c2 c-2 c3 c-3
c4c-4
Relationen:- r0: i0 causes i1- r1: i1 causes i2- r2: i2 causes i3- r3: i2 causes i4- r4: i3 causes i2- r5: i2 causes m1- r6: i2 causes d1- r7: i0 causes d2
Status Akteur
Folie 54Java Users Group Köln > Andreas Schreiber > Java und Python > 05.10.2009
Hinweise
Folie 55Java Users Group Köln > Andreas Schreiber > Java und Python > 05.10.2009
pyCologneDie Python User Group Köln
Monatliche Treffen von Python-Interessierten aus dem Großraum Köln
Treffen an jedem 2. Mittwoch im Monat
Beginn: 18:30 Uhr
Ort: Benutzerrechenzentrum der Universität zu Köln
(Berrenrather Strasse 136, Köln)
Informationen über pyCologne
Internet: http://www.pycologne.de
Twitter: http://twitter.com/pycologne
Mailingliste:https://lists.uni-koeln.de/mailman/listinfo/python-users
Folie 56Java Users Group Köln > Andreas Schreiber > Java und Python > 05.10.2009
Fragen?Fragen?
KontaktKontakt
www.andreas-schreiber.netwww.andreas-schreiber.net
twitter.com/onyametwitter.com/onyame
[email protected]@dlr.de