From 6a9103ea0cc52d4c752ff0ac5d5e88a2d4bcd425 Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Wed, 13 Aug 2008 03:48:35 +0000 Subject: foo --- LaTeX/bib/references.bib | 7 +- LaTeX/chapters/conclusion.tex | 12 +- LaTeX/chapters/implementierung.tex | 55 +- LaTeX/diplomarbeit.pdf | 1957 +++++++++++++++++++----------------- 4 files changed, 1052 insertions(+), 979 deletions(-) diff --git a/LaTeX/bib/references.bib b/LaTeX/bib/references.bib index d3720b8..99e8b7c 100644 --- a/LaTeX/bib/references.bib +++ b/LaTeX/bib/references.bib @@ -1,7 +1,8 @@ -@misc{Games, author="David Brackeen", title="", year= 2003, howpublished="Developing Games in Java", note="ISBN-13: 978-1592730056" } +@book{Games, author="David Brackeen", title="Developing Games in Java", year= 2003, note="ISBN-13: 978-1592730056" } +@book{Tanenbaum, author={Andrew Tanenbaum}, year={2003}, title={Verteilte Systeme - Grundlagen und Paradigmen}, note={2. Autor Marten van Steen; ISBN: 3-8273-7057-4} } +@book{Regexp, author={Jeffrey Friedl}, year={2006}, title={Mastering Regular Expressions}, note={ISBN-13: 978-0596528126}} @misc{OOS, author={Prof. Heinrich Fassbender}, year={2006}, howpublished={Vorlesung Objektorientierte Softwareentwicklung an der FH Aachen}, note={} } @misc{Richtlinien, author={Prof. Heinrich Fassbender}, year={2008}, howpublished={Programmierrichtlinien an der FH Aachen}, note={http://www.fassbender.fh-aachen.de/Downloads/OOS/Programmierrichtlinien.pdf} } -@misc{Tanenbaum, author={Andrew Tanenbaum}, year={2003}, howpublished={Verteilte Systeme - Grundlagen und Paradigmen}, note={2. Autor Marten van Steen; ISBN: 3-8273-7057-4} } @misc{Vorlesung, author={Prof. Martin Omann}, year={2007}, howpublished={Vorlesung Verteilte Systeme an der FH Aachen}, note={Mitschrift: ftp://ftp.buetow.org/pub/studium/FHAC\_VS-SS07/Mitschrift/verteilte-systeme.pdf} } +@misc{M32, author={Prof. Martin Omann}, howpublished={M32 CPU Simulator}, note={http://www.ossmann.fh-aachen.de} } @misc{Javadoc, howpublished={Java Platform Standard Edition 6 Javadoc, http://java.sun.com/javase/6/docs/api/}} -@misc{Regexp, author={Jeffrey Friedl}, year={2006}, howpublished={Mastering Regular Expressions}, note={ISBN-13: 978-0596528126}} diff --git a/LaTeX/chapters/conclusion.tex b/LaTeX/chapters/conclusion.tex index 5806e03..75ac839 100644 --- a/LaTeX/chapters/conclusion.tex +++ b/LaTeX/chapters/conclusion.tex @@ -2,22 +2,22 @@ Es wurde erfolgreich ein Simulator fr die Simulation verteilter Systeme entwickelt. Der Simulator hat bereits 10 implementierte Protokolle zur Auswahl eingebaut. Zudem steht dem Anwender ein sehr komfortables Protokoll-API zur Verfgung, womit der Entwicklung neuer Protokolle quasi keine Grenzen gesetzt sind. -Darber hinaus verfgt der Simulator ber eine Vielzahl von sehr flexiblen Einstellungsmglichkeiten. Fr jede Simulation lassen sich somit komplett andere Konfigurationen verwenden. Jeder beteiligte Prozess hat wiederum eigene lokale Einstellungen, wo sich auch jedes Protokoll fr jeden Prozess separat einstellen lt. Die Anzahl und Flexibilitt der Mglichen Szenarien wird dadurch um einen sehr groen Faktor erweitert. +Darber hinaus verfgt der Simulator ber eine Vielzahl von sehr flexiblen Einstellungsmglichkeiten. Fr jede Simulation lassen sich somit komplett andere Konfigurationen verwenden. Jeder beteiligte Prozess hat wiederum eigene lokale Einstellungen, wo sich auch jedes Protokoll fr jeden Prozess separat einstellen lsst. Die Anzahl und Flexibilitt der mglichen Szenarien wird dadurch um einen sehr groen Faktor erweitert. -Mit dem Ereigniseditor gibt es eine komfortable Mglichkeit eigene Szenarien zu programmieren um sie anschlieend zu Simulieren. Hierbei kann entweder auf die bereits enthaltenen Protokolle- oder auf selbst implementierte Protokolle zugegriffen werden. Alle Dazugehrigen Einstellungen und programmierten Ereignisse lassen sich vom Anwender fr eine sptere Wiederverwendung plattformunabhngig abspeichern. Somit knnen auch abgespeicherte Szenarien beispielsweise an Kommilitonen weitergegeben werden oder fr eine sptere Prsentierung zwischengespeichert werden. Mit dem Logfilter lassen sich mit Hilfe von regulren Ausdrcken nur die relevanten Lognachrichten anzeigen, was die Analyse einer Simulation erheblich vereinfacht. Weitere Funktionalitten wie Lamport- und Vektor-Zeitstempel sowie Anti-Aliasing runden den Simulator ab. +Mit dem Ereigniseditor gibt es eine komfortable Mglichkeit eigene Szenarien zu programmieren und um sie anschlieend zu Simulieren. Hierbei kann entweder auf die bereits enthaltenen Protokolle oder auf selbst implementierte Protokolle zugegriffen werden. Alle dazugehrigen Einstellungen und programmierten Ereignisse lassen sich vom Anwender fr eine sptere Wiederverwendung plattformunabhngig abspeichern. Somit knnen auch abgespeicherte Szenarien beispielsweise an Kommilitonen weitergegeben werden oder fr eine sptere Prsentierung zwischengespeichert werden. Mit dem Logfilter lassen sich mit Hilfe von regulren Ausdrcken nur die relevanten Lognachrichten anzeigen, was die Analyse einer Simulation erheblich vereinfacht. Weitere Funktionalitten wie Lamport- und Vektor-Zeitstempel sowie Anti-Aliasing runden den Simulator ab. Durch den objektorientierten Aufbau ist der Simulator relativ einfach erweiterbar, was nicht nur das Protokoll-API betrifft. Insgesamt wurde an den meisten Stellen darauf geachtet, dass zu einem sp\"{a}teren Zeitpunkt Erweiterungen einflieen k\"{o}nnten. Insbesondere soll die Serialisierung von Objekten r\"{u}ckw\"{a}rtskompatibel bleiben, da sonst bei jeder neuen Simulatorversion alle Simulationen erneut angelegt und abgespeichert werden m\"{u}ssten. -Htte fr diese Diplomarbeit noch mehr Zeit zur Verfgung gestanden, dann knnten einige der folgenden Funktionen (hier in alphanumerisch sortierten Reihenfolge aufgelistet) auch eingebaut worden sein: +Htte fr diese Diplomarbeit noch mehr Zeit zur Verfgung gestanden, dann h\"{a}tten einige der folgenden Funktionen (hier in alphanumerisch sortierten Reihenfolge aufgelistet) auch Einzug erhalten k\"{o}nnen: \begin{itemize} \item Die M\"{o}glichkeit Protokolle zu entwickeln ohne den kompletten Quelltext des Simulators vorliegen zu haben. Protokollklassen also als separate Bibliothek einbinden, die dynamisch geladen werden k\"{o}nnen. \item Die Simulationsdauer beliebig lang machen knnen. Dazu msste \textit{VSSimulatorVisualisation} entlang der Zeitachse scrollbar gemacht werden, so dass der Benutzer fr eine nachtrgliche Betrachtung des Simulationsverlaufes zu jeder beliebigen Position zurckspringen kann. \item Eine Zoomfunktion fr die Simulationsvisualisierung einbauen. - \item Im Ereigniseditor selbst auch periodische Ereignisse programmierbar machen. Bisher kann nur jedes Ereignis separat programmiert werden oder auf Protokoll-Interne Wecker zurckgegriffen werden. + \item Im Ereigniseditor selbst auch periodische Ereignisse programmierbar machen. Bisher kann nur jeder Ereigniseintritt separat programmiert werden oder auf Protokoll-Interne Wecker zurckgegriffen werden. \item Lamport- und Vektor-Zeitstempel als Ereigniseintrittskriterien verwenden knnen. \item Tiefere Schichten des OSI-Referenzmodells simulieren knnen, wie zum Beispiel TCP, UDP, IP, ... - \item Weitere Funktionalitten einbauen wie zum Beispiel das Anklicken einer Nachrichtenlinie, was zu einer Nachricht alle verfgbaren Informationen anzeigt und diese gegebenenfalls vom Benutzer editiert werden knnen. + \item Weitere Funktionalitten einbauen, wie zum Beispiel das Anklicken einer Nachrichtenlinie, was zu der jeweiligen Nachricht alle verfgbaren Informationen anzeigt und welche gegebenenfalls vom Benutzer editiert werden knnen. \end{itemize} -Da der Simulator hchstwahrscheinlich unter einer Open Source Lizenz freigegeben wird, und ich mich selbst sehr fr die Entwicklung und Anwendung von Open Source Software interessiere, werden die einen oder anderen Funktionen nachtrglich eingebaut werden. Kommilitonen werden auch herzlich dazu eingeladen sein sich an diesem Software-Projekt zu beteiligen. Als Vorbild sei hier der CPU-Simulator M32, der von Prof. Omann an der Fachhochschule Aachen entwickelt wurde, genannt. Hier existieren bereits einige Erweiterungen und Verbesserungen der Ursprungsversion, die von den Studenten angefertigt wurden. Fr die Entwicklung/Erweiterung wurde keine proprietre Software verwendet, so dass jeder kostenlosen Zugriff auf die dazugehrigen Tools htte. +Da der Simulator hchstwahrscheinlich unter einer Open Source Lizenz freigegeben wird, werden die einen oder anderen Funktionen nachtrglich eingebaut werden. Kommilitonen werden auch herzlich dazu eingeladen sein sich an diesem Software-Projekt zu beteiligen. Als Vorbild sei hier der CPU-Simulator M32 \cite{M32}, der von Prof. Omann an der Fachhochschule Aachen entwickelt wurde, genannt. Hier existieren bereits einige Erweiterungen und Verbesserungen der Ursprungsversion, die von den Studenten angefertigt wurden. Fr die Entwicklung des VS-Simulators wurde keine proprietre Software verwendet, so dass jeder kostenlosen Zugriff auf die dazugehrigen Tools htte. diff --git a/LaTeX/chapters/implementierung.tex b/LaTeX/chapters/implementierung.tex index 2183e07..d7cb899 100644 --- a/LaTeX/chapters/implementierung.tex +++ b/LaTeX/chapters/implementierung.tex @@ -534,9 +534,9 @@ Wenn eine Simulatorversion versucht eine abgespeicherte Simulation eines nicht i \section{GUI sowie Simulationsvisualisierung} -Das Paket \textit{simulator} (vereinfacht auf Abbildung \ref{fig:PackageProtocols}. dargestellt) implementiert die eigentliche graphische Benutzeroberflche des Simulators. Ausnahmen sind die Editorklassen in \textit{prefs.editors} sowie \textit{utils.VSFrame}. +Das Paket \textit{simulator} (vereinfacht auf Abbildung \ref{fig:PackageProtocols}. dargestellt) implementiert die eigentliche graphische Benutzeroberflche des Simulators. Ausnahmen stellen die Editorklassen in \textit{prefs.editors} sowie \textit{utils.VSFrame} dar. -Beim Starten des Simulators wird auf die Main-Methode, welche sich in \textit{VSMain} befindet, aufgerufen. Sie instantiiert ein \textit{VSDefaultPrefs}-Objekt, wo alle Standardeinstellungen des Simulators abgelegt sind. Anschlieend wird ein \textit{VSSimulatorFrame} erzeugt, welches ein Simulatorfenster (wie es schon auf Abbildung \ref{fig:NeuesFenster}. zu sehen war) implementiert. Das Simulatorfenster erstellt fr jede neue Simulation jeweils ein Objekt von \textit{VSSimulator}. Jede Simulation hat im Simulationsfenster einen eigenen Tab. Auf Abbildung \ref{fig:NeuErstellteSimulation}. wurde bereits eine neue Simulation erstellt, wo auch unten links der dazugehrige Tab mit der Beschriftung ``Simulator 1'' zu sehen ist. Jede Simulation besitzt dabei eine eigene Simulationsnummer, die bei jeder neuen Simulation um eins inkrementiert wird. Jedes \textit{VSSimulator}-Objekt greift auf \textit{VSSimulatorVisualization} zurck, was die Simulationsvisualisierung (Abbildung \ref{fig:Visualisierung}.) implementiert. +Beim Starten des Simulators wird auf die \textit{main}-Methode, welche sich in \textit{VSMain} befindet, aufgerufen. Sie instantiiert ein \textit{VSDefaultPrefs}-Objekt, wo alle Standardeinstellungen des Simulators abgelegt sind. Anschlieend wird ein \textit{VSSimulatorFrame} erzeugt, welches ein Simulatorfenster (wie es schon auf Abbildung \ref{fig:NeuesFenster}. zu sehen war) implementiert. Das Simulatorfenster erstellt fr jede neue Simulation jeweils ein Objekt von \textit{VSSimulator}, wobei jede Simulation im Simulationsfenster einen eigenen Tab besitzt. Auf Abbildung \ref{fig:NeuErstellteSimulation}. wurde bereits eine neue Simulation erstellt, wo auch unten links der dazugehrige Tab mit der Beschriftung ``Simulator 1'' zu sehen ist. Jede Simulation besitzt dabei eine eigene Simulationsnummer, die bei jeder neuen Simulation um eins inkrementiert wird. Jedes \textit{VSSimulator}-Objekt greift auf \textit{VSSimulatorVisualization} zurck, was die Simulationsvisualisierung (Abbildung \ref{fig:Visualisierung}.) implementiert. \begin{figure}[h] \centering @@ -545,40 +545,40 @@ Beim Starten des Simulators wird auf die Main-Methode, welche sich in \textit{VS \label{fig:PackageProtocols} \end{figure} -\textit{VSSimulatorVisualization} greift auf Java's Grafikbibliothek Java2D zurck und ist aus Performance-Grnden mit dem Simulationsverlauf stark verzahnt \cite{Games}. Klassenattribute, dessen Wert sich nie ndert, wurden stets als \textit{final} deklariert. Attribute, die von Konfigurationen oder Einstellungen abhngig sind, die sich nur nach Konfigurationsnderung oder Vergrern beziehungsweise Verkleinern des Simulationsfensters ndern (Werte, die fr die Berechnung des Sekunden-Gatters notwendig sind), werden nur wenn es ntig ist neu berechnet. +\textit{VSSimulatorVisualization} greift auf Java's Grafikbibliothek Java2D zurck und ist, aus Performance-Grnden, mit dem Simulationsverlauf stark verzahnt \cite{Games}. Klassenattribute, dessen Wert sich nie ndert, wurden stets als \textit{final} deklariert. Attribute, die von Konfigurationen oder Einstellungen abhngig sind, die sich nur nach Konfigurationsnderung oder Vergrern beziehungsweise Verkleinern des Simulationsfensters ndern (Werte, die fr die Berechnung des Sekunden-Gatters notwendig sind), werden nur wenn es ntig ist neu berechnet. Die Klasse \textit{VSMenuItemStates} wird fr die Synchronisierung des Simulationsstatusses, der Toolbar und des Simulations-Mens (beide Letztere auf Abbildung \ref{fig:Toolbar}. zu sehen) verwendet. Abhngig davon kann der Benutzer bestimmte Aktionen durchfhren oder nicht (beispielsweise kann eine Simulation nur pausiert werden, wenn sie aktuell abgespielt wird). Alle hier mglichen Aktionen wurden bereits in Kapitel 2.1. im Abschnitt ``Die Toolbar'' behandelt. Die Klasse \textit{VSCreateTask} wird vom Ereigniseditor verwendet. Der Ereigniseditor (Abbildung \ref{fig:SidebarMitEreignissen}.) wird in der Klasse \textit{VSSimulator} implementiert. Hinter jeder Ereignisauswahl verbirgt sich intern ein \textit{VSCreateTask}-Objekt, welches definiert, wie das jeweilige Ereignis anzulegen ist. -\textit{VSLogging} kapselt ein \textit{javax.swing.JTextArea}-Objekt, wo alle Nachrichten gelogt werden. Hier werden alle Logfunktionen (inklusive Logfilter sowie temporre Deaktivierung des Logen) implementiert. Die \textit{JTextArea} wird dem \textit{VSSimulator}-Objekt bergeben und dort dargestellt. Fr den Logfilter wird intern auf das Java-Standardpaket \textit{java.util.regex} zugegriffen, womit anhand von regulren Ausdrcken in Java-Syntax die Logs gefiltert werden knnen. +\textit{VSLogging} kapselt ein \textit{javax.swing.JTextArea}-Objekt, wo alle Nachrichten gelogt werden. Hier werden alle Logfunktionen (inklusive Logfilter sowie temporre Deaktivierung des Loggen) implementiert. Die \textit{JTextArea} wird dem \textit{VSSimulator}-Objekt bergeben um dort dargestellt zu werden. Fr den Logfilter wird intern auf das Java-Standardpaket \textit{java.util.regex} (\cite{Regexp}) zugegriffen, womit anhand von regulren Ausdrcken in Java-Syntax die Logs gefiltert werden knnen. \subsubsection{Threads und Zeitsynchronisierung} -Ziel vom Simulator ist es bis auf jede Millisekunde genau simulieren zu knnen. Jede simulierte Sekunde soll relativ zur echten Zeit fortschreiten. Die Simulationsabspielgeschwindigkeit lsst sich bei den Simulationseinstellungen unter ``Abspielgeschwindigkeit der Simulation'' (Float: \textit{sim.clock.speed}) einstellen. Damit dies gewhrleistet wird, muss folgendes bercksichtigt werden: +Der Simulator soll im Stande sein, bis auf jede Millisekunde genau zu simulieren. Jede simulierte Sekunde soll dabei relativ zur echten Zeit fortschreiten. Die Simulationsabspielgeschwindigkeit lsst sich bei den Simulationseinstellungen unter ``Abspielgeschwindigkeit der Simulation'' (Float: \textit{sim.clock.speed}) einstellen. Damit dies gewhrleistet wird, muss folgendes bercksichtigt werden: \begin{itemize} \item Das Zeichnen der Visualisierung bentigt pro Aktualisierung einige Millisekunden. Dies ist der rechen-intensivste Teil des Simulators. Hier werden stndig mathematische Berechnungen (wie zum Beispiel die Gerade einer Nachrichtenlinie, die automatische Skalierung des Diagramms die sich automatisch an die Fenstergre und der Simulationsdauer anpasst und vieles mehr). - \item Das Neuberechnen der Simulation bentigt pro Aktualisierung einige Millisekunden. Hier wird insbesondere der Task-Manager beansprucht, der berprft, ob Ereignisse auszufhren sind und sie gegebenenfalls dann auch ausfhrt. - \item Jeder simulierte Prozess sollte mit selber Geschwindigkeit fortschreiten, und dies auf jedem Rechner wo der Simulator ausgefhrt wird. Da Java-Threads nicht komplett plattformunabhngig sind (Threads sind im Betriebssystem implementiert), kann das Verhalten auf verschiedenen Rechnern minimal variieren. Auerdem bernimmt das Betriebssystem die Entscheidung, wann welcher Thread arbeiten darf. Auer man synchronisiert Threads manuell so, dass sie den eigenen Ansprchen entsprechen. Letzteres bedeutet aber auch mehr Programmieraufwand. + \item Das Neuberechnen der Simulation bentigt pro Aktualisierung einige Millisekunden. Hier wird insbesondere der Task-Manager beansprucht, welcher berprft, ob Ereignisse auszufhren sind, und sie gegebenenfalls dann auch ausfhrt. + \item Jeder simulierte Prozess sollte mit selber Geschwindigkeit fortschreiten, und dies auf jedem Rechner wo der Simulator ausgefhrt wird. Da Java-Threads nicht komplett plattformunabhngig sind (Threads sind im Betriebssystem implementiert), k\"{o}nnte das Verhalten auf verschiedenen Betriebssystemen oder Architekturen variieren. Auerdem bernimmt das Betriebssystem die Entscheidung, wann welcher Thread arbeiten darf. Auer man synchronisiert Threads manuell so, dass sie den eigenen Ansprchen entsprechen. Letzteres bedeutet aber auch mehr Programmieraufwand. \item Die Simulationszeit ist stets in Millisekunden angegeben, welche in einer \textit{long}-Variable abgespeichert wird. Somit kann eine Simulationszeit immer nur eine ganze Zahl sein. Berechnungsrundungsfehler wegen \textit{sim.clock.speed} mssen bercksichtigt werden. \item Der Simulator soll nicht stndig die komplette CPU des Anwender-Computers voll beanspruchen. \end{itemize} -Es wurde folgende relativ einfache Lsung gewhlt, bei der lediglich ein einziger Thread fr die Visualisierung und die Berechnung der Simulation zustndig ist (alle Zeitangaben sind in Millisekunden). Der Algorithmus verluft leicht vereinfacht in folgender Form ab: +Es wurde eine Lsung gewhlt, bei der lediglich ein einziger Thread fr die Visualisierung und die Berechnung der Simulation zustndig ist (alle Zeitangaben sind in Millisekunden angegeben). Der Algorithmus verluft leicht vereinfacht in folgender Form ab: \begin{enumerate} - \item Die simulierte globale Startzeit sei $s$ und die globale Zeit wo die Simulation aufhrt sei $e$. - \item Wenn $s > e$, dann $s := e$ setzen. - \item Neuberechnen und Zeichnen der Visualisierung zum Zeitpunkt $s$. Die dabei verstrichene Zeit sei $v$. - \item Wenn $s = e$, dann Simulation beenden. + \item Die aktuelle simulierte globale Zeit sei $t$ und die globale Zeit wo die Simulation aufhrt sei $e$. + \item Wenn $t > e$, dann $t := e$ setzen. + \item Neuberechnen und Zeichnen der Visualisierung zum Zeitpunkt $t$. Die dabei verstrichene Zeit sei $v$. + \item Wenn $t = e$, dann Simulation beenden. \item Fr einige Millisekunden den Thread pausieren (schlafen lassen). Hierbei sei $p$ die beim Schlafen verstrichene Zeit. \item \begin{verbatim} -for (i = s; i < s + v + p && i < e; i++) +for (i = t; i < t + v + p && i < e; i++) Alle Ereignisse des Zeitpunktes i hintereinander ausfhren \end{verbatim} - \item Bei Punkt 2 mit neuer Startzeit $s := s + v + p$ weitermachen. + \item Bei Punkt 2 mit neuer Startzeit $t := t + v + p$ weitermachen. \end{enumerate} Hinzu kommt noch die Bercksichtigung der Simulationsvariable \textit{sim.clock.speed}, die wegen der bersicht im Algorithmus nicht dargestellt wurde. Intern hat der Simulator die echte Zeit und die Simulationszeit abgespeichert. Es werden stndig die verstrichenen echten Zeiten gemessen und anschlieend anhand von \textit{sim.clock.speed} die neuen tatschlichen Simulationszeiten berechnet. Rundungsfehler werden pro Durchgang in eine \textit{double}-Variable (Fliekommazahl doppelter Genauigkeit) abgespeichert und wenn der Betrag der Rundungsfehler $>= 1$ ist, dann werden davon die ganzen Wertanteile in der Simulationszeit bercksichtigt. F\"{u}r jede lokale Prozesszeit sowie der dazugeh\"{o}rigen lokalen Uhrabweichung und den lokale Ereignisse wird \"{a}hnlich verfahren. @@ -587,7 +587,7 @@ Jede Simulation besitzt somit seinen eigenen Simulationsthread. Bei mehreren par \section{Serialisierung und Deserialisierung von Simulationen} -Der Anwender kann eine erstellte Simulation im Datei-Men speichern und/oder eine bereits abgespeicherte Simulation laden. Hierbei wird von den aus Java angebotenen Mglichkeit Objekte zu Serialisieren Gebrauch gemacht. Im Paket \textit{serialize} (Abbildung \ref{fig:PackageSerialize}.) befinden sich Helfer, die bei einer Serialisierung und einer Deserialisierung einer Simulation unter die Arme greifen. +Der Anwender kann eine erstellte Simulation im Datei-Men speichern und/oder eine bereits abgespeicherte Simulation laden. Hierbei wird von der aus Java angebotenen Mglichkeit Objekte zu Serialisieren Gebrauch gemacht. Im Paket \textit{serialize} (Abbildung \ref{fig:PackageSerialize}.) befinden sich Helfer, die bei einer Serialisierung und einer Deserialisierung einer Simulation unter die Arme greifen. Der Simulator serialisiert nur notwendige Daten, und nicht jedes existierende Objekt. Alle Serialisierbaren Klassen implementieren das Interface \textit{VSSerializable} mit folgenden zwei Methoden: @@ -596,7 +596,7 @@ Der Simulator serialisiert nur notwendige Daten, und nicht jedes existierende Ob \item \textit{public void deserialize(VSSerialize serialize, ObjectInputStream ois)}: Diese Methode wird bei jedem Deserialisierungsvorgang aufgerufen (beim Laden einer Simulation). \end{itemize} -Die Methoden \textit{serialize} und \textit{deserialize} erhalten neben einen Dateistream auch ein \textit{VSSerialize}-Objekt. Fr jeden (De)serialisierungsvorgang wird ein \textit{VSSerialize}-Objekt erzeugt, welches dabei Hilft die bentigten Aktionen durchzufhren. Eine zu serialisierende Simulation besteht aus vielen voneinander abhngigen Objekten. Jedes Objekt kann dabei Referenzen auf andere Objekte besitzen. Wrde jedes Objekt komplett serialisiert werden, so wrden Objekte, auf denen mehrere Referenzen existieren, in mehrfacher Ausfhrung behandelt (in eine Datei abgespeichert) werden. Bei Kreisverweisen (Objekt A hat eine Referenz auf Objekt B und Objekt B hat eine Referenz auf Objekt A als Attribut gespeichert) wrde die Serialisierung sogar in einer Endlosschleife enden. \textit{VSSerialize} hilft hierbei dies zu vermeiden und merkt sich Informationen von allen bereits serialisierten Objekten, so dass jedes Objekt nur genau einmal serialisiert wird. Bei der Deserialisierung werden alle Objekte wieder automatisch mit den richtigen Referenzen ausgestattet, wobei kein Objekt doppelt deserialisiert wird. +Die Methoden \textit{serialize} und \textit{deserialize} erhalten neben einen Dateistream auch ein \textit{VSSerialize}-Objekt. Fr jeden (De)serialisierungsvorgang wird ein \textit{VSSerialize}-Objekt erzeugt, welches dabei Hilft, die bentigten Aktionen durchzufhren. Eine zu serialisierende Simulation besteht aus vielen voneinander abhngigen Objekten. Jedes Objekt kann dabei Referenzen auf andere Objekte besitzen. Wrde jedes Objekt komplett serialisiert werden, so wrden Objekte, auf denen mehrere Referenzen existierten, in mehrfacher Ausfhrung behandelt (in eine Datei abgespeichert) werden. Bei Kreisverweisen (Objekt A hat eine Referenz auf Objekt B und Objekt B hat eine Referenz auf Objekt A als Attribut gespeichert) wrde die Serialisierung sogar in einer Endlosschleife enden. \textit{VSSerialize} hilft hierbei dies zu vermeiden und merkt sich Informationen von allen bereits serialisierten Objekten, so dass jedes Objekt nur genau einmal serialisiert wird. Bei der Deserialisierung werden alle Objekte wieder automatisch mit den richtigen Referenzen ausgestattet, wobei kein Objekt doppelt deserialisiert wird. \begin{figure}[h] \centering @@ -605,9 +605,9 @@ Die Methoden \textit{serialize} und \textit{deserialize} erhalten neben einen Da \label{fig:PackageSerialize} \end{figure} -Alle Klassen, die \textit{VSSerializePrefs} erweitern, knnen automatisch smtliche Einstellungen komfortabel serialisieren und deserialiseren. Beispielsweise speichert ein Simulator (\textit{VSSimulator}) alle seine globalen Simulationseinstellungen bei einer Serialisierung automatisch ab. Bei den Prozessen und den Ereignissen (und somit auch Protokollen) gilt selbiges analog. +Alle Klassen, die \textit{VSSerializePrefs} erweitern, knnen automatisch smtliche Einstellungen komfortabel serialisieren und deserialiseren. Beispielsweise speichert der Simulator alle seine globalen Simulationseinstellungen bei einer Serialisierung automatisch ab. Bei den Prozessen und den Ereignissen (und somit auch Protokollen) gilt Selbiges analog. -Abgespeicherte Simulationen sollen auch mit zuknftigen Versionen des Simulators kompatibel bleiben. Deshalb werden alle Objekte derjenigen Klassen, die \textit{VSSerializable} implementieren, nicht komplett serialisiert. Bei der Serialisierung werden nur relevante Klassenattribute, die der Simulationsprogrammierung- und nicht beispielsweise GUI-Komponenten angehren, serialisiert. +Abgespeicherte Simulationen sollen auch mit zuknftigen Versionen des Simulators kompatibel bleiben. Deshalb werden alle Objekte aller Klassen, die \textit{VSSerializable} implementieren, nicht komplett serialisiert. Bei der Serialisierung werden nur relevante Klassenattribute, die der Simulationsprogrammierung, und nicht beispielsweise GUI-Komponenten angehren, serialisiert. \subsubsection{Beispielimplementierung einer \textit{serialize}-Methode} @@ -627,11 +627,11 @@ Der folgende Quelltext-Ausschnitt zeigt eine Beispielimplementierung von \textit } \end{code} -Vor- und nach der eigentlichen Objektserialisierung wird jeweils eine boolesche Flagge serialisiert, welche auf \textit{true} gesetzt wird, sobald in spteren Simulator-Versionen (was relativ unwahrscheinlich, aber mglich ist) weitere zu serialisierende Klassenattribute hinzukommen. Eine Deserialisierung kann die Flaggen dann abfragen und separat behandeln. Somit bleiben ltere bereits abgespeicherte Simulationen stets zur neusten Version des Simulators kompatibel. Wenn eine Flagge auf \textit{true} gesetzt wird, dann kann unter den neuen Attributserialisierungen eine weitere Flagge gesetzt werden. Somit knnen beliebig viele Erweiterungen in die Serialisierung Einzug halten. +Vor- und nach der eigentlichen Objektserialisierung wird jeweils eine boolesche Flagge serialisiert, welche auf \textit{true} gesetzt wird, sobald in spteren Simulator-Versionen (was relativ unwahrscheinlich, aber mglich ist) weitere zu serialisierenden Klassenattribute hinzukommen. Eine Deserialisierung kann die Flaggen dann abfragen und separat behandeln. Somit bleiben ltere bereits abgespeicherte Simulationen stets zur neusten Version des Simulators kompatibel. Wenn eine Flagge auf \textit{true} gesetzt wird, dann kann unter den neuen Attributserialisierungen eine weitere Flagge gesetzt werden. Somit knnen beliebig viele Erweiterungen in die Serialisierung Einzug halten. -Das zu serialisierende Objekt besitzt hier lediglich zwei Attribute, die serialisiert werden sollen. Alle anderen Klassenattribute knnen vernachlssigt werden. Mit \textit{serialize.setObject} speichert \textit{serialize} eine Referenz auf das aktuelle Objekt ab, worauf andere Objektserialisierungen zurckgreifen knnen. Danach wird ein \textit{prefs} und \textit{someOtherSerializableObject} serialisiert. Die Deserialisierung folgt genau den Umgekehrten weg. Wobei hier zuerst die Instanzen der Klassen auf normalen Weg erstellt werden und dann nachtrglich die relevanten Attribute deserialisiert und den Objekten zugewiesen werden. Hierbei werden auch mit Hilfe von \textit{VSSerialize} mehrere Referenzen auf das selbe Objekt korrekt behandelt. +Das zu serialisierende Objekt besitzt hier lediglich zwei Attribute, die serialisiert werden sollen. Alle anderen Klassenattribute knnen vernachlssigt werden. Mit \textit{serialize.setObject} speichert \textit{serialize} eine Referenz auf das aktuelle Objekt ab, worauf andere Objekte bei der Serialisierung zurckgreifen knnen. Danach wird ein \textit{prefs} und \textit{someOtherSerializableObject} serialisiert. Die Deserialisierung folgt genau den Umgekehrten weg. \textit{VSSerialize} hilft auch hier dabei mehrere Referenzen auf das selbe Objekt korrekt zu behandeln. -Wenn der Anwender \textit{Datei $\rightarrow$ Simulation speichern} whlt, dann wird zunchst ein \textit{VSSerialize}-Objekt erstellt. Ausgehend davon wird \textit{serialize} auf \textit{VSSimulator} ausgefhrt (siehe Serialisierungssequenz auf Abbildung \ref{fig:SequenceSerialize}.). Das Simulator-Objekt fhrt \textit{serialize} wiederum auf das \textit{VSSimulatorVisualization}-Objekt aus. Dort wird jeder Prozess inklusive alle Protokollobjekte serialisiert. Anschlieend folgt der Task-Manager inklusive allen programmierten Ereignissen. +Wenn der Anwender \textit{Datei $\rightarrow$ Simulation speichern} whlt, dann wird zunchst ein \textit{VSSerialize}-Objekt erstellt. Ausgehend davon wird \textit{serialize} auf \textit{VSPrefs} und \textit{VSSimulator} ausgefhrt (siehe Serialisierungssequenz auf Abbildung \ref{fig:SequenceSerialize}.). Das Simulator-Objekt fhrt \textit{serialize} wiederum auf das \textit{VSSimulatorVisualization}-Objekt aus. Dort wird jeder Prozess inklusive alle Protokollobjekte serialisiert. Anschlieend folgt der Task-Manager inklusive allen programmierten Ereignissen. \section{Helferklassen und Klassen fr Ausnahmebehandlungen} @@ -663,7 +663,7 @@ Es wurden noch nicht die Klassen der Pakete \textit{utils} (Abbildung \ref{fig:P \label{fig:PackageExceptions} \end{figure} -Im Paket \textit{exceptions} befinden sich lediglich einige Klassen die fr Ausnahmebehandlungen verwendet werden. \textit{VSNotCopyableException} wird whrend einem Kopierversuch eines nicht-kopierbaren Ereignis geworfen. \textit{VSNegatieNumberException} wird geworfen, wenn negative Zahlen dort auftreten wo sie es nicht sollten. Wenn ein Editorobjekt die Benutzereingabe einer Integer-Vektor-Variable nicht parsen kann, so greifen es auf \textit{VSParseIntegerVectorException} zurck. +Im Paket \textit{exceptions} befinden sich lediglich einige Klassen, die fr Ausnahmebehandlungen verwendet werden. \textit{VSNotCopyableException} wird whrend einem Kopierversuch eines nicht-kopierbaren Ereignis geworfen. \textit{VSNegatieNumberException} wird geworfen, wenn negative Zahlen dort auftreten, wo sie es nicht sollten. Wenn ein Editorobjekt die Benutzereingabe einer Integer-Vektor-Variable nicht parsen kann, so greifen es auf \textit{VSParseIntegerVectorException} zurck. \begin{figure} \centering @@ -676,10 +676,9 @@ Im Paket \textit{exceptions} befinden sich lediglich einige Klassen die f \section{Programmierrichtlinien} -Die Programmierrichtlinien \cite{Richtlinien} entsprechen in den meisten Fllen denen aus der Vorlesung \cite{OOS}. - -Die Main-Methode befindet sich in der Klasse \textit{simulator.VSMain}. +Die Programmierrichtlinien entsprechen in den meisten Fllen denen aus \cite{OOS} (siehe auch \cite{Richtlinien}). +Die \textit{main}-Methode befindet sich in der Klasse \textit{simulator.VSMain}. \begin{itemize} \item Es wird kein Gebrauch vom Java-Standardpaket gemacht. Alle Klassen befinden sich somit in explizit angegebenen Paketen (zum Beispiel \textit{events.implementations}). \item Alle Klassen- und Interfacenamen beginnen mit groen Buchstaben, whrend alle Variablen-, Methoden- und Attributnamen mit kleinen Buchstaben beginnen. Namen finaler Variablen und Attribute sind komplett in Grobuchstaben gehalten. @@ -693,8 +692,8 @@ Die Main-Methode befindet sich in der Klasse \textit{simulator.VSMain}. \item Namen abstrakter Klassen tragen als Prfix stets \textit{VSAbstract}. \item Namen aller Protokollklassen tragen als Postfix \textit{Protocol} (zum Beispiel \textit{VSPingPongProtocol}). \item Namen aller Ereignisklassen, die keine Protokolle implementieren, tragen als Postfix \textit{Event} (zum Beispiel \textit{VSProcessCrashEvent}). - \item Namen aller dejenigen Klassen die ein Fenster implementieren tragen als Postfix \textit{Frame} (zum Beispiel \textit{VSSimulatorFrame}). - \item berall wo es Sinn ergibt werden Java-Generic-Datentypen verwendet (z.B. \textit{java.util.Vector} anstelle von \textit{java.util.Vector}. + \item Namen aller dejenigen Klassen, die ein Fenster implementieren, tragen als Postfix \textit{Frame} (zum Beispiel \textit{VSSimulatorFrame}). + \item berall wo es Sinn ergibt werden Java-Generic-Datentypen verwendet (zum Beispiel \textit{java.util.Vector} anstelle von \textit{java.util.Vector}). \end{itemize} \section{Entwicklungsumgebung} @@ -705,7 +704,7 @@ Wie bereits bekannt ist, wurde Sun's Java, was mittlerweile auch Open Source Sof Als Versionierungssystem wurde SVN (Subversion) verwendet. Fr den Zugriff auf das SVN-Repository mittels HTTPS (Hypertext Transfer Protocol Secure) wurde der Apache-Webserver mit WebDAV-Plugin verwendet. Zudem kam WebSVN als Webschnittstelle des SVN-Repository zum Einsatz. Mozilla Firefox diente fr das Betrachten der Javadocs und der WebSVN-Oberflche. -Fr schreiben von Java-Quelltext wurde GVim (Graphical Vi IMproved) sowie Eclipse verwendet. Eclipse untersttzt bessere Code-Refactoring-Methoden, whrend GVim mit seiner Flexibilitt und schnelleren Editiermglichkeiten und mit Vim-Script, der eigenen Script-Engine, glnzt. Es wurden auerdem das JAutoDoc- (fr die Erstellung von Javadoc-Kommentare) und das Subversion-Eclipse-Plugin verwendet. Je nach Zweck wurde zwischen diesen beiden Umgebungen gewechselt. Fr das Verfassen des LaTeX-Dokumentes wurde GVim verwendet. +Fr das schreiben von Java-Quelltext wurde GVim (Graphical Vi IMproved) sowie Eclipse verwendet. Eclipse untersttzt bessere Code-Refactoring-Methoden, whrend GVim mit seiner Flexibilitt und schnelleren Editiermglichkeiten und mit Vim-Script, der eigenen Script-Engine, glnzt. Es wurden auerdem das JAutoDoc- (fr die Erstellung von Javadoc-Kommentare) und das Subversion-Eclipse-Plugin verwendet. Je nach Zweck wurde zwischen diesen beiden Umgebungen gewechselt. Fr das Verfassen des LaTeX-Dokumentes wurde GVim verwendet. Smtliche UML-Diagramme wurden mit ArgoUML angefertigt und die Screenshots mit The GIMP (GNU Image Manipulation Program) sowie ImageMagick nachbearbeitet. Mit dem zip-Programm wurden alle VS-Simulator Distributionen verpackt. diff --git a/LaTeX/diplomarbeit.pdf b/LaTeX/diplomarbeit.pdf index f3c3103..8590928 100644 --- a/LaTeX/diplomarbeit.pdf +++ b/LaTeX/diplomarbeit.pdf @@ -1490,8 +1490,8 @@ endobj 404 0 obj << /Producer (GPL Ghostscript 8.61) -/CreationDate (D:20080812215346Z00'00') -/ModDate (D:20080812215346Z00'00') +/CreationDate (D:20080813052618Z00'00') +/ModDate (D:20080813052618Z00'00') >> endobj 405 0 obj @@ -1583,8 +1583,8 @@ endobj 414 0 obj << /Producer (GPL Ghostscript 8.61) -/CreationDate (D:20080812215346Z00'00') -/ModDate (D:20080812215346Z00'00') +/CreationDate (D:20080813052617Z00'00') +/ModDate (D:20080813052617Z00'00') >> endobj 415 0 obj @@ -6398,8 +6398,8 @@ endobj 743 0 obj << /Producer (GPL Ghostscript 8.61) -/CreationDate (D:20080812215345Z00'00') -/ModDate (D:20080812215345Z00'00') +/CreationDate (D:20080813052617Z00'00') +/ModDate (D:20080813052617Z00'00') >> endobj 744 0 obj @@ -6583,8 +6583,8 @@ endobj 768 0 obj << /Producer (GPL Ghostscript 8.61) -/CreationDate (D:20080812215344Z00'00') -/ModDate (D:20080812215344Z00'00') +/CreationDate (D:20080813052616Z00'00') +/ModDate (D:20080813052616Z00'00') >> endobj 769 0 obj @@ -6691,8 +6691,8 @@ endobj 781 0 obj << /Producer (GPL Ghostscript 8.61) -/CreationDate (D:20080812215346Z00'00') -/ModDate (D:20080812215346Z00'00') +/CreationDate (D:20080813052618Z00'00') +/ModDate (D:20080813052618Z00'00') >> endobj 782 0 obj @@ -6900,8 +6900,8 @@ endobj 808 0 obj << /Producer (GPL Ghostscript 8.61) -/CreationDate (D:20080812215346Z00'00') -/ModDate (D:20080812215346Z00'00') +/CreationDate (D:20080813052618Z00'00') +/ModDate (D:20080813052618Z00'00') >> endobj 809 0 obj @@ -6997,8 +6997,8 @@ endobj 820 0 obj << /Producer (GPL Ghostscript 8.61) -/CreationDate (D:20080812215345Z00'00') -/ModDate (D:20080812215345Z00'00') +/CreationDate (D:20080813052617Z00'00') +/ModDate (D:20080813052617Z00'00') >> endobj 821 0 obj @@ -7092,8 +7092,8 @@ endobj 830 0 obj << /Producer (GPL Ghostscript 8.61) -/CreationDate (D:20080812215347Z00'00') -/ModDate (D:20080812215347Z00'00') +/CreationDate (D:20080813052618Z00'00') +/ModDate (D:20080813052618Z00'00') >> endobj 831 0 obj @@ -7208,8 +7208,8 @@ endobj 846 0 obj << /Producer (GPL Ghostscript 8.61) -/CreationDate (D:20080812215345Z00'00') -/ModDate (D:20080812215345Z00'00') +/CreationDate (D:20080813052617Z00'00') +/ModDate (D:20080813052617Z00'00') >> endobj 847 0 obj @@ -7635,16 +7635,26 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 902 0 obj << -/Length 2511 -/Filter /FlateDecode ->> -stream -xڝr8m* AboI%JSY{( 8(HNjۍ(R@nbjMUbp|;8/:QYcq!b2QnKT4\e-5[ΗO;)yɲv>pבM$g1uKRR%uiB2+tI,KTh?>⸒|ٖySn30r\aE g=w@fg^0˯+͗Ys 1RZEV#=t&-JyZdήW -=Ho7qS9Hf¼c[zbr&E iƸc&F蠮`C;WK HOChZEz?ӾwkVbg\1XYMםOw\+=4䭫/C7EUu E ףC|hD2ZT3f(SθY0{$cgl1&\GqydmPy ǣ#04d$Q!V$*3Lw;byAŰCţDa-z^%//ٟYĕ12h5/,a*2<-yҌ'iƁej뚛]]\$_7y,O ˴0&Zhg09cҖWoS`2*\Ys;xށ؉yY:Z*ȭC'!@y a*C +.<MmX^y@ڨ`/Lg/aݽ5:;;g?$ly'2A 3bߩi^| -)1_k1ݝu4Nq$& &31.,"5l1惠 (wm}GgW2H54ib@Ɔ NݙR }=ޫT?Ѫr*F=d/6 mNh Ӭ+CLyƀ Ut*0_$4 -+ețLqcTp0?VobE)% !yMY/Mn]MHK|;kd'آ@2۳-Xn0lpi;썴F f:1鴋[~j+,|,CM˭0.vdf:t쿎6pA={)Р}MK)?lwdY㈄'j%Au<77e_zdTc9 -uGpax8UᢽQiR?OY4Ȇ#Ese 4=ZH8Ku^v86jJJPx6Osϝ x=c}y!.(B8Ʈ9p|@{Ufh-sQQ8 1(XLC/şdL^p7#)_d4z2%% ^),1\e&첆?aOGOo~};4v#\0F8zPƔt1n*_1~V4W˸3zʽ̨kph]#&a?Qg) j,?rokHvkMA85{w]!ȴسdA):11c^=GĊp`{08#%qܣAy%q@smbJA*(7xfz۷>dr"5c\HwFBBiB⭠mЀj X+Kzc!*BISjn/B%Y*K;qV" B^ePP; iKOCX5%~ ƜSw- -υ)>X4vŎ0c?VTftUNbb~qQB,p5o UIZ?{  {.֨np?鰈Mg )\Pƚe`k-(75qsF|ÞSeN-ƟGpvSCO2:>V(PMdt-7Īkb?&|ZK}- LS㎷M޸W&Q7]"RLLVʜQG^fnM AW*Rt:<> +stream +xڕr8m* '{sWڛ=@đDyDrRn4@e[r@wĂ?H4<3$Sbx8vW}~9VeqO F3k\6v\$4[ lՔ\ f;FrƱ|ZL8Y`q&}虗$%J%2^2!b|J'$I{fƳ>RMyʺe yߙF2{Pp} d&yJrD}[j;d6Hq,(!AhiPJ k)MdO +=nO01}1#fTw,NEX'Ϊi*)nRd6a"IŘ6:Kd'ؐ,#ickp}$r./M l}tAO-nVL`+-V"akOǵ==p raEwP Fר궮-p>|:Ռ%$c&N}"agv90mrOƋ`HL_- 18ja0TPlRт`GwMIμhh(Z<rb-",tȃ4| fhm⣯<9dI]yCH2/tf\w^[0/YꞶ aE [1zWzFʪnʛw@xW|C۔=WY 23bb;o,v|s5e?Lݕ?؝8i +\]'( Gn17vo7uY8J%*ōLLl1fb\Kd'BA^Pvk+ +O.c,4Qؗj`7*{E_O*Dne[;AW::8,@d0ҟѦ+(',M{R2mbx@d0gwœY=wUXBPKuټ8NJOt(PK(3TNʪgjdjb !c@hNp1hOfSK+o|N_!q(N3 H+b<6dĶjB/] +_/nTSjmYu( |xGGSZvRuk5-1+g_|Q +|1C1ܾէݑSy8XW]y$ =.t9\t:5퀸Ox2rXLx _τ'Za%@$Ɣ5%H,jwj_3:JҞ0>b]Q +5~h9B6v3L]7oX@;n3_:ݝU4LqS1&9刉Q.`s3W3 vɒ9 {))KOVU{ɝpgwo_Tc*E&R37)62fRbx +f6u`(N>iӔ iLY@8HSkSA^3`,S3b`х9$(e#&aa&h~@TT\ wM@`[kڗfkwt>+ohL8tXd!IKŦKpZѮn)0s=p +Ƥ$)X@r]_3 ^moKV +gBBw^*Y/X#&舓YzKǸ&6yƙBۄ!@C>,8** +GMU誫*eK@%0eG!P {;"! 2u(n+c7- -#Uz4`YuؔŒC!n,+*<*m1ǁ/ûbr~qV ܌!0Gߗ)nANgkR-ܭQa)ٻEF83zEZ]j؜)?B3%2MZ*=!㍫.;Z?7p䍝)&*A:y +:c55ݑpן +9uw\2!K7zoE]H'hL?,4? \R~/̞~X8Q*}O2wVKsqSYW 4{~O6?؆nbF(*UiZϿ]&|"THд6и=zb.~qlt{ +{pU',B\8),bIͰȦM+ .P ~z!ᪿ yV^.{3 +Π52PSoPpyendstream endobj 901 0 obj << /Type /Page @@ -7681,8 +7691,8 @@ endobj 910 0 obj << /Producer (GPL Ghostscript 8.61) -/CreationDate (D:20080812215344Z00'00') -/ModDate (D:20080812215344Z00'00') +/CreationDate (D:20080813052616Z00'00') +/ModDate (D:20080813052616Z00'00') >> endobj 911 0 obj @@ -7718,14 +7728,14 @@ endobj 906 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [360.2469 599.215 374.7025 609.7972] +/Rect [392.0167 599.215 406.4723 609.7972] /Subtype /Link /A << /S /GoTo /D (figure.2.3) >> >> endobj 907 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [95.8467 527.506 110.3023 538.0883] +/Rect [118.6748 527.506 133.1304 538.0883] /Subtype /Link /A << /S /GoTo /D (figure.2.5) >> >> endobj @@ -7758,21 +7768,26 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 917 0 obj << -/Length 2690 -/Filter /FlateDecode ->> -stream -xڕYK8ϯQjs%z-N2y֤+lneƒIҿ~%[v24E **LEʊQzj~ -WFNv7S?mrVX=<OCWyԽ`McZuMC[7ڄ,OSc{/7&ǃ'˲=}?I3^յ<8MZ?TK=>ЕUҽ:G#g %z%z`(30@Y"ڟUr0k4DBb#K|xluW$nurˁ@K -~y8.K(ќ,<o?}GQ;S6|kCW0h;г ~Vk֕F/پ RSAGsv*M8šˣ!+6)4=[ȯ{Ž+0#]|۷ D03 q8-wvx^&(?i*Sas.T/*C[6̱9Z뺆 -kGv=@@rÉ}Q&o΢(pMB )8 0-P,B x3VvO(vOLMn$-KvJ]QӺQ`bm Yi3?qd acq$8 "tVx^樷A?/B1"Y<ĞRRaa>] k23l^66dЪA3^+LMKCDRhW/)C$Ӗ΂|q.tP(֘R%LmN,Nd,\BErPQvX#q[:sK,,3zOB.9 vfSqd<UUЅnC?-ܦ;B:%5ȔR3(BQ^ߋf H$hz}zO illU\XM8B0V:jk7 ^Ʒ;Hw4(#)3N4\<SF_ F4N6s;FRt_],l鬻yU驛ݒhV24޴jJuӤ$u&eAv֣>cidxuC 1zAq2;4.ʹ|HE:wA,@_ +<;~/r;f71S HbVhW* UNF)u"tQʑOU.T=&;> Rc $Y.ٺvGߧhObt7X$ku5p[ѯlx-#> +stream +xڕYIsϯБrsI&{8Є)(Re_EJTAnu7W>X2*NpzڿWrKqě)o. +V KHWBL?eFĉ'zP齮R .<|xad +%Q$^'H}.H&BSDZ02]? +d ᩬݡUO_6C3nJcEEU>muM3ljehs7t˾NJ,iYJ(DpWZ)\^TjaAA%TeznܪO$Y%R]IJ2a~OV&Ϊю#8MT!-hNeߴ~Ys 3 ܻM`6-YY $C҄'G,”| p+7sQtӹGW,9"TG^b{ve詤o:Do?\43Gh{KP)A!җX& {A0s7tVCBOm16йGVEODq@P›ÄqoIR!hߪ2 7[t|~}Q*/zf]YOz-|®;З.R(O.:oMQ;ueajg_DjhCE\-3ty6# %;souQNq +!yMm.(nL29aZ'JwqaU>6"RxPZlp*H/u@/,O(%`9j_Ht9L)/27'35)ĥ1n5}vo"B`MC˪u7n\ 44g9 l L).O6B/4t ,\| >4m61MP862H]O)SP +eA@&,Qœ_2p#1|fkM0jTR&(Lj(Yw:_`Ϝ8ːSQCOPk+JCq(@*'ݲqI6Թ+X! ԗp)VH +D+i +P$HQ<>,\^ι9;LЉ;/nýe7 ؤۯyIyHyh-G)p?Fegݷ2,!05THcv}~&Tm +;,_QP$]^E{o5WBYn?j6'S,FA)佣-MҗK'ÔA> G@/rCy>XQL\ߩjf$3ջRٚ9]/nێO%U[Z酄-Li c$ws5UAϠS{maBP>LUއk׳m2:Z IŹFf4(K "* LN=ږjQgYvӊqםvJuiG*iϸ.;2?_|GpӘ %ԀfमҰR%D -" va += 4eo8 $QtVy3< +ם6jl9pFh'9~1l&9jmM6+0!!70]dHSdMD:o O87kƆS{ ݭ ֌p;Bq`[K2 YFbxQ֗Vl,FlBF$ꦴlU_]&DWPQX{rr,/5/.t9۴vR5f@)~vjإ`f!> endobj 919 0 obj << /Type /Annot @@ -7789,142 +7804,155 @@ endobj /Subtype /Link /A << /S /GoTo /D (figure.2.8) >> >> endobj +920 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 0] +/Rect [198.945 600.6657 221.0936 609.2304] +/Subtype /Link +/A << /S /GoTo /D (cite.Regexp) >> +>> endobj 918 0 obj << /D [916 0 R /XYZ 74.4095 793.4011 null] >> endobj -920 0 obj << +921 0 obj << /D [916 0 R /XYZ 74.4095 534.4385 null] >> endobj 915 0 obj << /Font << /F63 220 0 R /F28 173 0 R /F26 170 0 R /F35 193 0 R >> /ProcSet [ /PDF /Text ] >> endobj -923 0 obj << -/Length 2442 +924 0 obj << +/Length 2462 /Filter /FlateDecode >> stream -xڭ]6=OČ$5$lܵ\6= {m,[ҦES3 ~"Lx\D /g"woax݇~su1KP,n,:.V BuYZrٔ7icqF!2kY=r(&\.|%RxgÛz~tNd8ŢVt5{=<b -9Wl -UTu(,c|vB<]ip -9_vǏ-h|@,Gnj}k_W\(7Zq/.g"YRi.O|Мv^݊EEhzWyi MyðBe1+=}~Apf - (Cu -}#_X "&"9Iч ՟Xy-ZK932Y$ICjZgZ('ufe3([E78ښak_Sӭl;?6}=y"q33[߷SQ6"aRq~_IG?@ zJzP3V92̢씡;1_@&Fcr0cS>!2#DiLb2H%'d8Y-611۪ACuV۬Pw$i-TUN[ۄY̹qD1pp8xO'ܢT"p?? Irs♹Oj -)߇փ - 'Ua d5j q<0!"0=Jsoogwc;s# fa )9-izѷqІ7aQeyY@QƏs¦PdŐ%2AA]iϡd:i> j]X+uyh,_oowq |I08=2<P'#--UEx, . z?co"\duw—@e=LAY:E -K<>ʸCe}a3-̗Pmq T:j|șLzv@-1#5>} H+*q & T$`ĵ~JuU뢨iz> MqcsܶC -iܮa#Y+aQm#îfVҖDAYuddʉ n2t1NhxM+t{AD&3E6!.??!At7z 88DCE@oe/kUW $KwˮD} SQސw<hp՜Y SIj̞x,Iǐݡހ8"95Y` 8}Ӏ5ܜQ*ƩQdNS1q]j(͓~5&ć>A`E.xgIu :aA C0c=J hCW{-g^=!Dx3r)X尅?-P-dy充VêluX\:~ưMw{jӁ&ꀟh*&ծ*z؏)FmV]o47}6һbʵԼP20NU^?PL.dhF !Umj#F&BT Ha Z/Tck^mG5&'!M)]Rm2ERS" z u4.b6..c-ۋ}@-D>e$Q^W - }i`;1 -g$R-Os0]XM}$B*cQ NP`V܌@t;$"0%@U+PڶS!@UwͥX=R2_*˗h/=D_1( GF8+\6s[FTނg)+d˕ +PHm/{!KRL8Y`1Yz&*cI&B-eJqJTtсMn(9'2KX#w]biQ'R^!w2 +M1*nlnզ{S/yM~/Ts\ mcn˒C6(pݚ!+1 d"Kk8 Ǎ +LQFqZ`r~ŋlMA J,4u>9Az{4zCH2'+VEWF Vn[ eɋQ_^ ` ^|0@m%0tF%)Kz$;CMLŤ̢tfe30qfgttG#.<WĐP?#Y$bљ=s~mcxK@fѸ7;о,Q^U|QR181eA(BrZPaI8?;ɰ6̘+ UǃƂ QjZ0NRtI4ya> +( TqnR*fw$j-u]w N[ۄ.%aD)Y2p8xG'ܤWT (GJ? +{♽OjZ( ߇փ + 'Ua di mkȀ;̆c(Q __wu c?S+8gyiS} }^^mkDt1O8TۢjlI)9Pa[smQde#2AC]iϡou.([ҹ@MCBPLyT8wPIiQ4UߍR C Un&}cdEo&jo +/a +~T[&.rdPW[3k[9Ő4) ( m'T>+@$;čܶ!!cYK@19iH3([\ʮ߄m}M@Q5x`wKE;AR^ +ޖ䷍wf̜.5xl]+W#euRSC&XH8 7;!V"0€sj'V(Ax<Hd VA7PtXVxQFn x]_eJ_pmmIzpWvk[Hm 0$EmlD{ߖI8jpIӀ38y?QS[S- Fb w4O=gl.aʀ [H%iWgg0P`IJ hʏƆk. o L q 1#߼oJ膫i!K (dZVĴ爱BVacf/I=W͂z_ sedKz>>mI . nq?ųm뽢z^f/&s-ξ7.*VE@ِ;7ԍǀ,>M$RJٌKy9OhnmR(BsSN?Oi0nj+ Jګ]D+Si/3byv0.MQa]=jHעWc$ +0{OAF '~zGz3'#R-NuX!j(rothxjVYآ F\$́r;pfЧ$}I"d`U뼡OzF+Tu^#/2*z~#Bى-!v,̃pdga;:׿K+9g +Yف.bwޠn}jɐ,1GeM3bH7o3z)endstream endobj -922 0 obj << +923 0 obj << /Type /Page -/Contents 923 0 R -/Resources 921 0 R +/Contents 924 0 R +/Resources 922 0 R /MediaBox [0 0 595.2757 841.8898] /Parent 898 0 R >> endobj -924 0 obj << -/D [922 0 R /XYZ 74.4095 793.4011 null] ->> endobj 925 0 obj << -/D [922 0 R /XYZ 74.4095 677.6448 null] +/D [923 0 R /XYZ 74.4095 793.4011 null] >> endobj 926 0 obj << -/D [922 0 R /XYZ 74.4095 644.0168 null] +/D [923 0 R /XYZ 74.4095 677.6448 null] >> endobj 927 0 obj << -/D [922 0 R /XYZ 74.4095 611.0568 null] +/D [923 0 R /XYZ 74.4095 644.0168 null] >> endobj 928 0 obj << -/D [922 0 R /XYZ 74.4095 576.7609 null] +/D [923 0 R /XYZ 74.4095 611.0568 null] >> endobj 929 0 obj << -/D [922 0 R /XYZ 74.4095 543.8009 null] +/D [923 0 R /XYZ 74.4095 576.7609 null] >> endobj 930 0 obj << -/D [922 0 R /XYZ 74.4095 493.4697 null] +/D [923 0 R /XYZ 74.4095 543.8009 null] >> endobj 931 0 obj << -/D [922 0 R /XYZ 74.4095 440.1765 null] +/D [923 0 R /XYZ 74.4095 493.4697 null] >> endobj -921 0 obj << +932 0 obj << +/D [923 0 R /XYZ 74.4095 440.1765 null] +>> endobj +922 0 obj << /Font << /F63 220 0 R /F35 193 0 R /F28 173 0 R /F70 552 0 R /F69 561 0 R /F65 558 0 R /F74 555 0 R /F88 714 0 R >> /ProcSet [ /PDF /Text ] >> endobj -935 0 obj << -/Length 2484 +936 0 obj << +/Length 2458 /Filter /FlateDecode >> stream -xڭYAs۸Wh,EItmӾN;}蘱RF7; ,ɲӾL G -fYHf,B `v{#g̻>7o,aP8 ޮ6OykR%<e,zT؝-֋ef7o;"ZQEdT:M;I*v,P" [g"Iv :7Eހھ\qeW%5nB0m^o ^LF+{q^ީtkZ(:+4zyȹ-׾є%RjnR8&*tSt+|Ŗwa:͓ﷸz[u2VyPì609sP_ʑ:R @:SXٜzM_ P7f ?hxU #un͠vw~vU.~;ɍݙm [R:o !-Nd'5 %E@XД;*ʋD0Ad3JƱ&O?̓O:v)yE -J5b/krVClWNJU:vOG[<`c9untȱCt`F S3H(%3hAcP?nZ?LZqI'A>![u¨/h4V:fPQ%h 64ݢ~M mmiોKA.ʸġυiC\=fوkqtv2v"<X) #ux1+b*HYa {Y+. Da1B K`*KLRI >Ɉb f:DĻ1P4nu~ݷOQU59OQA -'|UM$5Bʁ,2𒃫c_2E1a9iRw ,IgSZH8[뜳yWԃpԡɁIH1~9wn sMMMv&ɃEc:@{@L( j`E$x~s$X<o OE}Oyĺ&naƓl5}Ү<`%ލ8L JRΉbq(]r~Ŝ&߽i DCq2t|q@Z}fؙLcg,YM{*[lem(N'&o-LA<8OdʴgګS`€Ck!oglޠԥt/9y&0v}þӫe`OHmRaZS9TӬuB"Iu3TնmN~^xh(7ƶgukOvSLqٶS.53۴ps"PLlM151|5uQ5E*ALg$sg cX3 6`c QdfN*kQэuIOOjn{A(|䖚 |1+ԄS&ƽfO$hGt @)=\ BCf$lsHmCUo"7s-imlQ38]7 f.k ZӶoTr*V+_kwD>8l3aZri0!D\L5|&ǀ>bzPfC뻎o]6$U+4\/ٿEJdig%U# #Kۚo[ DX^lOuEKnlI3 P'6Uܦm)>zc vϴOhR?W2¢ģ[iPxt%7t_u}T;7VB9ӴpeC^LMڙbT:Nl=5~{4ZYn;\'8VE"VNLwp )h{k8|cK3~RgSMdugė{y 2>!.Og̓U ^e[wሼ7YGH>;8*p~݀JRbᶙ7Fp݁ hG_621_OЖ{ ˊrࠞVB*Y:B2SWcdxө՞&TD +?LX=|B3s/SѸ')AӁ\_0n_AZ{C HhW)Lw{VR|y2r6'!8:NCs$5 \  +eP\iRt\a%ҖM,Jy;%Я%' Htx#27l0B*,ht{կM Q\N6c,>:$<.Q"u<H9)2WtuKEXs2H~xɘMCyw"جZBl ef.~(G‹"*v( "ѯlVB$LOar|D`g%/wc^Qnk&DM)9$FCDH=,V9cM쓭^%BNkap6)Q B ahop):#h?w~#㙳)DzOΜQ=q q;<ų`Ig{(r&he $=j}ё~n2flZBN JC:lpړ. +٧g}0Y_)7_e"Aɂڵ%جlyphzYk^t) "u6*|Wʺmkq 7XJA!=4mWeq}fA-FcE]ovivWiY:%uV-Z˩̝n6 >%x7\@$ !-عPkdwc/ +wI(ZI.xAzjTsk< g_1)Qb|` Х]g&ɵ)1alMθfX|0r]}!;u0~kcۥ=8u"!J*zYfZL_Yl,ܰřw TdڒVgjrOH&xzٍ䉾ٸG[lhmimh +=$5o^yuEʴA̱&4BȨ#No'2|r4l,65Aۺ)D*Lx=Z[["-jV caa!/nEܔ8?DUZYz"JGa1H<S/'L^գ|s߷#*[Ztu%<~ + [l8HgLBnh~p}\Xv}@O%!sLeZrXN&B=|e_yW< SHe׀i\:q\ɋtQ'l9F1 5`o ?n?߂^>@cĥs>Zendstream endobj -934 0 obj << +935 0 obj << /Type /Page -/Contents 935 0 R -/Resources 933 0 R +/Contents 936 0 R +/Resources 934 0 R /MediaBox [0 0 595.2757 841.8898] /Parent 898 0 R -/Annots [ 937 0 R ] +/Annots [ 938 0 R ] >> endobj -937 0 obj << +938 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [230.1856 677.3643 249.6264 687.9466] /Subtype /Link /A << /S /GoTo /D (figure.4.10) >> >> endobj -936 0 obj << -/D [934 0 R /XYZ 74.4095 793.4011 null] +937 0 obj << +/D [935 0 R /XYZ 74.4095 793.4011 null] >> endobj 134 0 obj << -/D [934 0 R /XYZ 74.4095 771.7323 null] +/D [935 0 R /XYZ 74.4095 771.7323 null] >> endobj -933 0 obj << +934 0 obj << /Font << /F63 220 0 R /F26 170 0 R /F28 173 0 R /F35 193 0 R >> /ProcSet [ /PDF /Text ] >> endobj -940 0 obj << -/Length 1351 +941 0 obj << +/Length 1354 /Filter /FlateDecode >> stream -xڭWKHWX /VVqvI;mU.ҩWuUGxkyzq`!θOr0~v7z)/aiinI 88[d;L1d̓svW)5<ߖ׳wcPrD `QSAKA1$H(T>{2ԪӚah ^mWwsH6fJ)xF}.דE J Td7!O~n%+8{r T1KEy('ɌZ?H&˩,߾WQƭ>uSz(ق"ʿoSM5W0ȱДh{c{GV[ߌ/깹% Ѡ/q?W5-[ӛP_yxq*Yvib s<f -:Zv)ͻY>dZr`mhzƙiQ} 9biK$7#3 D!0{-/}'?ራendstream +xڭW]8}﯈)I'͈i=!MJPvV:vLeP=>!$8QV0- al:9dQ +)ytsQެoX]%)$ǯJoumnǛ77SXA1ʥ?#q!(Igsblɦa@ї +| _&0qzIY\-Cb4+*r}3 ay +"d2 7ʄ4ʑ%==& DhA2;Cm$IFDP Agx+rsh^aϵvFWfvP2kS@r300'3r=)d$V'6'Bxfi +D P3L^;n_ qSu +uUYnUc@bpj5kBE'DJ R#:r,5,G7 :E_D +v10S-Wԇ33oYy!Ad Ø=~@@N1j4d#.P.p]_Vfzi镟ژ0ի?`]_>qDG?m(B]^vkjMӁS2XT7־ח/-0)u:o]{MSiU[Uunc/_\J w+w\+k[S0Ukfߜ(F_:NnLwѮշWY9G՗vQwgR~Og2+\#?jW9`])( 棝@dy$4