diff options
| author | Paul Buetow <paul@buetow.org> | 2008-08-09 19:43:56 +0000 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2008-08-09 19:43:56 +0000 |
| commit | 0a18dc94f2bde02b00eb1f36514dfe1aee2041b3 (patch) | |
| tree | 867b24e6da1c644adecb048bfbe2b01fe3f1469a /LaTeX | |
| parent | f7264a8b951278c3eeb43b013da053f578085570 (diff) | |
sequence dia
Diffstat (limited to 'LaTeX')
| -rw-r--r-- | LaTeX/argouml.zargo | bin | 42880 -> 50590 bytes | |||
| -rw-r--r-- | LaTeX/chapters/implementierung.tex | 69 | ||||
| -rw-r--r-- | LaTeX/diplomarbeit.pdf | 6174 | ||||
| -rw-r--r-- | LaTeX/images/SequenceDiagram2.eps | 679 | ||||
| -rw-r--r-- | LaTeX/images/sequence-serialize.eps | 186 |
5 files changed, 3333 insertions, 3775 deletions
diff --git a/LaTeX/argouml.zargo b/LaTeX/argouml.zargo Binary files differindex e828d4a..579a0d2 100644 --- a/LaTeX/argouml.zargo +++ b/LaTeX/argouml.zargo diff --git a/LaTeX/chapters/implementierung.tex b/LaTeX/chapters/implementierung.tex index 6f147e0..9b69bf0 100644 --- a/LaTeX/chapters/implementierung.tex +++ b/LaTeX/chapters/implementierung.tex @@ -26,7 +26,7 @@ In diesem Kapitel wird auf die Implementierung des Simulators eingegangen. Der S \label{tb:Pakete}
\end{table}
-Da es sonst den Rahmen sprengen w\"{u}rde, soll im Folgenden der komplette Quelltext nicht bis in das letzte Detail behandelt werden. Der Quelltext erstreckt sich n\"{a}mlich, einschlielich Kommentare, auf \"{u}ber 15.000 Zeilen und \"{u}ber 59 Dateien. Zudem ist die generierte Quelltext-Dokumentation (Javadoc) \"{u}ber 2MB gro. Alle folgenden UML-Diagramme stellen aufgrund der \"{U}bersichtlichkeit lediglich die wesentlichen Dinge dar. Alle Details lassen sich im Quelltext und der dazugeh\"{o}rigen Dokumentation einsehen. Die Paketstruktur des Quelltextes ist in Tabelle \ref{tb:Pakete} in alphanumerischer Reihenfolge aufgef\"{u}hrt.
+Da es sonst den Rahmen sprengen w\"{u}rde, soll im Folgenden der komplette Quelltext nicht bis in das letzte Detail behandelt werden. Der Quelltext erstreckt sich n\"{a}mlich, einschlielich Kommentare, auf \"{u}ber 15.000 Zeilen und \"{u}ber 61 Dateien. Zudem ist die generierte Quelltext-Dokumentation (Javadoc) \"{u}ber 2MB gro. Alle folgenden UML-Diagramme stellen aufgrund der \"{U}bersichtlichkeit lediglich die wesentlichen Dinge dar. Alle Details lassen sich im Quelltext und der dazugeh\"{o}rigen Dokumentation einsehen. Die Paketstruktur des Quelltextes ist in Tabelle \ref{tb:Pakete} in alphanumerischer Reihenfolge aufgef\"{u}hrt.
\section{Einstellungen und Editoren}
@@ -90,7 +90,9 @@ Hierbei stellt \textit{key} den Variablennamen- und \textit{val} den Variablenwe \textit{VSPrefs} speichert alle Integervariablen in einem \textit{HashMap<String,Integer>}-Objekt ab, wobei der String-Wert den Variablenamen \textit{key} angibt. F\"{u}r die Beschreibung \textit{descr}, den Einheiten-String \textit{unit} sowie m\"{o}glichen Minimum- und Maximumwerte werden separate Instanzen von \textit{HashMap} verwendet. Da alle \textit{HashMap}-Objekte synchronisiert sind, k\"{o}nnen alle Methoden von verschiednenen Threads gleichzeitig verwendet werden.
-Die Klasse \textit{VSDefaultPrefs} erweitert \textit{VSPrefs} und initialisiert bei Instanzierung automatisch alle verf\"{u}gbaren Simulationsvariablen mit ihren Standardwerten. Dort sind auch alle Spracheinstellungen abgelegt. Sollte jemand den Simulator in eine andere Sprache, zum Beispiel ins Englische, \"{u}bersetzen wollen, so mu er lediglich diese Datei und die Protokoll-Klassen (mehr dazu sp\"{a}ter) editieren. Die Spracheinstellungen sind n\"{a}mlich in einem \textit{VSPrefs}--Objekt als versteckte String-Variablen abgespeichert. Spracheinstellungen f\"{u}r Protokolle wurden in den Protokollklassen direkt angegeben, da dies mehr Komfort f\"{u}r den Protokollentwickler bietet und f\"{u}r jede neue Textausgabe nicht st\"{a}ndig \textit{VSDefaultPrefs.java} editiert werden muss.
+\textit{VSSerializablePrefs} implementiert das Interface \textit{VSSerializable} und kann somit alle enthaltenen Daten in eine Datei abspeichern und neu laden. Auf die Serialisierung und Deserialisierung von Simulationen wird sp\"{a}ter genauer eingegangen.
+
+Die Klasse \textit{VSDefaultPrefs} erweitert \textit{VSSerializablePrefs} und initialisiert bei Instanzierung automatisch alle verf\"{u}gbaren Simulationsvariablen mit ihren Standardwerten. Dort sind auch alle Spracheinstellungen abgelegt. Sollte jemand den Simulator in eine andere Sprache, zum Beispiel ins Englische, \"{u}bersetzen wollen, so mu er lediglich diese Datei und die Protokoll-Klassen (mehr dazu sp\"{a}ter) editieren. Die Spracheinstellungen sind n\"{a}mlich in einem \textit{VSPrefs}--Objekt als versteckte String-Variablen abgespeichert. Spracheinstellungen f\"{u}r Protokolle wurden in den Protokollklassen direkt angegeben, da dies mehr Komfort f\"{u}r den Protokollentwickler bietet und f\"{u}r jede neue Textausgabe nicht st\"{a}ndig \textit{VSDefaultPrefs.java} editiert werden muss.
Alle Variablen die als Prefix \textit{lang}, \textit{keyevent}, \textit{div} oder \textit{col} tragen, sind versteckte Variablen und werden in einem Editor nicht angezeigt. Im Expertenmodus sind hingegen nur Variablen die mit \textit{lang} und \textit{keyevent} beginnen versteckt. Somit lassen sich im Expertenmodus weitere Variablen vom Anwender editieren.
@@ -98,7 +100,7 @@ Alle Variablen die als Prefix \textit{lang}, \textit{keyevent}, \textit{div} ode \begin{figure}[h]
\centering
- \includegraphics[width=11cm]{images/prefs-editors}
+ \includegraphics[width=10.5cm]{images/prefs-editors}
\caption{Das Paket \textit{prefs.editors}}
\label{fig:PackagePrefsEditors}
\end{figure}
@@ -170,7 +172,9 @@ Jede Ereiginsklasse hat zudem Zugriff auf folgende Attribute, die von \textit{VS \subsection{Beispielimplementierung eines Ereignisses}
-Im Folgenden wird als Beispiel die Implementierung des Prozessabsturzereignisses \textit{VSProcessCrashEvent} behandelt. Da die dazugeh\"{o}rige Klasse keine Attribute besitzt, verbleibt hier auch die \textit{initCopy}-Methode mit leerem Rumpf. Jede Ereignisklasse muss in \textit{onInit()} mit \textit{setClassname} den eigenen Klassennamen mitteilen. In \textit{onStart()} wird das eigentliche Ereignis ausgef\"{u}hrt. Hier wird obligatorisch \"{u}berpr\"{u}ft, ob der Prozess bereits abgest\"{u}rzt (hier eigentlich nicht Notwendig, verbessert aber die Lesbarkeit der Logik) ist und gegebenenfalls wird der Prozess dann zum Absturz bewegt. Der Task-Manager \"{u}berpr\"{u}ft bereits, ob der Prozess abgest\"{u}rzt ist oder nicht, d.h. ein Ereignis wird bei einem abgest\"{u}rztem Prozess gar nicht erst ausgef\"{u}hrt. Die einzige Ausnahme bildet ein Wiederbelebungsereignis (\text{VSProcessRecover}), welches vom Task-Manager ausgef\"{u}hrt wird, auch wenn der Prozess abgest\"{u}rzt ist. Mit \textit{logg} wird eine Nachricht in das Loggfenster geschrieben, welche ueber das \textit{VSPrefs}-Objekt \textit{prefs} bezogen wird:
+Im Folgenden wird als Beispiel die Implementierung des Prozessabsturzereignisses \textit{VSProcessCrashEvent} behandelt. Da die dazugeh\"{o}rige Klasse keine Attribute besitzt, verbleibt hier auch die \textit{initCopy}-Methode mit leerem Rumpf. Jede Ereignisklasse muss in \textit{onInit()} mit \textit{setClassname} den eigenen Klassennamen mitteilen. In \textit{onStart()} wird das eigentliche Ereignis ausgef\"{u}hrt. Hier wird obligatorisch \"{u}berpr\"{u}ft, ob der Prozess bereits abgest\"{u}rzt (hier eigentlich nicht Notwendig, verbessert aber die Lesbarkeit der Logik) ist und gegebenenfalls wird der Prozess dann zum Absturz bewegt.
+
+Der Task-Manager \"{u}berpr\"{u}ft bereits, ob der Prozess abgest\"{u}rzt ist oder nicht, d.h. ein Ereignis wird bei einem abgest\"{u}rztem Prozess gar nicht erst ausgef\"{u}hrt. Die einzige Ausnahme bildet ein Wiederbelebungsereignis (\text{VSProcessRecover}), welches vom Task-Manager ausgef\"{u}hrt wird, auch wenn der Prozess abgest\"{u}rzt ist. Mit \textit{logg} wird eine Nachricht in das Loggfenster geschrieben, welche ueber das \textit{VSPrefs}-Objekt \textit{prefs} bezogen wird:
\begin{code}
package events.implementations;
@@ -514,26 +518,71 @@ Das Paket \textit{simulator} (vereinfacht auf Abbildung \ref{fig:PackageProtocol Beim Starten des Simulators wird auf die Main-Methode, welche sich in \textit{VSMain} befindet, aufgerufen. Sie instanziiert ein \textit{VSDefaultPrefs}-Objekt, wo alle Standardeinstellungen des Simulators abgelegt sind. Anschlieend wird ein \textit{VSSimulatorFrame} erzeugt, welches ein Simulatorfenster (wie bereits schon auf Abbildung \ref{fig:NeuesFenster} zu sehen war) implementiert. Das Simulatorfenster erstellt f\"{u}r 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 dazugeh\"{o}rige 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} zur\"{u}ck, was die Simulationsvisualisierung (Abbildung \ref{fig:Visualisierung}) implementiert.
-\textit{VSSimulatorVisualization} ist bei Weitem die kryptischste Klasse des Simulators. Die greift auf die Java2D-Grafikbibliothek zur\"{u}ck und ist aus Performancegr\"{u}nden mit dem Simulationsverlauf stark verzahnt. Variablen, die stets den selbe Wert haben, wurden stets als finale Variablen angelegt. Variablen, die von Konfigurationen oder Einstellungen abh\"{a}ngig sind, die sich nur nach Konfigurations\"{a}nderung oder Vergr\"{o}ern beziehungsweise Verkleinern des Simulationsfensters \"{a}ndern, werden nur wenn es n\"{o}tig ist neu berechnet.
+\textit{VSSimulatorVisualization} ist bei Weitem die kryptischste Klasse des Simulators. Die greift auf die Java's Grafikbibliothek Java2D zur\"{u}ck und ist aus Performancegr\"{u}nden mit dem Simulationsverlauf stark verzahnt. Variablen, die stets den selbe Wert haben, wurden stets als finale Variablen angelegt. Variablen, die von Konfigurationen oder Einstellungen abh\"{a}ngig sind, die sich nur nach Konfigurations\"{a}nderung oder Vergr\"{o}ern beziehungsweise Verkleinern des Simulationsfensters \"{a}ndern, werden nur wenn es n\"{o}tig ist neu berechnet.
Die Klasse \textit{VSMenuItemStates} wird f\"{u}r die Synchronisierung des Simulationsstatusses, der Toolbar und des Simulations-Men\"{u}s (beide Letztere auf Abbildung \ref{fig:Toolbar} zu sehen) verwendet. Damit ist gemeint, ob die Simulation bereits gestartet wurde oder nicht oder gegebenenfalls schon abgelaufen ist. Oder ob die Simulation sich in einem pausierten Status befindet. Abh\"{a}ngig davon kann der Benutzer bestimmte Aktionen durchf\"{u}hren oder nicht (beispielsweise kann eine Simulation nur pausiert werden, wenn sie aktuell abgespielt wird). Alle hier m\"{o}glichen 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 und es automatisch in ein \textit{VSTask}-Objekt gekapselt f\"{u}r eine sp\"{a}tere Ausf\"{u}hrung dem Task-Manager \"{u}bergibt.
-\textit{VSLogging} kapselt ein \textit{javax.swing.JTextArea}-Objekt, wo alle Nachrichten geloggt werden. Hier werden alle Loggfunktionen (inklusive Loggfilter sowie tempor\"{a}re Deaktivierung des Loggen) implementiert. Die \textit{JTextArea} wird dem \textit{VSSimulator}-Objekt \"{u}bergeben und dort dargestellt.
+\textit{VSLogging} kapselt ein \textit{javax.swing.JTextArea}-Objekt, wo alle Nachrichten geloggt werden. Hier werden alle Loggfunktionen (inklusive Loggfilter sowie tempor\"{a}re Deaktivierung des Loggen) implementiert. Die \textit{JTextArea} wird dem \textit{VSSimulator}-Objekt \"{u}bergeben und dort dargestellt. F\"{u}r den Loggfilter wird intern auf das Java-Standardpaket \textit{java.util.regex} zugegriffen, womit anhand von regul\"{a}ren Ausdr\"{u}cken in Java-Syntax die Loggs gefiltert werden k\"{o}nnen.
+
+\section{Serialisierung und Deserialisierung von Simulationen}
-\section{Serialisierung von Simulationen}
+Der Anwender kann eine erstellte Simulation im Datei-Men\"{u} speichern und/oder eine bereits abgespeicherte Simulation laden. Hierbei wird von den aus Java angebotenen M\"{o}glichkeit Objekte zu Serialisieren gebrauch gemacht. Im Paket \textit{serialize} (Abbildung \ref{fig:PackageSerialize}) befinden sich Helferklassen, die bei einer Serialisierung und einer Deserialisierung einer Simulation unter die Arme greifen.
-Der Anwender kann eine erstellte Simulation im Datei-Men\"{u} speichern und/oder eine bereits abgespeicherte Simulation laden. Hierbei wird auf die von Java angebotene M\"{o}glichkeit Objekte zu Serialisieren gebrauch gemacht. Im Paket \textit{serialize} befinden sich Helferklassen, 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:
+
+\begin{itemize}
+ \item \textit{public void serialize(VSSerialize serialize, ObjectOutputStream oos)}: Diese Methode wird bei jedem Serialisierungsvorgang aufgerufen (beim Speichern einer Simulation).
+ \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. F\"{u}r jeden (De)serialisierungsvorgang wird ein \textit{VSSerialize}-Objekt erzeugt, welches dabei Hilft die ben\"{o}tigten Aktionen durchzuf\"{u}hren. Eine zu serialisierende Simulation besteht aus vielen voneinander abh\"{a}ngigen Objekte. Jedes Objekt kann dabei Referenzen auf andere Objekte besitzen. W\"{u}rde jedes Objekt komplett serialisiert werden, so w\"{u}rden Objekte, auf denen mehrere Referenzen existieren, in mehrfacher Ausf\"{u}hrung seriaisiert werden. Bei Kreissverweisen w\"{u}rde die Serialisierung sogar in einer Endlosschleife enden.
+
+\textit{VSSerialize} hilft hierbei dies zu vermeiden und merkt sich Informationen von allen bereits serialisierten Objekten, sodass 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.
+
+Da \textit{VSAbstractEvent} und \textit{VSAbstractProcess} die Klasse \textit{VSSerializablePrefs} erweitern, sind automatisch auch alle Ereignisobjekte (und somit auch alle Protokollobjekte) und Prozessobjekte serialisierbar.
\begin{figure}[h]
\centering
\includegraphics[width=13cm]{images/serialize}
- \caption{Das Paket \textit{serialize}}
+ \caption{Das Paket \textit{serialize} und serialisierbare Klassen}
\label{fig:PackageSerialize}
\end{figure}
-\subsubsection{R\"{u}ckw\"{a}rtskompatibel}
+Abgespeicherte Simulationen sollen auch mit zuk\"{u}nftigen Versionen des Simulators kompatibel bleiben. Deshalb werden alle Objekte derjenigen Klassen, die \textit{VSSerializable} implementieren, nicht komplett serialisiert. Bei der Serialisierung werden nur relevante Klassenattriute, die der Simulationsprogrammierung- und nicht bispielsweise GUI-komponenten angeh\"{o}ren, serialisiert.
+
+Der folgende Quelltext-Ausschnitt zeigt eine Beispielimplementierung von \textit{serialize}:
+
+\begin{code}
+ public synchronized void serialize(VSSerialize serialize,
+ ObjectOutputStream oos)
+ throws IOException {
+ oss.writeObject(new Boolean(false)); // flag
+ oss.writeObject(attributeOne);
+ oss.writeObject(ottributeTwo);
+ serialize.setObject("sampleObject", this);
+ prefs.serialize(serialize, oos);
+ someOtherSerializableObject.serialize(serialize, oos);
+ oss.writeObject(new Boolean(false)); // flag
+ }
+\end{code}
+
+Vor- und nach der eigenlichen Objektserialisierung wird jeweils ein boolsches Flag serialisiert, welches auf \textit{true} gesetzt wird, sobald in sp\"{a}teren Simulator-Versionen (was relativ unwahrscheinlich, aber m\"{o}glich ist) weitere zu serialisierende Klassenattribute hinzukommen. Eine Deserialisiernug kann die Flags dann abfragen und separat behandeln. Somit bleiben \"{a}ltere bereits abgespeicherte Simulationen stets zur neusten Version des Simulators kompatibel. Wenn ein Flag auf \textit{true} gesetzt wird, dann kann unter den neuen Attributserialisierungen ein weiteres Flag gesetzt werden. Somit k\"{o}nnen beliebig viele Erweiterungen in die Serialisierung Einzug halten.
+
+Das zu serialisierende Objekt besitzt hier lediglich zwei Attribute, die serialisiert werden sollen. Alle anderen Klassenattribute k\"{o}nnen vernachl\"{a}igt werden. Mit \textit{serialize.setObject} speichert \textit{serialize} eine Referenz auf das aktuelle Objekt ab, worauf andere Objektserialisierungen zur\"{u}ckgreifen k\"{o}nnen. 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 nachtr\"{a}glich die relevanten Attribute deserialisiert und den Objekten zugewiesen werden. Hierbei werden auch mithilfe von \textit{VSSerialize} mehrere Referenzen auf das selbe Objekt korrekt behandelt.
+
+Wenn der Anwender \textit{Datei $\rightarrow$ Simulation speichern} w\"{a}hlt, dann wird zun\"{a}chst ein \textit{VSSerialize}-Objekt erstellt. Ausgehend davon wird \textit{serialize} auf \textit{VSSimulator} ausgef\"{u}hrt (siehe Serialisierungssequenz auf Abbildung \ref{fig:SequenceSerialize}). Das Simulator-Objekt f\"{u}hrt \textit{serialize} wiederum auf das \textit{VSSimulatorVisualization}-Objekt aus. Dort wird jeder Prozess inklusive alle Protokollobjekte serialisiert. Anschliessend folgt der Task-Manager inklusive allen programmierten Ereignissen. Alle Instanzen von \textit{VSSerializablePrefs} werden automatisch mitserialisiert. Sie beinhalten alle Simulationseinstellungen.
+
+\begin{figure}
+ \centering
+ \rotatebox{90}{%
+ \includegraphics[width=22cm]{images/sequence-serialize}
+ }
+ \caption{Serialisierungssequenz}
+ \label{fig:SequenceSerialize}
+\end{figure}
+
\section{Helferklassen und Klassen f\"{u}r Ausnahmebehandlungen}
diff --git a/LaTeX/diplomarbeit.pdf b/LaTeX/diplomarbeit.pdf index df41049..ad0a15b 100644 --- a/LaTeX/diplomarbeit.pdf +++ b/LaTeX/diplomarbeit.pdf @@ -249,7 +249,7 @@ endobj << /S /GoTo /D (section.3.6) >> endobj 172 0 obj -(\376\377\0003\000.\0006\000\040\000S\000e\000r\000i\000a\000l\000i\000s\000i\000e\000r\000u\000n\000g\000\040\000v\000o\000n\000\040\000S\000i\000m\000u\000l\000a\000t\000i\000o\000n\000e\000n) +(\376\377\0003\000.\0006\000\040\000S\000e\000r\000i\000a\000l\000i\000s\000i\000e\000r\000u\000n\000g\000\040\000u\000n\000d\000\040\000D\000e\000s\000e\000r\000i\000a\000l\000i\000s\000i\000e\000r\000u\000n\000g\000\040\000v\000o\000n\000\040\000S\000i\000m\000u\000l\000a\000t\000i\000o\000n\000e\000n) endobj 173 0 obj << /S /GoTo /D (section.3.7) >> @@ -748,19 +748,14 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 255 0 obj << -/Length 1958 +/Length 1967 /Filter /FlateDecode >> stream -xYoH)(^L/\K@GO?$lj' -$0`_]şhQ -#N xXqF{ۏOi7A/n -Kֲy[p N{~ΧwkV5C]˳7)Z9% ^l^`% ETq/ßg1:fdZzuW\K}?+3()EJKA2cZ\7X.挆m"N
8kUEi:I2&eUnq*6|}:d+b0נqΈž5WӬ'?uW4ӕIHO!ɨ%2#"nu,ٰlLQ+Ƕf`Tc6BmZKLa`RȯNA&1. e(_Ac+iy 3jؗw)tS)fuhiZBhMD⡪ڼSJD-WTX6C5c?n<`v`$]_M F^hIɳAKxi-Q^N]4cpO{U-Vz020p/EpE$bJqC 0 -ͥ*)nH=}xۇKއc5t==nO33>WfM,S8xx<"yZC\&zecD.Y1S]DS\UU+N?;6b@Ez -z^@6Eyl߅fz8.B(%ELT]u)ҍwHty"yk*Z{QK50s><v4)JK_'6&Šxҏ#_9j$&j
vbuJsѹdwayӫdFi-؝tD9DKN/E*"
UZDꕕ\*s$Y 3743pwjB=4*j>*/Y=oL:D˺<Πe_ojxx^s,, Uf#B0"֣|^ .2 b
@Zi!](` -JT}7յ?Ajem -tSUWqbPENZv*5ׂ?F%K4pj
TYf[ŲXgth:Nj؟ˠʸͅ%ǫG%XhLWk`]~zM'a
Vrw>ͱFGCK/z/ߔ.) -6ELT'=}>#Нì^ "I3D-sv8im{ȑÛ/R77{|߷1X#^@H[+f*^3S;MKխ[;)/u!RÊ\Zw$c#6HD7YAsyLddП~ n2'$~C]Ƨ]pX$hYσ*+n2j~3=-!VCګCH +x[o)(tݦ7,>(6c. gH9g((&0`_s|.#Xa$ԩ8+n/hq:&7͋YaZ79aaћaժ<f}_7|8%Vk4RË
<\Xݫ$u*Exm*G6ه..Yo֫rƮݕ>WROʌ&JJQĶR*b9'V
19!bAbd`pF.vN҆ z]էsAʺ
ߥk·#<= +0&5g3"co4ƿ=}_i9ty e{q>i)D2jy/{]/d6l:y:wx.Sߊ;Uƥإ@bDc:S*f0y ++uНG$;OWkHT$bVL}Lȥ 4fjthyKʠxũ`cѦrT,hrbVUR\#㻐 +3xH{KtQ!.b3^w+}8GXNaC<aTi gP-\/tfzf>KÌ LEe\bxAMTsj =#G@A'fendstream endobj 254 0 obj << /Type /Page @@ -878,7 +873,7 @@ endobj 275 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [86.8628 487.8774 235.0054 498.4597] +/Rect [86.8628 487.8774 319.4854 498.4597] /Subtype /Link /A << /S /GoTo /D (section.3.6) >> >> endobj @@ -1156,24 +1151,21 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 343 0 obj << -/Length 1259 +/Length 1360 /Filter /FlateDecode >> stream -xnF~ -.LUY2ŐáFΡf8!VPaDR -0Vwx~?Y]2VpϚ8eqJ>sdtPo_vOǿKߒGkWtߧS56)b CTqx*o91
pөzQI4zGitڇ^NS}6vZUɒ.h$5)jEAAZ/~{&"9ep{Մiw%bY2C됕p`x\2|٬N~W.: -j[uxY.DKs1Iz':Ӝ0UD!0RKwֽjd*'0a9/~\=^KIO%NMӅ |>]g-FN5Q73Pa+Wl4ZÍejP{Ǜ a c
D:pťnPM)sr7Jzj3ԸiiMPYP@
%JPZjjjM`*]aw:z%hFuHHhUJ+C6+dNQ;k%&Œ]т@Lu.);./ BC"{U2XKWK9Ea&6fx6jx;?Ygç^V_ -wR(<vq<?N9eF&i//
cX~
O5f*HEk7*lћ)vQq;Dg6ntҍэFkohYt+N4"M -˩ޤp4-rFn;^t'.v8=`G`c'm97r("$s/fnI)rIWT
7^\ҌFk?FJT0yGZ^V0P3n&/db
^endstream +xKoF<ؠKЃl3=\I.|\j0|m
oG]+$:U'~sCGxu`|f%NkYܾ/kONo-~+]្ET2x?lC7?j/M +A(5X
yk!?kUQrzriEjT0c%U䤨$ im>?~}C@e&tO5+GzBxY֛tYձm%7V{^\m6vX%ךhuqJ&A3 N94g9kQh5:u/jL@F&GAX#WRccSDZ8xWiWeYg8YM͌#TAzA{FOp<X9U;
pyFR=0N$sWN\pD
0'E|F>Azk45ux 0\24u0P +RxGSjMVv)00d52I{A, =5 k\[#7_4#9~2yLТcc"Jxh#jw#omm_δwFj-:}W|dzkT?4,'g;ݡ endobj 342 0 obj << /Type /Page /Contents 343 0 R /Resources 341 0 R /MediaBox [0 0 595.2757 841.8898] -/Parent 358 0 R -/Annots [ 345 0 R 346 0 R 347 0 R 348 0 R 349 0 R 350 0 R 351 0 R 352 0 R 353 0 R 354 0 R 355 0 R 356 0 R 357 0 R ] +/Parent 359 0 R +/Annots [ 345 0 R 346 0 R 347 0 R 348 0 R 349 0 R 350 0 R 351 0 R 352 0 R 353 0 R 354 0 R 355 0 R 356 0 R 357 0 R 358 0 R ] >> endobj 345 0 obj << /Type /Annot @@ -1248,24 +1240,31 @@ endobj 355 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [86.8628 569.3622 185.8662 577.927] +/Rect [86.8628 569.3622 296.1243 577.927] /Subtype /Link /A << /S /GoTo /D (figure.3.9) >> >> endobj 356 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [86.8628 551.4349 168.9961 559.9997] +/Rect [86.8628 549.6237 202.4313 560.206] /Subtype /Link /A << /S /GoTo /D (figure.3.10) >> >> endobj 357 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [86.8628 531.8041 195.644 542.0725] +/Rect [86.8628 533.5077 168.9961 542.0725] /Subtype /Link /A << /S /GoTo /D (figure.3.11) >> >> endobj +358 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [86.8628 513.8769 195.644 524.1452] +/Subtype /Link +/A << /S /GoTo /D (figure.3.12) >> +>> endobj 344 0 obj << /D [342 0 R /XYZ 74.4095 793.4011 null] >> endobj @@ -1273,7 +1272,7 @@ endobj /Font << /F61 259 0 R /F28 209 0 R >> /ProcSet [ /PDF /Text ] >> endobj -374 0 obj << +376 0 obj << /Length 1851 /Filter /FlateDecode >> @@ -1292,158 +1291,158 @@ U2ɢL`?Et(*mv`۱Q-Nv4< Z f ugܟGΨ<g=;
L,S(V;ZU4oX-o݇7AjGkgTm{wY_2wZoW{ :Tea'\; {/Z[ozF.9L:vF51<S[u(~=|صloO|!,d"sZ͋:=ݬu<KXPbM[JtgwjXjco6 )u_0Ik :dA_|lendstream endobj -373 0 obj << +375 0 obj << /Type /Page -/Contents 374 0 R -/Resources 372 0 R +/Contents 376 0 R +/Resources 374 0 R /MediaBox [0 0 595.2757 841.8898] -/Parent 358 0 R -/Annots [ 377 0 R 378 0 R 379 0 R 380 0 R 381 0 R 382 0 R 383 0 R 384 0 R 385 0 R 386 0 R 387 0 R 388 0 R 389 0 R 390 0 R 391 0 R 392 0 R 393 0 R 394 0 R 395 0 R ] +/Parent 359 0 R +/Annots [ 379 0 R 380 0 R 381 0 R 382 0 R 383 0 R 384 0 R 385 0 R 386 0 R 387 0 R 388 0 R 389 0 R 390 0 R 391 0 R 392 0 R 393 0 R 394 0 R 395 0 R 396 0 R 397 0 R ] >> endobj -377 0 obj << +379 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [86.8628 612.425 338.2165 623.0073] /Subtype /Link /A << /S /GoTo /D (table.2.1) >> >> endobj -378 0 obj << +380 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [86.8628 594.4978 298.9616 605.0801] /Subtype /Link /A << /S /GoTo /D (table.2.2) >> >> endobj -379 0 obj << +381 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [86.8628 576.5706 180.2935 586.9466] /Subtype /Link /A << /S /GoTo /D (table.2.3) >> >> endobj -380 0 obj << +382 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [86.8628 558.6433 257.1971 569.0193] /Subtype /Link /A << /S /GoTo /D (table.2.4) >> >> endobj -381 0 obj << +383 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [86.8628 540.7161 289.7984 551.2984] /Subtype /Link /A << /S /GoTo /D (table.2.5) >> >> endobj -382 0 obj << +384 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [86.8628 522.7889 256.1481 533.1649] /Subtype /Link /A << /S /GoTo /D (table.2.6) >> >> endobj -383 0 obj << +385 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [86.8628 504.8616 335.2394 515.4439] /Subtype /Link /A << /S /GoTo /D (table.2.7) >> >> endobj -384 0 obj << +386 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [86.8628 486.9344 406.6109 497.5167] /Subtype /Link /A << /S /GoTo /D (table.2.8) >> >> endobj -385 0 obj << +387 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [86.8628 469.0072 319.7369 479.3832] /Subtype /Link /A << /S /GoTo /D (table.2.9) >> >> endobj -386 0 obj << +388 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [86.8628 451.0799 295.5011 461.6622] /Subtype /Link /A << /S /GoTo /D (table.2.10) >> >> endobj -387 0 obj << +389 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [86.8628 433.1527 301.3831 443.735] /Subtype /Link /A << /S /GoTo /D (table.2.11) >> >> endobj -388 0 obj << +390 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [86.8628 415.2255 371.7415 425.8077] /Subtype /Link /A << /S /GoTo /D (table.2.12) >> >> endobj -389 0 obj << +391 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [86.8628 397.2982 385.1908 407.8805] /Subtype /Link /A << /S /GoTo /D (table.2.13) >> >> endobj -390 0 obj << +392 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [86.8628 379.371 276.0623 389.747] /Subtype /Link /A << /S /GoTo /D (table.2.14) >> >> endobj -391 0 obj << +393 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [86.8628 361.4438 286.3466 371.8198] /Subtype /Link /A << /S /GoTo /D (table.2.15) >> >> endobj -392 0 obj << +394 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [86.8628 343.5165 356.705 353.8925] /Subtype /Link /A << /S /GoTo /D (table.2.16) >> >> endobj -393 0 obj << +395 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [86.8628 325.5893 370.1543 336.1716] /Subtype /Link /A << /S /GoTo /D (table.2.17) >> >> endobj -394 0 obj << +396 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [86.8628 299.5107 177.8368 308.0754] /Subtype /Link /A << /S /GoTo /D (table.3.1) >> >> endobj -395 0 obj << +397 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [86.8628 281.5834 345.4789 290.3545] /Subtype /Link /A << /S /GoTo /D (table.3.2) >> >> endobj -375 0 obj << -/D [373 0 R /XYZ 74.4095 793.4011 null] +377 0 obj << +/D [375 0 R /XYZ 74.4095 793.4011 null] >> endobj -376 0 obj << -/D [373 0 R /XYZ 74.4095 643.0739 null] +378 0 obj << +/D [375 0 R /XYZ 74.4095 643.0739 null] >> endobj -372 0 obj << +374 0 obj << /Font << /F26 206 0 R /F28 209 0 R /F61 259 0 R >> /ProcSet [ /PDF /Text ] >> endobj -417 0 obj << +419 0 obj << /Length 1758 /Filter /FlateDecode >> @@ -1458,35 +1457,35 @@ D|R]7yЎŋ"J,Z4,v2YZ)+EJyC".Ce /2|ʾGbڠ%"6c]+B?'5y{ K4<9s2GNBr{,KqY3R 3_kܸiʵ\yO`6zKiW QبנS2<'G3s96lΕcM|mekYsi,NC{jTI>H;Wqn5chk/}o이 endobj -416 0 obj << +418 0 obj << /Type /Page -/Contents 417 0 R -/Resources 415 0 R +/Contents 419 0 R +/Resources 417 0 R /MediaBox [0 0 595.2757 841.8898] -/Parent 358 0 R -/Annots [ 419 0 R ] +/Parent 359 0 R +/Annots [ 421 0 R ] >> endobj -419 0 obj << +421 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 0] /Rect [75.9058 417.1708 102.2418 425.7356] /Subtype /Link /A << /S /GoTo /D (cite.Tanenbaum) >> >> endobj -418 0 obj << -/D [416 0 R /XYZ 74.4095 793.4011 null] +420 0 obj << +/D [418 0 R /XYZ 74.4095 793.4011 null] >> endobj 6 0 obj << -/D [416 0 R /XYZ 74.4095 771.7323 null] +/D [418 0 R /XYZ 74.4095 771.7323 null] >> endobj 10 0 obj << -/D [416 0 R /XYZ 74.4095 570.9064 null] +/D [418 0 R /XYZ 74.4095 570.9064 null] >> endobj -415 0 obj << +417 0 obj << /Font << /F26 206 0 R /F28 209 0 R /F61 259 0 R >> /ProcSet [ /PDF /Text ] >> endobj -425 0 obj << +427 0 obj << /Length 1854 /Filter /FlateDecode >> @@ -1499,30 +1498,30 @@ cu>Nfk yK0<]6|z<s0c 17݇#rX$v; {*06UMvG}0=ϧz琹ӿuJh3)C@j RӔg:pKr+ʌW={&_ٽ#}1mGD9$= 0:T9s_S/lkYVim*+(3ZZp7M@4Io)4k蒾2B[Ǯ1b9k
%zdC1D6bOS&6βRQ
Ky ?lnf2Uu < endobj -424 0 obj << +426 0 obj << /Type /Page -/Contents 425 0 R -/Resources 423 0 R +/Contents 427 0 R +/Resources 425 0 R /MediaBox [0 0 595.2757 841.8898] -/Parent 358 0 R -/Annots [ 428 0 R ] +/Parent 359 0 R +/Annots [ 430 0 R ] >> endobj -421 0 obj << +423 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/usr/home/buetow/svn/vs/trunk/LaTeX/images/client-server.pdf) /PTEX.PageNumber 1 -/PTEX.InfoDict 431 0 R +/PTEX.InfoDict 433 0 R /Matrix [1.00000000 0.00000000 0.00000000 1.00000000 0.00000000 0.00000000] /BBox [0.00000000 0.00000000 382.00000000 112.00000000] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << -/R7 432 0 R ->>/Font << /R8 433 0 R >> +/R7 434 0 R +>>/Font << /R8 435 0 R >> >> -/Length 434 0 R +/Length 436 0 R /Filter /FlateDecode >> stream @@ -1530,60 +1529,60 @@ xTn0+xl{p%RE[$F/A,E"N~Ejx0"g槮Ӣ>yTFc5P (C!R;}tI6<o}/[˿w?K\2x
, endobj -431 0 obj +433 0 obj << /Producer (GPL Ghostscript 8.61) -/CreationDate (D:20080809181324Z00'00') -/ModDate (D:20080809181324Z00'00') +/CreationDate (D:20080809212342Z00'00') +/ModDate (D:20080809212342Z00'00') >> endobj -432 0 obj +434 0 obj << /Type /ExtGState /OPM 1 >> endobj -433 0 obj +435 0 obj << /BaseFont /Helvetica /Type /Font /Subtype /Type1 >> endobj -434 0 obj +436 0 obj 452 endobj -428 0 obj << +430 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [439.9225 458.2842 454.378 468.8664] /Subtype /Link /A << /S /GoTo /D (figure.1.1) >> >> endobj -426 0 obj << -/D [424 0 R /XYZ 74.4095 793.4011 null] +428 0 obj << +/D [426 0 R /XYZ 74.4095 793.4011 null] >> endobj 14 0 obj << -/D [424 0 R /XYZ 74.4095 771.7323 null] +/D [426 0 R /XYZ 74.4095 771.7323 null] >> endobj -427 0 obj << -/D [424 0 R /XYZ 74.4095 659.2541 null] +429 0 obj << +/D [426 0 R /XYZ 74.4095 659.2541 null] >> endobj 314 0 obj << -/D [424 0 R /XYZ 288.3666 523.6815 null] +/D [426 0 R /XYZ 288.3666 523.6815 null] >> endobj -429 0 obj << -/D [424 0 R /XYZ 74.4095 396.6881 null] +431 0 obj << +/D [426 0 R /XYZ 74.4095 396.6881 null] >> endobj -430 0 obj << -/D [424 0 R /XYZ 74.4095 235.3536 null] +432 0 obj << +/D [426 0 R /XYZ 74.4095 235.3536 null] >> endobj -423 0 obj << +425 0 obj << /Font << /F61 259 0 R /F26 206 0 R /F28 209 0 R >> -/XObject << /Im2 421 0 R >> +/XObject << /Im2 423 0 R >> /ProcSet [ /PDF /Text ] >> endobj -437 0 obj << +439 0 obj << /Length 1352 /Filter /FlateDecode >> @@ -1597,29 +1596,29 @@ UԂWM鎞xT5bOOPCRraLsu:KȠ§Jpto #c-ݻЩ ҂φ0ΗX;$q!Lq˝2:϶:*se)])ZLAқLPR$}ɒ')@7Xo{I<gpN6DϾf8ow믃~lhY2 3YdTz0O>%/ Ova &/3kl ,M F[~7)_3ㅏR2v'Jg}#)aendstream endobj -436 0 obj << +438 0 obj << /Type /Page -/Contents 437 0 R -/Resources 435 0 R +/Contents 439 0 R +/Resources 437 0 R /MediaBox [0 0 595.2757 841.8898] -/Parent 358 0 R +/Parent 359 0 R >> endobj -422 0 obj << +424 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/usr/home/buetow/svn/vs/trunk/LaTeX/images/client-server-protokolle.pdf) /PTEX.PageNumber 1 -/PTEX.InfoDict 440 0 R +/PTEX.InfoDict 442 0 R /Matrix [1.00000000 0.00000000 0.00000000 1.00000000 0.00000000 0.00000000] /BBox [0.00000000 0.00000000 376.00000000 320.00000000] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << -/R7 441 0 R ->>/Font << /R8 442 0 R >> +/R7 443 0 R +>>/Font << /R8 444 0 R >> >> -/Length 443 0 R +/Length 445 0 R /Filter /FlateDecode >> stream @@ -1629,44 +1628,44 @@ xMo0<;l"îkP6AbGJGb:,P/E
'+Oz?}
l YLa- 7pD7[: B|jZ%Tp'endstream endobj -440 0 obj +442 0 obj << /Producer (GPL Ghostscript 8.61) -/CreationDate (D:20080809181324Z00'00') -/ModDate (D:20080809181324Z00'00') +/CreationDate (D:20080809212341Z00'00') +/ModDate (D:20080809212341Z00'00') >> endobj -441 0 obj +443 0 obj << /Type /ExtGState /OPM 1 >> endobj -442 0 obj +444 0 obj << /BaseFont /Helvetica /Type /Font /Subtype /Type1 >> endobj -443 0 obj +445 0 obj 499 endobj -438 0 obj << -/D [436 0 R /XYZ 74.4095 793.4011 null] +440 0 obj << +/D [438 0 R /XYZ 74.4095 793.4011 null] >> endobj -439 0 obj << -/D [436 0 R /XYZ 74.4095 750.3359 null] +441 0 obj << +/D [438 0 R /XYZ 74.4095 750.3359 null] >> endobj 315 0 obj << -/D [436 0 R /XYZ 281.7271 358.4221 null] +/D [438 0 R /XYZ 281.7271 358.4221 null] >> endobj -435 0 obj << +437 0 obj << /Font << /F61 259 0 R /F26 206 0 R /F28 209 0 R >> -/XObject << /Im3 422 0 R >> +/XObject << /Im3 424 0 R >> /ProcSet [ /PDF /Text ] >> endobj -446 0 obj << +448 0 obj << /Length 1762 /Filter /FlateDecode >> @@ -1678,35 +1677,35 @@ xڍn8ޯQbV$%J:&tw[`hrdY˴GwCɒ%7Eh839//B$bQŋ$ CG1zPI.A 0 endobj -445 0 obj << +447 0 obj << /Type /Page -/Contents 446 0 R -/Resources 444 0 R +/Contents 448 0 R +/Resources 446 0 R /MediaBox [0 0 595.2757 841.8898] -/Parent 358 0 R -/Annots [ 450 0 R ] +/Parent 359 0 R +/Annots [ 452 0 R ] >> endobj -450 0 obj << +452 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.1829 465.5316 140.6385 476.1138] /Subtype /Link /A << /S /GoTo /D (figure.1.2) >> >> endobj -447 0 obj << -/D [445 0 R /XYZ 74.4095 793.4011 null] +449 0 obj << +/D [447 0 R /XYZ 74.4095 793.4011 null] >> endobj -448 0 obj << -/D [445 0 R /XYZ 74.4095 750.7482 null] +450 0 obj << +/D [447 0 R /XYZ 74.4095 750.7482 null] >> endobj -449 0 obj << -/D [445 0 R /XYZ 74.4095 608.3473 null] +451 0 obj << +/D [447 0 R /XYZ 74.4095 608.3473 null] >> endobj -444 0 obj << +446 0 obj << /Font << /F61 259 0 R /F26 206 0 R /F28 209 0 R >> /ProcSet [ /PDF /Text ] >> endobj -454 0 obj << +456 0 obj << /Length 1160 /Filter /FlateDecode >> @@ -1716,15 +1715,15 @@ xڭWKs6WH͔0ޏⱝI:m%ʁ6!)E9"Uw iJ鴣 l0.JRCvF';%ZhS.ʳµRX+ﱬ}+J"+2pamlhUOH~ kZ((i;GK9e/)-!I!3NlA%0F>*7*!LM|jSv[y r.`+tNq k9Wiy,!88bPq."C_x=(.@>~*<30l7T[%=eghFVCcgzCuIHLiXU|YC.S#K+i;?U&o} D7悝˅pPM.z72AnD)1pujR._k~ǃP+&
O97+T!6y<$u"omY崀tSF`OkDwrL}W]>H?٢1|EP<m`'|#jRUq oF=t|O,:`3P9F0=I$ :t-/b|.r _Mq'X45_wP0,#qqa$rڿ/_/N;6?6_[J0<sJ/1x@ks^6qUqx?Cendstream endobj -453 0 obj << |
