<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://radioastronomie.sternwarte-radebeul.de/radiowiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Penner</id>
	<title>RadioWiki - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="https://radioastronomie.sternwarte-radebeul.de/radiowiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Penner"/>
	<link rel="alternate" type="text/html" href="https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Spezial:Beitr%C3%A4ge/Penner"/>
	<updated>2026-04-25T13:08:26Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.43.1</generator>
	<entry>
		<id>https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Hauptseite&amp;diff=1490</id>
		<title>Hauptseite</title>
		<link rel="alternate" type="text/html" href="https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Hauptseite&amp;diff=1490"/>
		<updated>2010-02-10T09:46:11Z</updated>

		<summary type="html">&lt;p&gt;Penner: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hilfe zur Benutzung und Konfiguration der Wiki-Software findest du im [http://meta.wikimedia.org/wiki/Hilfe:Handbuch Benutzerhandbuch].&lt;br /&gt;
&lt;br /&gt;
== Vorhandene Seiten ==&lt;br /&gt;
[[Datei:Para10 06.jpg|thumb||Karlsruhe Relais]] &lt;br /&gt;
* [[Hardware]]&lt;br /&gt;
* [http://wiki.astroclub-radebeul.de/index.php?title=Zugang_von_Aussen Zugang von Aussen]] (ACR-Wiki, Freischaltung bei [http://wiki.astroclub-radebeul.de/index.php?title=Benutzer:Markus Markus F.])&lt;br /&gt;
* [[Mechanik|Mechanik und elektromagnetische Einkoppelung]]&lt;br /&gt;
* [[Daten Auslesen]]&lt;br /&gt;
* [[Daten Auswerten]]&lt;br /&gt;
* [[Theorie|Ein wenig Mathematik]]&lt;br /&gt;
* [[Astropysik|Astrophysik]]&lt;br /&gt;
* [[Resourcen/Links]]&lt;br /&gt;
* [[Arbeitshilfen]]&lt;br /&gt;
* [[Präsentationen/Öffentlichkeitsarbeit]]&lt;br /&gt;
* [[Meetings]]&lt;br /&gt;
* [[Fotogalerie]]&lt;br /&gt;
* [[ToDO-Liste]]&lt;br /&gt;
&lt;br /&gt;
== Starthilfen ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.mediawiki.org/wiki/Manual:Configuration_settings Liste der Konfigurationsvariablen]&lt;br /&gt;
* [http://www.mediawiki.org/wiki/Manual:FAQ MediaWiki-FAQ]&lt;br /&gt;
* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailingliste neuer MediaWiki-Versionen]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Seite zum freien herumprobieren:&lt;br /&gt;
* [[Sandbox]]&lt;/div&gt;</summary>
		<author><name>Penner</name></author>
	</entry>
	<entry>
		<id>https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Hauptseite&amp;diff=1489</id>
		<title>Hauptseite</title>
		<link rel="alternate" type="text/html" href="https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Hauptseite&amp;diff=1489"/>
		<updated>2010-02-10T09:45:58Z</updated>

		<summary type="html">&lt;p&gt;Penner: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hilfe zur Benutzung und Konfiguration der Wiki-Software findest du im [http://meta.wikimedia.org/wiki/Hilfe:Handbuch Benutzerhandbuch].&lt;br /&gt;
&lt;br /&gt;
== Vorhandene Seiten ==&lt;br /&gt;
[[Datei:Para10 06.jpg|thumb||Karlsruhe Relais]] &lt;br /&gt;
* [[Hardware]]&lt;br /&gt;
* [http://wiki.astroclub-radebeul.de/index.php?title=Zugang_von_Aussen Zugang von Aussen]] &lt;br /&gt;
(ACR-Wiki, Freischaltung bei [http://wiki.astroclub-radebeul.de/index.php?title=Benutzer:Markus Markus F.])&lt;br /&gt;
* [[Mechanik|Mechanik und elektromagnetische Einkoppelung]]&lt;br /&gt;
* [[Daten Auslesen]]&lt;br /&gt;
* [[Daten Auswerten]]&lt;br /&gt;
* [[Theorie|Ein wenig Mathematik]]&lt;br /&gt;
* [[Astropysik|Astrophysik]]&lt;br /&gt;
* [[Resourcen/Links]]&lt;br /&gt;
* [[Arbeitshilfen]]&lt;br /&gt;
* [[Präsentationen/Öffentlichkeitsarbeit]]&lt;br /&gt;
* [[Meetings]]&lt;br /&gt;
* [[Fotogalerie]]&lt;br /&gt;
* [[ToDO-Liste]]&lt;br /&gt;
&lt;br /&gt;
== Starthilfen ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.mediawiki.org/wiki/Manual:Configuration_settings Liste der Konfigurationsvariablen]&lt;br /&gt;
* [http://www.mediawiki.org/wiki/Manual:FAQ MediaWiki-FAQ]&lt;br /&gt;
* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailingliste neuer MediaWiki-Versionen]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Seite zum freien herumprobieren:&lt;br /&gt;
* [[Sandbox]]&lt;/div&gt;</summary>
		<author><name>Penner</name></author>
	</entry>
	<entry>
		<id>https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Datei:Ziegerm.jpg&amp;diff=1481</id>
		<title>Datei:Ziegerm.jpg</title>
		<link rel="alternate" type="text/html" href="https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Datei:Ziegerm.jpg&amp;diff=1481"/>
		<updated>2010-02-06T19:32:30Z</updated>

		<summary type="html">&lt;p&gt;Penner: Die Seite wurde geleert.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Penner</name></author>
	</entry>
	<entry>
		<id>https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Testsperrung&amp;diff=1480</id>
		<title>Testsperrung</title>
		<link rel="alternate" type="text/html" href="https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Testsperrung&amp;diff=1480"/>
		<updated>2010-02-06T19:32:02Z</updated>

		<summary type="html">&lt;p&gt;Penner: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;accesscontrol&amp;gt;Administratoren,internal&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
Diese Seite ist durch die (nur im Seitenquelltext zu sehende) Zeile &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; &amp;lt;accesscontrol&amp;gt;Administratoren,internal&amp;lt;/accesscontrol&amp;gt; &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*für Administratoren und zur Benutzergruppe &amp;quot;internal&amp;quot; gehörende Menschen lese/schreibbar&lt;br /&gt;
* für Nutzer, die nicht zur Gruppe &amp;quot;internal&amp;quot; gehören oder nicht angemeldet sind, nicht zugreifbar&lt;br /&gt;
&lt;br /&gt;
Ein Beispiele für eine Seite, die für &amp;quot;interne&amp;quot; lesbar aber nur für Administratoren schreibbar ist, ist [[Testsperrung_ro]].&lt;br /&gt;
&lt;br /&gt;
Wie kann ich so ein Bild schützen???&lt;br /&gt;
&lt;br /&gt;
[[Datei:ziegerm.jpg]]&lt;/div&gt;</summary>
		<author><name>Penner</name></author>
	</entry>
	<entry>
		<id>https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Testsperrung&amp;diff=1479</id>
		<title>Testsperrung</title>
		<link rel="alternate" type="text/html" href="https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Testsperrung&amp;diff=1479"/>
		<updated>2010-02-06T19:31:49Z</updated>

		<summary type="html">&lt;p&gt;Penner: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;accesscontrol&amp;gt;Administratoren,internal&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
Diese Seite ist durch die (nur im Seitenquelltext zu sehende) Zeile &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; &amp;lt;accesscontrol&amp;gt;Administratoren,internal&amp;lt;/accesscontrol&amp;gt; &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*für Administratoren und zur Benutzergruppe &amp;quot;internal&amp;quot; gehörende Menschen lese/schreibbar&lt;br /&gt;
* für Nutzer, die nicht zur Gruppe &amp;quot;internal&amp;quot; gehören oder nicht angemeldet sind, nicht zugreifbar&lt;br /&gt;
&lt;br /&gt;
Ein Beispiele für eine Seite, die für &amp;quot;interne&amp;quot; lesbar aber nur für Administratoren schreibbar ist, ist [[Testsperrung_ro]].&lt;br /&gt;
&lt;br /&gt;
Wie kann ich so ein Bild schützen???&lt;br /&gt;
[[Datei:ziegerm.jpg]]&lt;/div&gt;</summary>
		<author><name>Penner</name></author>
	</entry>
	<entry>
		<id>https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Sandbox&amp;diff=1477</id>
		<title>Sandbox</title>
		<link rel="alternate" type="text/html" href="https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Sandbox&amp;diff=1477"/>
		<updated>2010-02-06T19:30:55Z</updated>

		<summary type="html">&lt;p&gt;Penner: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Hauptüberschrift =&lt;br /&gt;
&lt;br /&gt;
* einsund&lt;br /&gt;
* zweiund&lt;br /&gt;
* dreiund&lt;br /&gt;
&lt;br /&gt;
== [[Media:29m.raw]] ==&lt;br /&gt;
=== [[Media:32m.raw]] ===&lt;br /&gt;
&lt;br /&gt;
Zusammenfassung aus meiner Sicht:&lt;br /&gt;
&lt;br /&gt;
Da der Spiegel vom Ringerreger nicht optimal ausgeleuchtet wird (nur ca. 50 %), soll das &lt;br /&gt;
vorhandene Feedhorn für den Einsatz konditioniert werden. Norbert (DL4DTU) und Hartmut &lt;br /&gt;
(DG2DWL) plädieren für einen genauen Frequenzabgleich des Einkoppelstiftes auf &lt;br /&gt;
return loss &amp;gt; 20 dB bei der Arbeitsfrequenz, Abgleich durch Norbert. Dazu sollte unmittelbar am &lt;br /&gt;
Stift eine SMA-Buchse zum Anschluss des Messgerätes und später des Kabels zum LNA &lt;br /&gt;
angebracht werden. Zum Klimaschutz kann der Steckverbinder z.B. mit selbstvulkanisierendem &lt;br /&gt;
ISO-Band umwickelt werden. Der Stift sollte so beschaffen sein, dass ein schneller Abgleich &lt;br /&gt;
möglich ist. Die von mir veranschlagte Dämpfung von ca. 0,25 dB pro Steckverbinder wird &lt;br /&gt;
von Norbert und Hartmut als zu hoch angesetzt angesehen.&lt;br /&gt;
&lt;br /&gt;
Das Bild sollte für unangemeldete Nutzer nicht zugreifbar sein, ist es aber doch...: &lt;br /&gt;
&lt;br /&gt;
[[Datei:Ziegerm.jpg]]&lt;/div&gt;</summary>
		<author><name>Penner</name></author>
	</entry>
	<entry>
		<id>https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Sandbox&amp;diff=1476</id>
		<title>Sandbox</title>
		<link rel="alternate" type="text/html" href="https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Sandbox&amp;diff=1476"/>
		<updated>2010-02-06T19:29:53Z</updated>

		<summary type="html">&lt;p&gt;Penner: /* Media:32m.raw */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Hauptüberschrift =&lt;br /&gt;
&lt;br /&gt;
* einsund&lt;br /&gt;
* zweiund&lt;br /&gt;
* dreiund&lt;br /&gt;
&lt;br /&gt;
== [[Media:29m.raw]] ==&lt;br /&gt;
=== [[Media:32m.raw]] ===&lt;br /&gt;
&lt;br /&gt;
Zusammenfassung aus meiner Sicht:&lt;br /&gt;
&lt;br /&gt;
Da der Spiegel vom Ringerreger nicht optimal ausgeleuchtet wird (nur ca. 50 %), soll das &lt;br /&gt;
vorhandene Feedhorn für den Einsatz konditioniert werden. Norbert (DL4DTU) und Hartmut &lt;br /&gt;
(DG2DWL) plädieren für einen genauen Frequenzabgleich des Einkoppelstiftes auf &lt;br /&gt;
return loss &amp;gt; 20 dB bei der Arbeitsfrequenz, Abgleich durch Norbert. Dazu sollte unmittelbar am &lt;br /&gt;
Stift eine SMA-Buchse zum Anschluss des Messgerätes und später des Kabels zum LNA &lt;br /&gt;
angebracht werden. Zum Klimaschutz kann der Steckverbinder z.B. mit selbstvulkanisierendem &lt;br /&gt;
ISO-Band umwickelt werden. Der Stift sollte so beschaffen sein, dass ein schneller Abgleich &lt;br /&gt;
möglich ist. Die von mir veranschlagte Dämpfung von ca. 0,25 dB pro Steckverbinder wird &lt;br /&gt;
von Norbert und Hartmut als zu hoch angesetzt angesehen.&lt;br /&gt;
&lt;br /&gt;
Das Bild sollte für unangemeldete Nutzer nicht zugreifbar sein: &lt;br /&gt;
&lt;br /&gt;
[[Datei:Ziegerm.jpg]]&lt;/div&gt;</summary>
		<author><name>Penner</name></author>
	</entry>
	<entry>
		<id>https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Sandbox&amp;diff=1475</id>
		<title>Sandbox</title>
		<link rel="alternate" type="text/html" href="https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Sandbox&amp;diff=1475"/>
		<updated>2010-02-06T19:29:42Z</updated>

		<summary type="html">&lt;p&gt;Penner: /* Media:32m.raw */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Hauptüberschrift =&lt;br /&gt;
&lt;br /&gt;
* einsund&lt;br /&gt;
* zweiund&lt;br /&gt;
* dreiund&lt;br /&gt;
&lt;br /&gt;
== [[Media:29m.raw]] ==&lt;br /&gt;
=== [[Media:32m.raw]] ===&lt;br /&gt;
&lt;br /&gt;
Zusammenfassung aus meiner Sicht:&lt;br /&gt;
&lt;br /&gt;
Da der Spiegel vom Ringerreger nicht optimal ausgeleuchtet wird (nur ca. 50 %), soll das &lt;br /&gt;
vorhandene Feedhorn für den Einsatz konditioniert werden. Norbert (DL4DTU) und Hartmut &lt;br /&gt;
(DG2DWL) plädieren für einen genauen Frequenzabgleich des Einkoppelstiftes auf &lt;br /&gt;
return loss &amp;gt; 20 dB bei der Arbeitsfrequenz, Abgleich durch Norbert. Dazu sollte unmittelbar am &lt;br /&gt;
Stift eine SMA-Buchse zum Anschluss des Messgerätes und später des Kabels zum LNA &lt;br /&gt;
angebracht werden. Zum Klimaschutz kann der Steckverbinder z.B. mit selbstvulkanisierendem &lt;br /&gt;
ISO-Band umwickelt werden. Der Stift sollte so beschaffen sein, dass ein schneller Abgleich &lt;br /&gt;
möglich ist. Die von mir veranschlagte Dämpfung von ca. 0,25 dB pro Steckverbinder wird &lt;br /&gt;
von Norbert und Hartmut als zu hoch angesetzt angesehen.&lt;br /&gt;
&lt;br /&gt;
Das Bild sollte für unangemeldete Nutzer nicht zugreifbar sein: &lt;br /&gt;
[[Datei:Ziegerm.jpg]]&lt;/div&gt;</summary>
		<author><name>Penner</name></author>
	</entry>
	<entry>
		<id>https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Sandbox&amp;diff=1474</id>
		<title>Sandbox</title>
		<link rel="alternate" type="text/html" href="https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Sandbox&amp;diff=1474"/>
		<updated>2010-02-06T19:29:27Z</updated>

		<summary type="html">&lt;p&gt;Penner: /* Media:32m.raw */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Hauptüberschrift =&lt;br /&gt;
&lt;br /&gt;
* einsund&lt;br /&gt;
* zweiund&lt;br /&gt;
* dreiund&lt;br /&gt;
&lt;br /&gt;
== [[Media:29m.raw]] ==&lt;br /&gt;
=== [[Media:32m.raw]] ===&lt;br /&gt;
&lt;br /&gt;
Zusammenfassung aus meiner Sicht:&lt;br /&gt;
&lt;br /&gt;
Da der Spiegel vom Ringerreger nicht optimal ausgeleuchtet wird (nur ca. 50 %), soll das &lt;br /&gt;
vorhandene Feedhorn für den Einsatz konditioniert werden. Norbert (DL4DTU) und Hartmut &lt;br /&gt;
(DG2DWL) plädieren für einen genauen Frequenzabgleich des Einkoppelstiftes auf &lt;br /&gt;
return loss &amp;gt; 20 dB bei der Arbeitsfrequenz, Abgleich durch Norbert. Dazu sollte unmittelbar am &lt;br /&gt;
Stift eine SMA-Buchse zum Anschluss des Messgerätes und später des Kabels zum LNA &lt;br /&gt;
angebracht werden. Zum Klimaschutz kann der Steckverbinder z.B. mit selbstvulkanisierendem &lt;br /&gt;
ISO-Band umwickelt werden. Der Stift sollte so beschaffen sein, dass ein schneller Abgleich &lt;br /&gt;
möglich ist. Die von mir veranschlagte Dämpfung von ca. 0,25 dB pro Steckverbinder wird &lt;br /&gt;
von Norbert und Hartmut als zu hoch angesetzt angesehen.&lt;br /&gt;
&lt;br /&gt;
Das Bild sollte für unangemeldete Nutzer nicht zugreifbar sein: [Datei:Ziegerm.jpg]&lt;/div&gt;</summary>
		<author><name>Penner</name></author>
	</entry>
	<entry>
		<id>https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Sandbox&amp;diff=1473</id>
		<title>Sandbox</title>
		<link rel="alternate" type="text/html" href="https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Sandbox&amp;diff=1473"/>
		<updated>2010-02-06T19:29:10Z</updated>

		<summary type="html">&lt;p&gt;Penner: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Hauptüberschrift =&lt;br /&gt;
&lt;br /&gt;
* einsund&lt;br /&gt;
* zweiund&lt;br /&gt;
* dreiund&lt;br /&gt;
&lt;br /&gt;
== [[Media:29m.raw]] ==&lt;br /&gt;
=== [[Media:32m.raw]] ===&lt;br /&gt;
&lt;br /&gt;
Zusammenfassung aus meiner Sicht:&lt;br /&gt;
&lt;br /&gt;
Da der Spiegel vom Ringerreger nicht optimal ausgeleuchtet wird (nur ca. 50 %), soll das &lt;br /&gt;
vorhandene Feedhorn für den Einsatz konditioniert werden. Norbert (DL4DTU) und Hartmut &lt;br /&gt;
(DG2DWL) plädieren für einen genauen Frequenzabgleich des Einkoppelstiftes auf &lt;br /&gt;
return loss &amp;gt; 20 dB bei der Arbeitsfrequenz, Abgleich durch Norbert. Dazu sollte unmittelbar am &lt;br /&gt;
Stift eine SMA-Buchse zum Anschluss des Messgerätes und später des Kabels zum LNA &lt;br /&gt;
angebracht werden. Zum Klimaschutz kann der Steckverbinder z.B. mit selbstvulkanisierendem &lt;br /&gt;
ISO-Band umwickelt werden. Der Stift sollte so beschaffen sein, dass ein schneller Abgleich &lt;br /&gt;
möglich ist. Die von mir veranschlagte Dämpfung von ca. 0,25 dB pro Steckverbinder wird &lt;br /&gt;
von Norbert und Hartmut als zu hoch angesetzt angesehen.&lt;br /&gt;
&lt;br /&gt;
Das Bild sollte für unangemeldete Nutzer nicht zugreifbar sein: [Ziegerm.jpg]&lt;/div&gt;</summary>
		<author><name>Penner</name></author>
	</entry>
	<entry>
		<id>https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Testsperrung&amp;diff=1468</id>
		<title>Testsperrung</title>
		<link rel="alternate" type="text/html" href="https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Testsperrung&amp;diff=1468"/>
		<updated>2010-02-06T19:24:27Z</updated>

		<summary type="html">&lt;p&gt;Penner: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;accesscontrol&amp;gt;Administratoren,internal&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
Diese Seite ist durch die (nur im Seitenquelltext zu sehende) Zeile &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; &amp;lt;accesscontrol&amp;gt;Administratoren,internal&amp;lt;/accesscontrol&amp;gt; &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*für Administratoren und zur Benutzergruppe &amp;quot;internal&amp;quot; gehörende Menschen lese/schreibbar&lt;br /&gt;
* für Nutzer, die nicht zur Gruppe &amp;quot;internal&amp;quot; gehören oder nicht angemeldet sind, nicht zugreifbar&lt;br /&gt;
&lt;br /&gt;
Ein Beispiele für eine Seite, die für &amp;quot;interne&amp;quot; lesbar aber nur für Administratoren schreibbar ist, ist [[Testsperrung_ro]].&lt;br /&gt;
&lt;br /&gt;
Die Bild der Ziege ist ein geschütztes Bild. Die Sperr-Zeile muss in der [http://rm-radeberg.dyndns.org/radiowiki/index.php/Datei:Ziegerm.jpg Datei-Seite für das Bild] eingetragen werden.&lt;br /&gt;
[[Datei:ziegerm.jpg]]&lt;/div&gt;</summary>
		<author><name>Penner</name></author>
	</entry>
	<entry>
		<id>https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Datei:Ziegerm.jpg&amp;diff=1467</id>
		<title>Datei:Ziegerm.jpg</title>
		<link rel="alternate" type="text/html" href="https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Datei:Ziegerm.jpg&amp;diff=1467"/>
		<updated>2010-02-06T19:23:14Z</updated>

		<summary type="html">&lt;p&gt;Penner: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;accesscontrol&amp;gt;Administratoren,internal&amp;lt;/accesscontrol&amp;gt;&lt;/div&gt;</summary>
		<author><name>Penner</name></author>
	</entry>
	<entry>
		<id>https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Datei:Ziegerm.jpg&amp;diff=1466</id>
		<title>Datei:Ziegerm.jpg</title>
		<link rel="alternate" type="text/html" href="https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Datei:Ziegerm.jpg&amp;diff=1466"/>
		<updated>2010-02-06T19:22:33Z</updated>

		<summary type="html">&lt;p&gt;Penner: hat eine neue Version von „Datei:Ziegerm.jpg“ hochgeladen&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Penner</name></author>
	</entry>
	<entry>
		<id>https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Datei:Ziegerm.jpg&amp;diff=1465</id>
		<title>Datei:Ziegerm.jpg</title>
		<link rel="alternate" type="text/html" href="https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Datei:Ziegerm.jpg&amp;diff=1465"/>
		<updated>2010-02-06T19:21:57Z</updated>

		<summary type="html">&lt;p&gt;Penner: hat eine neue Version von „Datei:Ziegerm.jpg“ hochgeladen&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Penner</name></author>
	</entry>
	<entry>
		<id>https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Datei:Ziegerm.jpg&amp;diff=1464</id>
		<title>Datei:Ziegerm.jpg</title>
		<link rel="alternate" type="text/html" href="https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Datei:Ziegerm.jpg&amp;diff=1464"/>
		<updated>2010-02-06T19:20:11Z</updated>

		<summary type="html">&lt;p&gt;Penner: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Penner</name></author>
	</entry>
	<entry>
		<id>https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Testsperrung&amp;diff=1463</id>
		<title>Testsperrung</title>
		<link rel="alternate" type="text/html" href="https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Testsperrung&amp;diff=1463"/>
		<updated>2010-02-06T19:19:52Z</updated>

		<summary type="html">&lt;p&gt;Penner: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;accesscontrol&amp;gt;Administratoren,internal&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
Diese Seite ist durch die (nur im Seitenquelltext zu sehende) Zeile &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; &amp;lt;accesscontrol&amp;gt;Administratoren,internal&amp;lt;/accesscontrol&amp;gt; &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*für Administratoren und zur Benutzergruppe &amp;quot;internal&amp;quot; gehörende Menschen lese/schreibbar&lt;br /&gt;
* für Nutzer, die nicht zur Gruppe &amp;quot;internal&amp;quot; gehören oder nicht angemeldet sind, nicht zugreifbar&lt;br /&gt;
&lt;br /&gt;
Ein Beispiele für eine Seite, die für &amp;quot;interne&amp;quot; lesbar aber nur für Administratoren schreibbar ist, ist [[Testsperrung_ro]].&lt;br /&gt;
&lt;br /&gt;
Die Bild der Ziege ist ein geschütztes Bild. Die Sperr-Zeile muss in der Datei-Seite für das Bild eingetragen werden.&lt;br /&gt;
[[Datei:ziegerm.jpg]]&lt;/div&gt;</summary>
		<author><name>Penner</name></author>
	</entry>
	<entry>
		<id>https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Testsperrung&amp;diff=1450</id>
		<title>Testsperrung</title>
		<link rel="alternate" type="text/html" href="https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Testsperrung&amp;diff=1450"/>
		<updated>2010-02-06T18:59:08Z</updated>

		<summary type="html">&lt;p&gt;Penner: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;accesscontrol&amp;gt;Administratoren,internal&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
Diese Seite ist durch die (nur im Seitenquelltext zu sehende) Zeile &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; &amp;lt;accesscontrol&amp;gt;Administratoren,internal&amp;lt;/accesscontrol&amp;gt; &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*für Administratoren und zur Benutzergruppe &amp;quot;internal&amp;quot; gehörende Menschen lese/schreibbar&lt;br /&gt;
* für Nutzer, die nicht zur Gruppe &amp;quot;internal&amp;quot; gehören oder nicht angemeldet sind, nicht zugreifbar&lt;br /&gt;
&lt;br /&gt;
Ein Beispiele für eine Seite, die für &amp;quot;interne&amp;quot; lesbar aber nur für Administratoren schreibbar ist, ist [[Testsperrung_ro]].&lt;/div&gt;</summary>
		<author><name>Penner</name></author>
	</entry>
	<entry>
		<id>https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Testsperrung&amp;diff=1430</id>
		<title>Testsperrung</title>
		<link rel="alternate" type="text/html" href="https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Testsperrung&amp;diff=1430"/>
		<updated>2010-02-06T16:56:00Z</updated>

		<summary type="html">&lt;p&gt;Penner: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;accesscontrol&amp;gt;Administrators,ACCESSCONTROL:Internal&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Seite ist durch die (nur im Seitenquelltext zu sehende) Zeile nur Administratoren und auf der Seite [[ACCESSCONTROL:Internal]] aufgeführte Personen sichtbar und bearbeitbar. &lt;br /&gt;
&lt;br /&gt;
Die Seite [[ACCESSCONTROL:Internal]] selbst ist ein Beispiel, das für Gruppenmitglieder lesbar aber nur von Administratoren zu bearbeiten ist.&lt;/div&gt;</summary>
		<author><name>Penner</name></author>
	</entry>
	<entry>
		<id>https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=RadioWiki:No_Access&amp;diff=1419</id>
		<title>RadioWiki:No Access</title>
		<link rel="alternate" type="text/html" href="https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=RadioWiki:No_Access&amp;diff=1419"/>
		<updated>2010-02-06T16:05:22Z</updated>

		<summary type="html">&lt;p&gt;Penner: Die Seite wurde neu angelegt: „You have no permission to access this protected page.“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;You have no permission to access this protected page.&lt;/div&gt;</summary>
		<author><name>Penner</name></author>
	</entry>
	<entry>
		<id>https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=RadioWiki:No_anonymous&amp;diff=1418</id>
		<title>RadioWiki:No anonymous</title>
		<link rel="alternate" type="text/html" href="https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=RadioWiki:No_anonymous&amp;diff=1418"/>
		<updated>2010-02-06T16:04:44Z</updated>

		<summary type="html">&lt;p&gt;Penner: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;You have no permissions to access this protected page.&lt;/div&gt;</summary>
		<author><name>Penner</name></author>
	</entry>
	<entry>
		<id>https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=RadioWiki:No_anonymous&amp;diff=1417</id>
		<title>RadioWiki:No anonymous</title>
		<link rel="alternate" type="text/html" href="https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=RadioWiki:No_anonymous&amp;diff=1417"/>
		<updated>2010-02-06T16:04:23Z</updated>

		<summary type="html">&lt;p&gt;Penner: Die Seite wurde neu angelegt: „You tried to access a protected page.“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;You tried to access a protected page.&lt;/div&gt;</summary>
		<author><name>Penner</name></author>
	</entry>
	<entry>
		<id>https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Benutzer:Penner&amp;diff=1407</id>
		<title>Benutzer:Penner</title>
		<link rel="alternate" type="text/html" href="https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Benutzer:Penner&amp;diff=1407"/>
		<updated>2010-02-02T15:00:31Z</updated>

		<summary type="html">&lt;p&gt;Penner: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Robert Müller&lt;br /&gt;
* E-Mail: &lt;br /&gt;
** mail@penner2001.de&lt;br /&gt;
** robert.mueller@tu-dresden.de&lt;br /&gt;
&lt;br /&gt;
* Tel.:&lt;br /&gt;
** 0172/9099580 [für nächsten Tage nur über Mailbox]&lt;br /&gt;
* ICQ: 203612885&lt;/div&gt;</summary>
		<author><name>Penner</name></author>
	</entry>
	<entry>
		<id>https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Benutzer:Penner&amp;diff=1406</id>
		<title>Benutzer:Penner</title>
		<link rel="alternate" type="text/html" href="https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Benutzer:Penner&amp;diff=1406"/>
		<updated>2010-02-02T15:00:21Z</updated>

		<summary type="html">&lt;p&gt;Penner: Die Seite wurde neu angelegt: „Robert Müller * E-Mail:  ** mail@penner2001.de ** robert.mueller@tu-dresden.de  * Tel.: ** 0172/9099580 [fir nächsten Tage nur über Mailbox] * ICQ: 203612885“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Robert Müller&lt;br /&gt;
* E-Mail: &lt;br /&gt;
** mail@penner2001.de&lt;br /&gt;
** robert.mueller@tu-dresden.de&lt;br /&gt;
&lt;br /&gt;
* Tel.:&lt;br /&gt;
** 0172/9099580 [fir nächsten Tage nur über Mailbox]&lt;br /&gt;
* ICQ: 203612885&lt;/div&gt;</summary>
		<author><name>Penner</name></author>
	</entry>
	<entry>
		<id>https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Sandbox&amp;diff=1148</id>
		<title>Sandbox</title>
		<link rel="alternate" type="text/html" href="https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Sandbox&amp;diff=1148"/>
		<updated>2009-11-16T17:40:27Z</updated>

		<summary type="html">&lt;p&gt;Penner: /* TimeLine */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Hauptüberschrift =&lt;br /&gt;
&lt;br /&gt;
* einsund&lt;br /&gt;
* zweiund&lt;br /&gt;
* dreiund&lt;br /&gt;
&lt;br /&gt;
== [[Media:29m.raw]] ==&lt;br /&gt;
=== [[Media:32m.raw]] ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== TimeLine ===&lt;br /&gt;
&amp;lt;timeline&amp;gt;&lt;br /&gt;
ImageSize  = width:160 height:550&lt;br /&gt;
PlotArea   = width:50 height:530 left:50 bottom:10&lt;br /&gt;
&lt;br /&gt;
DateFormat = yyyy&lt;br /&gt;
Period     = from:1919 till:1991&lt;br /&gt;
TimeAxis   = orientation:vertical&lt;br /&gt;
ScaleMajor = unit:year increment:5 start:1920&lt;br /&gt;
&lt;br /&gt;
# there is no automatic collision detection ,&lt;br /&gt;
# so shift texts up or down manually to avoid overlap&lt;br /&gt;
&lt;br /&gt;
Define $dx = 25 # shift text to right side of bar&lt;br /&gt;
&lt;br /&gt;
PlotData=&lt;br /&gt;
  bar:Leaders color:red width:25 mark:(line,white) align:left fontsize:S&lt;br /&gt;
&lt;br /&gt;
  from:start till:1922 shift:($dx,15)   text:Vladimir~Ilyich~[[Lenin]]&lt;br /&gt;
  from:1922  till:1953 shift:($dx,5)    text:[[Stalin|Josef Stalin]]&lt;br /&gt;
  from:1953  till:1964 shift:($dx,5)    text:Nikita~[[Khrushchev]]&lt;br /&gt;
  from:1964  till:1982 shift:($dx,5)    text:Leonid~[[Brezhnev]]&lt;br /&gt;
  from:1982  till:1984 shift:($dx,-12)  text:Yuri~[[Andropov]]&lt;br /&gt;
  from:1984  till:1985 shift:($dx,4)    text:Konstantin~[[Chernenko]] fontsize:XS&lt;br /&gt;
  from:1985  till:end  shift:($dx,10)   text:Mikhail~[[Gorbachev]]&lt;br /&gt;
&amp;lt;/timeline&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;timeline&amp;gt;&lt;br /&gt;
ImageSize  = width:800 height:100&lt;br /&gt;
PlotArea   = width:720 height:75 left:65 bottom:20&lt;br /&gt;
AlignBars  = justify&lt;br /&gt;
&lt;br /&gt;
Colors =&lt;br /&gt;
  id:epoch  value:rgb(0.7,0.7,1) # light yellow&lt;br /&gt;
  id:period value:rgb(1,0.7,0.7) # light red&lt;br /&gt;
  id:age    value:rgb(0.7,1,0.7) # light green&lt;br /&gt;
  id:era    value:rgb(1,1,0.7)   # light blue&lt;br /&gt;
  id:eon    value:rgb(1,0.7,1)   # light purple&lt;br /&gt;
  id:black  value:black&lt;br /&gt;
&lt;br /&gt;
Period      = from:-4500 till:0&lt;br /&gt;
TimeAxis    = orientation:horizontal&lt;br /&gt;
ScaleMajor  = unit:year increment:500 start:-4500&lt;br /&gt;
ScaleMinor  = unit:year increment:100 start:-4500&lt;br /&gt;
&lt;br /&gt;
Define $markred = text:&amp;quot;*&amp;quot; textcolor:red shift:(0,3) fontsize:10&lt;br /&gt;
&lt;br /&gt;
PlotData=&lt;br /&gt;
  align:center textcolor:black fontsize:8 mark:(line,black) width:25 shift:(0,-5)&lt;br /&gt;
&lt;br /&gt;
  bar:eon color:eon&lt;br /&gt;
&lt;br /&gt;
  at:      0   align:right  $markred&lt;br /&gt;
  at:   -545   align:left   $markred&lt;br /&gt;
  from: -545   till:    0   text:[[Phanerozoic]]&lt;br /&gt;
  from:-4500   till:    0   text:[[Precambrian]]&lt;br /&gt;
&lt;br /&gt;
  bar:era color:era&lt;br /&gt;
&lt;br /&gt;
  from:  -64.3 till:    0   text:C~z shift:(0,1.5)&lt;br /&gt;
  from: -251.1 till:  -64.3 text:[[Mesozoic|Meso~zoic]] shift:(0,1.5)&lt;br /&gt;
  from: -545   till: -251.1 text:[[Paleozoic|Paleo~zoic]] shift:(0,1.5)&lt;br /&gt;
  from:-4500   till: -545   text:[[Proterozoic]]&lt;br /&gt;
&lt;br /&gt;
  bar:period color:period&lt;br /&gt;
&lt;br /&gt;
  fontsize:6&lt;br /&gt;
  from:   -1.6 till:    0&lt;br /&gt;
  from:  -64.3 till:   -1.6&lt;br /&gt;
  from: -146   till:  -64.3&lt;br /&gt;
  from: -208   till: -146&lt;br /&gt;
  from: -251.1 till: -208&lt;br /&gt;
  from: -286   till: -251.1&lt;br /&gt;
  from: -360   till: -286&lt;br /&gt;
  from: -408.5 till: -360&lt;br /&gt;
  from: -443.5 till: -408.5&lt;br /&gt;
  from: -490   till: -443.5&lt;br /&gt;
  from: -545   till: -490&lt;br /&gt;
&lt;br /&gt;
  fontsize:8&lt;br /&gt;
  from: -900   till:  -545  text:[[Neoproterozoic|Neoprote-~rozoic]] shift:(0,1.8)&lt;br /&gt;
  from:-1600   till:  -900  text:[[Mesoproterozoic]]&lt;br /&gt;
  from:-2500   till: -1600  text:[[Paleoproterozoic]]&lt;br /&gt;
  from:-3800   till: -2500  text:[[Archaean]]&lt;br /&gt;
  from: start  till: -3800  text:[[Hadean]]&lt;br /&gt;
&amp;lt;/timeline&amp;gt;&lt;br /&gt;
cd .&lt;/div&gt;</summary>
		<author><name>Penner</name></author>
	</entry>
	<entry>
		<id>https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Sandbox&amp;diff=1147</id>
		<title>Sandbox</title>
		<link rel="alternate" type="text/html" href="https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Sandbox&amp;diff=1147"/>
		<updated>2009-11-16T17:39:17Z</updated>

		<summary type="html">&lt;p&gt;Penner: /* TimeLine */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Hauptüberschrift =&lt;br /&gt;
&lt;br /&gt;
* einsund&lt;br /&gt;
* zweiund&lt;br /&gt;
* dreiund&lt;br /&gt;
&lt;br /&gt;
== [[Media:29m.raw]] ==&lt;br /&gt;
=== [[Media:32m.raw]] ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== TimeLine ===&lt;br /&gt;
&amp;lt;timeline&amp;gt;&lt;br /&gt;
ImageSize  = width:160 height:550&lt;br /&gt;
PlotArea   = width:50 height:530 left:50 bottom:10&lt;br /&gt;
&lt;br /&gt;
DateFormat = yyyy&lt;br /&gt;
Period     = from:1919 till:1991&lt;br /&gt;
TimeAxis   = orientation:vertical&lt;br /&gt;
ScaleMajor = unit:year increment:5 start:1920&lt;br /&gt;
&lt;br /&gt;
# there is no automatic collision detection ,&lt;br /&gt;
# so shift texts up or down manually to avoid overlap&lt;br /&gt;
&lt;br /&gt;
Define $dx = 25 # shift text to right side of bar&lt;br /&gt;
&lt;br /&gt;
PlotData=&lt;br /&gt;
  bar:Leaders color:red width:25 mark:(line,white) align:left fontsize:S&lt;br /&gt;
&lt;br /&gt;
  from:start till:1922 shift:($dx,15)   text:Vladimir~Ilyich~[[Lenin]]&lt;br /&gt;
  from:1922  till:1953 shift:($dx,5)    text:[[Stalin|Josef Stalin]]&lt;br /&gt;
  from:1953  till:1964 shift:($dx,5)    text:Nikita~[[Khrushchev]]&lt;br /&gt;
  from:1964  till:1982 shift:($dx,5)    text:Leonid~[[Brezhnev]]&lt;br /&gt;
  from:1982  till:1984 shift:($dx,-12)  text:Yuri~[[Andropov]]&lt;br /&gt;
  from:1984  till:1985 shift:($dx,4)    text:Konstantin~[[Chernenko]] fontsize:XS&lt;br /&gt;
  from:1985  till:end  shift:($dx,10)   text:Mikhail~[[Gorbachev]]&lt;br /&gt;
&amp;lt;/timeline&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;timeline&amp;gt;&lt;br /&gt;
ImageSize  = width:800 height:100&lt;br /&gt;
PlotArea   = width:720 height:75 left:65 bottom:20&lt;br /&gt;
AlignBars  = justify&lt;br /&gt;
&lt;br /&gt;
Colors =&lt;br /&gt;
  id:epoch  value:rgb(0.7,0.7,1) # light yellow&lt;br /&gt;
  id:period value:rgb(1,0.7,0.7) # light red&lt;br /&gt;
  id:age    value:rgb(0.7,1,0.7) # light green&lt;br /&gt;
  id:era    value:rgb(1,1,0.7)   # light blue&lt;br /&gt;
  id:eon    value:rgb(1,0.7,1)   # light purple&lt;br /&gt;
  id:black  value:black&lt;br /&gt;
&lt;br /&gt;
Period      = from:-4500 till:0&lt;br /&gt;
TimeAxis    = orientation:horizontal&lt;br /&gt;
ScaleMajor  = unit:year increment:500 start:-4500&lt;br /&gt;
ScaleMinor  = unit:year increment:100 start:-4500&lt;br /&gt;
&lt;br /&gt;
Define $markred = text:&amp;quot;*&amp;quot; textcolor:red shift:(0,3) fontsize:10&lt;br /&gt;
&lt;br /&gt;
PlotData=&lt;br /&gt;
  align:center textcolor:black fontsize:8 mark:(line,black) width:25 shift:(0,-5)&lt;br /&gt;
&lt;br /&gt;
  bar:eon color:eon&lt;br /&gt;
&lt;br /&gt;
  at:      0   align:right  $markred&lt;br /&gt;
  at:   -545   align:left   $markred&lt;br /&gt;
  from: -545   till:    0   text:[[Phanerozoic]]&lt;br /&gt;
  from:-4500   till:    0   text:[[Precambrian]]&lt;br /&gt;
&lt;br /&gt;
  bar:era color:era&lt;br /&gt;
&lt;br /&gt;
  from:  -64.3 till:    0   text:C~z shift:(0,1.5)&lt;br /&gt;
  from: -251.1 till:  -64.3 text:[[Mesozoic|Meso~zoic]] shift:(0,1.5)&lt;br /&gt;
  from: -545   till: -251.1 text:[[Paleozoic|Paleo~zoic]] shift:(0,1.5)&lt;br /&gt;
  from:-4500   till: -545   text:[[Proterozoic]]&lt;br /&gt;
&lt;br /&gt;
  bar:period color:period&lt;br /&gt;
&lt;br /&gt;
  fontsize:6&lt;br /&gt;
  from:   -1.6 till:    0&lt;br /&gt;
  from:  -64.3 till:   -1.6&lt;br /&gt;
  from: -146   till:  -64.3&lt;br /&gt;
  from: -208   till: -146&lt;br /&gt;
  from: -251.1 till: -208&lt;br /&gt;
  from: -286   till: -251.1&lt;br /&gt;
  from: -360   till: -286&lt;br /&gt;
  from: -408.5 till: -360&lt;br /&gt;
  from: -443.5 till: -408.5&lt;br /&gt;
  from: -490   till: -443.5&lt;br /&gt;
  from: -545   till: -490&lt;br /&gt;
&lt;br /&gt;
  fontsize:8&lt;br /&gt;
  from: -900   till:  -545  text:[[Neoproterozoic|Neoprote-~rozoic]] shift:(0,1.8)&lt;br /&gt;
  from:-1600   till:  -900  text:[[Mesoproterozoic]]&lt;br /&gt;
  from:-2500   till: -1600  text:[[Paleoproterozoic]]&lt;br /&gt;
  from:-3800   till: -2500  text:[[Archaean]]&lt;br /&gt;
  from: start  till: -3800  text:[[Hadean]]&lt;br /&gt;
&amp;lt;/timeline&amp;gt;&lt;/div&gt;</summary>
		<author><name>Penner</name></author>
	</entry>
	<entry>
		<id>https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Sandbox&amp;diff=1146</id>
		<title>Sandbox</title>
		<link rel="alternate" type="text/html" href="https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Sandbox&amp;diff=1146"/>
		<updated>2009-11-16T17:39:09Z</updated>

		<summary type="html">&lt;p&gt;Penner: /* TimeLine */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Hauptüberschrift =&lt;br /&gt;
&lt;br /&gt;
* einsund&lt;br /&gt;
* zweiund&lt;br /&gt;
* dreiund&lt;br /&gt;
&lt;br /&gt;
== [[Media:29m.raw]] ==&lt;br /&gt;
=== [[Media:32m.raw]] ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== TimeLine ===&lt;br /&gt;
&amp;lt;timeline&amp;gt;&lt;br /&gt;
ImageSize  = width:160 height:550&lt;br /&gt;
PlotArea   = width:50 height:530 left:50 bottom:10&lt;br /&gt;
&lt;br /&gt;
DateFormat = yyyy&lt;br /&gt;
Period     = from:1919 till:1991&lt;br /&gt;
TimeAxis   = orientation:vertical&lt;br /&gt;
ScaleMajor = unit:year increment:5 start:1920&lt;br /&gt;
&lt;br /&gt;
# there is no automatic collision detection ,&lt;br /&gt;
# so shift texts up or down manually to avoid overlap&lt;br /&gt;
&lt;br /&gt;
Define $dx = 25 # shift text to right side of bar&lt;br /&gt;
&lt;br /&gt;
PlotData=&lt;br /&gt;
  bar:Leaders color:red width:25 mark:(line,white) align:left fontsize:S&lt;br /&gt;
&lt;br /&gt;
  from:start till:1922 shift:($dx,15)   text:Vladimir~Ilyich~[[Lenin]]&lt;br /&gt;
  from:1922  till:1953 shift:($dx,5)    text:[[Stalin|Josef Stalin]]&lt;br /&gt;
  from:1953  till:1964 shift:($dx,5)    text:Nikita~[[Khrushchev]]&lt;br /&gt;
  from:1964  till:1982 shift:($dx,5)    text:Leonid~[[Brezhnev]]&lt;br /&gt;
  from:1982  till:1984 shift:($dx,-12)  text:Yuri~[[Andropov]]&lt;br /&gt;
  from:1984  till:1985 shift:($dx,4)    text:Konstantin~[[Chernenko]] fontsize:XS&lt;br /&gt;
  from:1985  till:end  shift:($dx,10)   text:Mikhail~[[Gorbachev]]&lt;br /&gt;
&amp;lt;/timeline&amp;gt;&lt;/div&gt;</summary>
		<author><name>Penner</name></author>
	</entry>
	<entry>
		<id>https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Sandbox&amp;diff=1145</id>
		<title>Sandbox</title>
		<link rel="alternate" type="text/html" href="https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Sandbox&amp;diff=1145"/>
		<updated>2009-11-16T17:38:44Z</updated>

		<summary type="html">&lt;p&gt;Penner: /* TimeLine */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Hauptüberschrift =&lt;br /&gt;
&lt;br /&gt;
* einsund&lt;br /&gt;
* zweiund&lt;br /&gt;
* dreiund&lt;br /&gt;
&lt;br /&gt;
== [[Media:29m.raw]] ==&lt;br /&gt;
=== [[Media:32m.raw]] ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== TimeLine ===&lt;br /&gt;
&amp;lt;timeline&amp;gt;&lt;br /&gt;
ImageSize  = width:160 height:550&lt;br /&gt;
PlotArea   = width:50 height:530 left:50 bottom:10&lt;br /&gt;
&lt;br /&gt;
DateFormat = yyyy&lt;br /&gt;
Period     = from:1919 till:1991&lt;br /&gt;
TimeAxis   = orientation:vertical&lt;br /&gt;
ScaleMajor = unit:year increment:5 start:1920&lt;br /&gt;
&lt;br /&gt;
# there is no automatic collision detection ,&lt;br /&gt;
# so shift texts up or down manually to avoid overlap&lt;br /&gt;
&lt;br /&gt;
Define $dx = 25 # shift text to right side of bar&lt;br /&gt;
&lt;br /&gt;
PlotData=&lt;br /&gt;
  bar:Leaders color:red width:25 mark:(line,white) align:left fontsize:S&lt;br /&gt;
&lt;br /&gt;
  from:start till:1922 shift:($dx,15)   text:Vladimir~Ilyich~[[Lenin]]&lt;br /&gt;
  from:1922  till:1953 shift:($dx,5)    text:[[Stalin|Josef Stalin]]&lt;br /&gt;
  from:1953  till:1964 shift:($dx,5)    text:Nikita~[[Khrushchev]]&lt;br /&gt;
  from:1964  till:1982 shift:($dx,5)    text:Leonid~[[Brezhnev]]&lt;br /&gt;
  from:1982  till:1984 shift:($dx,-12)  text:Yuri~[[Andropov]]&lt;br /&gt;
  from:1984  till:1985 shift:($dx,4)    text:Konstantin~[[Chernenko]] fontsize:XS&lt;br /&gt;
  from:1985  till:end  shift:($dx,10)   text:Mikhail~[[Gorbachev]]&lt;br /&gt;
&amp;lt;/timeline&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;timeline&amp;gt;&lt;br /&gt;
ImageSize  = width:800 height:100&lt;br /&gt;
PlotArea   = width:720 height:75 left:65 bottom:20&lt;br /&gt;
AlignBars  = justify&lt;br /&gt;
&lt;br /&gt;
Colors =&lt;br /&gt;
  id:epoch  value:rgb(0.7,0.7,1) # light yellow&lt;br /&gt;
  id:period value:rgb(1,0.7,0.7) # light red&lt;br /&gt;
  id:age    value:rgb(0.7,1,0.7) # light green&lt;br /&gt;
  id:era    value:rgb(1,1,0.7)   # light blue&lt;br /&gt;
  id:eon    value:rgb(1,0.7,1)   # light purple&lt;br /&gt;
  id:black  value:black&lt;br /&gt;
&lt;br /&gt;
Period      = from:-4500 till:0&lt;br /&gt;
TimeAxis    = orientation:horizontal&lt;br /&gt;
ScaleMajor  = unit:year increment:500 start:-4500&lt;br /&gt;
ScaleMinor  = unit:year increment:100 start:-4500&lt;br /&gt;
&lt;br /&gt;
Define $markred = text:&amp;quot;*&amp;quot; textcolor:red shift:(0,3) fontsize:10&lt;br /&gt;
&lt;br /&gt;
PlotData=&lt;br /&gt;
  align:center textcolor:black fontsize:8 mark:(line,black) width:25 shift:(0,-5)&lt;br /&gt;
&lt;br /&gt;
  bar:eon color:eon&lt;br /&gt;
&lt;br /&gt;
  at:      0   align:right  $markred&lt;br /&gt;
  at:   -545   align:left   $markred&lt;br /&gt;
  from: -545   till:    0   text:[[Phanerozoic]]&lt;br /&gt;
  from:-4500   till:    0   text:[[Precambrian]]&lt;br /&gt;
&lt;br /&gt;
  bar:era color:era&lt;br /&gt;
&lt;br /&gt;
  from:  -64.3 till:    0   text:C~z shift:(0,1.5)&lt;br /&gt;
  from: -251.1 till:  -64.3 text:[[Mesozoic|Meso~zoic]] shift:(0,1.5)&lt;br /&gt;
  from: -545   till: -251.1 text:[[Paleozoic|Paleo~zoic]] shift:(0,1.5)&lt;br /&gt;
  from:-4500   till: -545   text:[[Proterozoic]]&lt;br /&gt;
&lt;br /&gt;
  bar:period color:period&lt;br /&gt;
&lt;br /&gt;
  fontsize:6&lt;br /&gt;
  from:   -1.6 till:    0&lt;br /&gt;
  from:  -64.3 till:   -1.6&lt;br /&gt;
  from: -146   till:  -64.3&lt;br /&gt;
  from: -208   till: -146&lt;br /&gt;
  from: -251.1 till: -208&lt;br /&gt;
  from: -286   till: -251.1&lt;br /&gt;
  from: -360   till: -286&lt;br /&gt;
  from: -408.5 till: -360&lt;br /&gt;
  from: -443.5 till: -408.5&lt;br /&gt;
  from: -490   till: -443.5&lt;br /&gt;
  from: -545   till: -490&lt;br /&gt;
&lt;br /&gt;
  fontsize:8&lt;br /&gt;
  from: -900   till:  -545  text:[[Neoproterozoic|Neoprote-~rozoic]] shift:(0,1.8)&lt;br /&gt;
  from:-1600   till:  -900  text:[[Mesoproterozoic]]&lt;br /&gt;
  from:-2500   till: -1600  text:[[Paleoproterozoic]]&lt;br /&gt;
  from:-3800   till: -2500  text:[[Archaean]]&lt;br /&gt;
  from: start  till: -3800  text:[[Hadean]]&lt;br /&gt;
&amp;lt;/timeline&amp;gt;&lt;/div&gt;</summary>
		<author><name>Penner</name></author>
	</entry>
	<entry>
		<id>https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Sandbox&amp;diff=1144</id>
		<title>Sandbox</title>
		<link rel="alternate" type="text/html" href="https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Sandbox&amp;diff=1144"/>
		<updated>2009-11-16T17:38:28Z</updated>

		<summary type="html">&lt;p&gt;Penner: /* TimeLine */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Hauptüberschrift =&lt;br /&gt;
&lt;br /&gt;
* einsund&lt;br /&gt;
* zweiund&lt;br /&gt;
* dreiund&lt;br /&gt;
&lt;br /&gt;
== [[Media:29m.raw]] ==&lt;br /&gt;
=== [[Media:32m.raw]] ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== TimeLine ===&lt;br /&gt;
&amp;lt;timeline&amp;gt;&lt;br /&gt;
ImageSize  = width:160 height:550&lt;br /&gt;
PlotArea   = width:50 height:530 left:50 bottom:10&lt;br /&gt;
&lt;br /&gt;
DateFormat = yyyy&lt;br /&gt;
Period     = from:1919 till:1991&lt;br /&gt;
TimeAxis   = orientation:vertical&lt;br /&gt;
ScaleMajor = unit:year increment:5 start:1920&lt;br /&gt;
&lt;br /&gt;
# there is no automatic collision detection ,&lt;br /&gt;
# so shift texts up or down manually to avoid overlap&lt;br /&gt;
&lt;br /&gt;
Define $dx = 25 # shift text to right side of bar&lt;br /&gt;
&lt;br /&gt;
PlotData=&lt;br /&gt;
  bar:Leaders color:red width:25 mark:(line,white) align:left fontsize:S&lt;br /&gt;
&lt;br /&gt;
  from:start till:1922 shift:($dx,15)   text:Vladimir~Ilyich~[[Lenin]]&lt;br /&gt;
  from:1922  till:1953 shift:($dx,5)    text:[[Stalin|Josef Stalin]]&lt;br /&gt;
  from:1953  till:1964 shift:($dx,5)    text:Nikita~[[Khrushchev]]&lt;br /&gt;
  from:1964  till:1982 shift:($dx,5)    text:Leonid~[[Brezhnev]]&lt;br /&gt;
  from:1982  till:1984 shift:($dx,-12)  text:Yuri~[[Andropov]]&lt;br /&gt;
  from:1984  till:1985 shift:($dx,4)    text:Konstantin~[[Chernenko]] fontsize:XS&lt;br /&gt;
  from:1985  till:end  shift:($dx,10)   text:Mikhail~[[Gorbachev]]&lt;br /&gt;
&amp;lt;/timeline&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;timeline&amp;gt;&lt;br /&gt;
ImageSize  = width:800 height:100&lt;br /&gt;
PlotArea   = width:720 height:75 left:65 bottom:20&lt;br /&gt;
AlignBars  = justify&lt;br /&gt;
&lt;br /&gt;
Colors =&lt;br /&gt;
  id:epoch  value:rgb(0.7,0.7,1) # light yellow&lt;br /&gt;
  id:period value:rgb(1,0.7,0.7) # light red&lt;br /&gt;
  id:age    value:rgb(0.7,1,0.7) # light green&lt;br /&gt;
  id:era    value:rgb(1,1,0.7)   # light blue&lt;br /&gt;
  id:eon    value:rgb(1,0.7,1)   # light purple&lt;br /&gt;
  id:black  value:black&lt;br /&gt;
&lt;br /&gt;
Period      = from:-4500 till:0&lt;br /&gt;
TimeAxis    = orientation:horizontal&lt;br /&gt;
ScaleMajor  = unit:year increment:500 start:-4500&lt;br /&gt;
ScaleMinor  = unit:year increment:100 start:-4500&lt;br /&gt;
&lt;br /&gt;
Define $markred = text:&amp;quot;*&amp;quot; textcolor:red shift:(0,3) fontsize:10&lt;br /&gt;
&lt;br /&gt;
PlotData=&lt;br /&gt;
  align:center textcolor:black fontsize:8 mark:(line,black) width:25 shift:(0,-5)&lt;br /&gt;
&lt;br /&gt;
  bar:eon color:eon&lt;br /&gt;
&lt;br /&gt;
  at:      0   align:right  $markred&lt;br /&gt;
  at:   -545   align:left   $markred&lt;br /&gt;
  from: -545   till:    0   text:[[Phanerozoic]]&lt;br /&gt;
  from:-4500   till:    0   text:[[Precambrian]]&lt;br /&gt;
&lt;br /&gt;
  bar:era color:era&lt;br /&gt;
&lt;br /&gt;
  from:  -64.3 till:    0   text:C~z shift:(0,1.5)&lt;br /&gt;
  from: -251.1 till:  -64.3 text:[[Mesozoic|Meso~zoic]] shift:(0,1.5)&lt;br /&gt;
  from: -545   till: -251.1 text:[[Paleozoic|Paleo~zoic]] shift:(0,1.5)&lt;br /&gt;
  from:-4500   till: -545   text:[[Proterozoic]]&lt;br /&gt;
&lt;br /&gt;
  bar:period color:period&lt;br /&gt;
&lt;br /&gt;
  fontsize:6&lt;br /&gt;
  from:   -1.6 till:    0&lt;br /&gt;
  from:  -64.3 till:   -1.6&lt;br /&gt;
  from: -146   till:  -64.3&lt;br /&gt;
  from: -208   till: -146&lt;br /&gt;
  from: -251.1 till: -208&lt;br /&gt;
  from: -286   till: -251.1&lt;br /&gt;
  from: -360   till: -286&lt;br /&gt;
  from: -408.5 till: -360&lt;br /&gt;
  from: -443.5 till: -408.5&lt;br /&gt;
  from: -490   till: -443.5&lt;br /&gt;
  from: -545   till: -490&lt;br /&gt;
&lt;br /&gt;
  fontsize:8&lt;br /&gt;
  from: -900   till:  -545  text:[[Neoproterozoic| Neoprote-~rozoic]] shift:(0,1.8)&lt;br /&gt;
  from:-1600   till:  -900  text:[[Mesoproterozoic]]&lt;br /&gt;
  from:-2500   till: -1600  text:[[Paleoproterozoic]]&lt;br /&gt;
  from:-3800   till: -2500  text:[[Archaean]]&lt;br /&gt;
  from: start  till: -3800  text:[[Hadean]]&lt;br /&gt;
&amp;lt;/timeline&amp;gt;&lt;/div&gt;</summary>
		<author><name>Penner</name></author>
	</entry>
	<entry>
		<id>https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Sandbox&amp;diff=1143</id>
		<title>Sandbox</title>
		<link rel="alternate" type="text/html" href="https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Sandbox&amp;diff=1143"/>
		<updated>2009-11-16T17:38:15Z</updated>

		<summary type="html">&lt;p&gt;Penner: /* TimeLine */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Hauptüberschrift =&lt;br /&gt;
&lt;br /&gt;
* einsund&lt;br /&gt;
* zweiund&lt;br /&gt;
* dreiund&lt;br /&gt;
&lt;br /&gt;
== [[Media:29m.raw]] ==&lt;br /&gt;
=== [[Media:32m.raw]] ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== TimeLine ===&lt;br /&gt;
&amp;lt;timeline&amp;gt;&lt;br /&gt;
ImageSize  = width:160 height:550&lt;br /&gt;
PlotArea   = width:50 height:530 left:50 bottom:10&lt;br /&gt;
&lt;br /&gt;
DateFormat = yyyy&lt;br /&gt;
Period     = from:1919 till:1991&lt;br /&gt;
TimeAxis   = orientation:vertical&lt;br /&gt;
ScaleMajor = unit:year increment:5 start:1920&lt;br /&gt;
&lt;br /&gt;
# there is no automatic collision detection ,&lt;br /&gt;
# so shift texts up or down manually to avoid overlap&lt;br /&gt;
&lt;br /&gt;
Define $dx = 25 # shift text to right side of bar&lt;br /&gt;
&lt;br /&gt;
PlotData=&lt;br /&gt;
  bar:Leaders color:red width:25 mark:(line,white) align:left fontsize:S&lt;br /&gt;
&lt;br /&gt;
  from:start till:1922 shift:($dx,15)   text:Vladimir~Ilyich~[[Lenin]]&lt;br /&gt;
  from:1922  till:1953 shift:($dx,5)    text:[[Stalin|Josef Stalin]]&lt;br /&gt;
  from:1953  till:1964 shift:($dx,5)    text:Nikita~[[Khrushchev]]&lt;br /&gt;
  from:1964  till:1982 shift:($dx,5)    text:Leonid~[[Brezhnev]]&lt;br /&gt;
  from:1982  till:1984 shift:($dx,-12)  text:Yuri~[[Andropov]]&lt;br /&gt;
  from:1984  till:1985 shift:($dx,4)    text:Konstantin~[[Chernenko]] fontsize:XS&lt;br /&gt;
  from:1985  till:end  shift:($dx,10)   text:Mikhail~[[Gorbachev]]&lt;br /&gt;
&amp;lt;/timeline&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;timeline&amp;gt;&lt;br /&gt;
ImageSize  = width:800 height:100&lt;br /&gt;
PlotArea   = width:720 height:75 left:65 bottom:20&lt;br /&gt;
AlignBars  = justify&lt;br /&gt;
&lt;br /&gt;
Colors =&lt;br /&gt;
  id:epoch  value:rgb(0.7,0.7,1) # light yellow&lt;br /&gt;
  id:period value:rgb(1,0.7,0.7) # light red&lt;br /&gt;
  id:age    value:rgb(0.7,1,0.7) # light green&lt;br /&gt;
  id:era    value:rgb(1,1,0.7)   # light blue&lt;br /&gt;
  id:eon    value:rgb(1,0.7,1)   # light purple&lt;br /&gt;
  id:black  value:black&lt;br /&gt;
&lt;br /&gt;
Period      = from:-4500 till:0&lt;br /&gt;
TimeAxis    = orientation:horizontal&lt;br /&gt;
ScaleMajor  = unit:year increment:500 start:-4500&lt;br /&gt;
ScaleMinor  = unit:year increment:100 start:-4500&lt;br /&gt;
&lt;br /&gt;
Define $markred = text:&amp;quot;*&amp;quot; textcolor:red shift:(0,3) fontsize:10&lt;br /&gt;
&lt;br /&gt;
PlotData=&lt;br /&gt;
  align:center textcolor:black fontsize:8 mark:(line,black) width:25 shift:(0,-5)&lt;br /&gt;
&lt;br /&gt;
  bar:eon color:eon&lt;br /&gt;
&lt;br /&gt;
  at:      0   align:right  $markred&lt;br /&gt;
  at:   -545   align:left   $markred&lt;br /&gt;
  from: -545   till:    0   text:[[Phanerozoic]]&lt;br /&gt;
  from:-4500   till:    0   text:[[Precambrian]]&lt;br /&gt;
&lt;br /&gt;
  bar:era color:era&lt;br /&gt;
&lt;br /&gt;
  from:  -64.3 till:    0   text:C~z shift:(0,1.5)&lt;br /&gt;
  from: -251.1 till:  -64.3 text:[[Mesozoic|Meso~zoic]] shift:(0,1.5)&lt;br /&gt;
  from: -545   till: -251.1 text:[[Paleozoic|Paleo~zoic]] shift:(0,1.5)&lt;br /&gt;
  from:-4500   till: -545   text:[[Proterozoic]]&lt;br /&gt;
&lt;br /&gt;
  bar:period color:period&lt;br /&gt;
&lt;br /&gt;
  fontsize:6&lt;br /&gt;
  from:   -1.6 till:    0&lt;br /&gt;
  from:  -64.3 till:   -1.6&lt;br /&gt;
  from: -146   till:  -64.3&lt;br /&gt;
  from: -208   till: -146&lt;br /&gt;
  from: -251.1 till: -208&lt;br /&gt;
  from: -286   till: -251.1&lt;br /&gt;
  from: -360   till: -286&lt;br /&gt;
  from: -408.5 till: -360&lt;br /&gt;
  from: -443.5 till: -408.5&lt;br /&gt;
  from: -490   till: -443.5&lt;br /&gt;
  from: -545   till: -490&lt;br /&gt;
&lt;br /&gt;
  fontsize:8&lt;br /&gt;
  from: -900   till:  -545  text:[[Neoproterozoic|Neoprote-~rozoic]] shift:(0,1.8)&lt;br /&gt;
  from:-1600   till:  -900  text:[[Mesoproterozoic]]&lt;br /&gt;
  from:-2500   till: -1600  text:[[Paleoproterozoic]]&lt;br /&gt;
  from:-3800   till: -2500  text:[[Archaean]]&lt;br /&gt;
  from: start  till: -3800  text:[[Hadean]]&lt;br /&gt;
&amp;lt;/timeline&amp;gt;&lt;/div&gt;</summary>
		<author><name>Penner</name></author>
	</entry>
	<entry>
		<id>https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Sandbox&amp;diff=1142</id>
		<title>Sandbox</title>
		<link rel="alternate" type="text/html" href="https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Sandbox&amp;diff=1142"/>
		<updated>2009-11-16T17:36:06Z</updated>

		<summary type="html">&lt;p&gt;Penner: /* TimeLine */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Hauptüberschrift =&lt;br /&gt;
&lt;br /&gt;
* einsund&lt;br /&gt;
* zweiund&lt;br /&gt;
* dreiund&lt;br /&gt;
&lt;br /&gt;
== [[Media:29m.raw]] ==&lt;br /&gt;
=== [[Media:32m.raw]] ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== TimeLine ===&lt;br /&gt;
&amp;lt;timeline&amp;gt;&lt;br /&gt;
ImageSize  = width:160 height:550&lt;br /&gt;
PlotArea   = width:50 height:530 left:50 bottom:10&lt;br /&gt;
&lt;br /&gt;
DateFormat = yyyy&lt;br /&gt;
Period     = from:1919 till:1991&lt;br /&gt;
TimeAxis   = orientation:vertical&lt;br /&gt;
ScaleMajor = unit:year increment:5 start:1920&lt;br /&gt;
&lt;br /&gt;
# there is no automatic collision detection,&lt;br /&gt;
# so shift texts up or down manually to avoid overlap&lt;br /&gt;
&lt;br /&gt;
Define $dx = 25 # shift text to right side of bar&lt;br /&gt;
&lt;br /&gt;
PlotData=&lt;br /&gt;
  bar:Leaders color:red width:25 mark:(line,white) align:left fontsize:S&lt;br /&gt;
&lt;br /&gt;
  from:start till:1922 shift:($dx,15)   text:Vladimir~Ilyich~[[Lenin]]&lt;br /&gt;
  from:1922  till:1953 shift:($dx,5)    text:[[Stalin|Josef Stalin]]&lt;br /&gt;
  from:1953  till:1964 shift:($dx,5)    text:Nikita~[[Khrushchev]]&lt;br /&gt;
  from:1964  till:1982 shift:($dx,5)    text:Leonid~[[Brezhnev]]&lt;br /&gt;
  from:1982  till:1984 shift:($dx,-12)  text:Yuri~[[Andropov]]&lt;br /&gt;
  from:1984  till:1985 shift:($dx,4)    text:Konstantin~[[Chernenko]] fontsize:XS&lt;br /&gt;
  from:1985  till:end  shift:($dx,10)   text:Mikhail~[[Gorbachev]]&lt;br /&gt;
&amp;lt;/timeline&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;timeline&amp;gt;&lt;br /&gt;
ImageSize  = width:800 height:100&lt;br /&gt;
PlotArea   = width:720 height:75 left:65 bottom:20&lt;br /&gt;
AlignBars  = justify&lt;br /&gt;
&lt;br /&gt;
Colors =&lt;br /&gt;
  id:epoch  value:rgb(0.7,0.7,1) # light yellow&lt;br /&gt;
  id:period value:rgb(1,0.7,0.7) # light red&lt;br /&gt;
  id:age    value:rgb(0.7,1,0.7) # light green&lt;br /&gt;
  id:era    value:rgb(1,1,0.7)   # light blue&lt;br /&gt;
  id:eon    value:rgb(1,0.7,1)   # light purple&lt;br /&gt;
  id:black  value:black&lt;br /&gt;
&lt;br /&gt;
Period      = from:-4500 till:0&lt;br /&gt;
TimeAxis    = orientation:horizontal&lt;br /&gt;
ScaleMajor  = unit:year increment:500 start:-4500&lt;br /&gt;
ScaleMinor  = unit:year increment:100 start:-4500&lt;br /&gt;
&lt;br /&gt;
Define $markred = text:&amp;quot;*&amp;quot; textcolor:red shift:(0,3) fontsize:10&lt;br /&gt;
&lt;br /&gt;
PlotData=&lt;br /&gt;
  align:center textcolor:black fontsize:8 mark:(line,black) width:25 shift:(0,-5)&lt;br /&gt;
&lt;br /&gt;
  bar:eon color:eon&lt;br /&gt;
&lt;br /&gt;
  at:      0   align:right  $markred&lt;br /&gt;
  at:   -545   align:left   $markred&lt;br /&gt;
  from: -545   till:    0   text:[[Phanerozoic]]&lt;br /&gt;
  from:-4500   till:    0   text:[[Precambrian]]&lt;br /&gt;
&lt;br /&gt;
  bar:era color:era&lt;br /&gt;
&lt;br /&gt;
  from:  -64.3 till:    0   text:C~z shift:(0,1.5)&lt;br /&gt;
  from: -251.1 till:  -64.3 text:[[Mesozoic|Meso~zoic]] shift:(0,1.5)&lt;br /&gt;
  from: -545   till: -251.1 text:[[Paleozoic|Paleo~zoic]] shift:(0,1.5)&lt;br /&gt;
  from:-4500   till: -545   text:[[Proterozoic]]&lt;br /&gt;
&lt;br /&gt;
  bar:period color:period&lt;br /&gt;
&lt;br /&gt;
  fontsize:6&lt;br /&gt;
  from:   -1.6 till:    0&lt;br /&gt;
  from:  -64.3 till:   -1.6&lt;br /&gt;
  from: -146   till:  -64.3&lt;br /&gt;
  from: -208   till: -146&lt;br /&gt;
  from: -251.1 till: -208&lt;br /&gt;
  from: -286   till: -251.1&lt;br /&gt;
  from: -360   till: -286&lt;br /&gt;
  from: -408.5 till: -360&lt;br /&gt;
  from: -443.5 till: -408.5&lt;br /&gt;
  from: -490   till: -443.5&lt;br /&gt;
  from: -545   till: -490&lt;br /&gt;
&lt;br /&gt;
  fontsize:8&lt;br /&gt;
  from: -900   till:  -545  text:[[Neoproterozoic|Neoprote-~rozoic]] shift:(0,1.8)&lt;br /&gt;
  from:-1600   till:  -900  text:[[Mesoproterozoic]]&lt;br /&gt;
  from:-2500   till: -1600  text:[[Paleoproterozoic]]&lt;br /&gt;
  from:-3800   till: -2500  text:[[Archaean]]&lt;br /&gt;
  from: start  till: -3800  text:[[Hadean]]&lt;br /&gt;
&amp;lt;/timeline&amp;gt;&lt;/div&gt;</summary>
		<author><name>Penner</name></author>
	</entry>
	<entry>
		<id>https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Sandbox&amp;diff=1141</id>
		<title>Sandbox</title>
		<link rel="alternate" type="text/html" href="https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Sandbox&amp;diff=1141"/>
		<updated>2009-11-16T17:35:34Z</updated>

		<summary type="html">&lt;p&gt;Penner: /* Media:32m.raw */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Hauptüberschrift =&lt;br /&gt;
&lt;br /&gt;
* einsund&lt;br /&gt;
* zweiund&lt;br /&gt;
* dreiund&lt;br /&gt;
&lt;br /&gt;
== [[Media:29m.raw]] ==&lt;br /&gt;
=== [[Media:32m.raw]] ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== TimeLine ===&lt;br /&gt;
&amp;lt;timeline&amp;gt;&lt;br /&gt;
ImageSize  = width:160 height:550&lt;br /&gt;
PlotArea   = width:50 height:530 left:50 bottom:10&lt;br /&gt;
&lt;br /&gt;
DateFormat = yyyy&lt;br /&gt;
Period     = from:1919 till:1991&lt;br /&gt;
TimeAxis   = orientation:vertical&lt;br /&gt;
ScaleMajor = unit:year increment:5 start:1920&lt;br /&gt;
&lt;br /&gt;
# there is no automatic collision detection,&lt;br /&gt;
# so shift texts up or down manually to avoid overlap&lt;br /&gt;
&lt;br /&gt;
Define $dx = 25 # shift text to right side of bar&lt;br /&gt;
&lt;br /&gt;
PlotData=&lt;br /&gt;
  bar:Leaders color:red width:25 mark:(line,white) align:left fontsize:S&lt;br /&gt;
&lt;br /&gt;
  from:start till:1922 shift:($dx,15)   text:Vladimir~Ilyich~[[Lenin]]&lt;br /&gt;
  from:1922  till:1953 shift:($dx,5)    text:[[Stalin|Josef Stalin]]&lt;br /&gt;
  from:1953  till:1964 shift:($dx,5)    text:Nikita~[[Khrushchev]]&lt;br /&gt;
  from:1964  till:1982 shift:($dx,5)    text:Leonid~[[Brezhnev]]&lt;br /&gt;
  from:1982  till:1984 shift:($dx,-12)  text:Yuri~[[Andropov]]&lt;br /&gt;
  from:1984  till:1985 shift:($dx,4)    text:Konstantin~[[Chernenko]] fontsize:XS&lt;br /&gt;
  from:1985  till:end  shift:($dx,10)   text:Mikhail~[[Gorbachev]]&lt;br /&gt;
&amp;lt;/timeline&amp;gt;&lt;/div&gt;</summary>
		<author><name>Penner</name></author>
	</entry>
	<entry>
		<id>https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Daten_Auslesen&amp;diff=743</id>
		<title>Daten Auslesen</title>
		<link rel="alternate" type="text/html" href="https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Daten_Auslesen&amp;diff=743"/>
		<updated>2009-10-02T14:51:27Z</updated>

		<summary type="html">&lt;p&gt;Penner: /* Datenaufnahme */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Paralleles Auslesen von diversen Sensoren und Zusammenbauen der Daten=&lt;br /&gt;
== Rohdatenspeicherung ==&lt;br /&gt;
Soweit ich verstanden habe, besteht die Aufgabe darin, den AD-Wandler mit einer Frequenz im Bereich 1 kHz und die Koordinaten mit einer Frequenz im Bereich 10 Hz auszulesen. Evtl. kommen auch mal noch weitere Sensoren hinzu. Die Weiterverarbeitung soll in Form von n-Tupeln (Zeitstempel; AD-Wert; Koordinaten) erfolgen. Das Ganze soll auch unter Belastung des Rechners noch zuverlässig erfolgen. Die Speicherung der Rohdaten erfolgt dabei sinnvollerweise nicht als n-Tupel, sondern in einem Raster der Art:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;(t_{n,0},ad_{n,0},c_{n,0});\, (t_1,ad_1);\, (t_2,ad_2);\, ... (t_{n,i},ad_{n,i},c_{n,i});\, (t_{n+1},ad_{n+1});\, ... &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
mit &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;n=k*i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Koordinaten werden also nur aller k Zeitschritte auch wirklich ausgelesen und aufgeschrieben. Aus solch einem File kann für die Weiterverarbeitung wieder eine Liste mit kompletten n-Tupen erstellt werden. Dabei kann man die Koordinaten zwischen den Stützstellen interpolieren oder man lässt sie einfach konstant bis zum nächsten Messpunkt. Evtl. würde eine von beiden Varianten irgendwelche Statistiken stören. Die Rohdaten verursachen so weniger Last beim Schreiben und belegen weniger Speicherplatz als wenn immer ganze n-Tupel geschrieben werden müssten.&lt;br /&gt;
&lt;br /&gt;
== Datenaufnahme ==&lt;br /&gt;
Um eine möglichst jitterarme Datenaufnahme zu gewährleisten scheint es sinvoll, die einzelnen Sensoren in jeweils einen eigenen Prozess oder Thread zu packen. Dann kann der sich in aller Genauigkeit um seinen Sensor kümmern und wird hoffentlich vom Betriebssystem richtig mit Zeitscheiben versorgt. Dabei benötigt man allerdings eine gemeinsame Zeitbasis mit ausreichender Genauigkeit.&lt;br /&gt;
&lt;br /&gt;
In [[Daten_Auswerten#Einzelwerte]] steht etwas von einem Ringpuffer der im DA vorhanden sei und dessen eigenständiger Messwertaufnahme in eben diesen Ringpuffer. Wie funktioniert das denn eigentlich?&lt;br /&gt;
&lt;br /&gt;
Ich stelle mir den prinzipiellen Ablauf so vor:&lt;br /&gt;
# zentrale Instanz übergibt Details wie Samplefrequenz, ... und den Startzeitpunkt an einzelne Messprozesse.&lt;br /&gt;
# Messprozesse warten auf Startzeitpunkt und legen dann los&lt;br /&gt;
# Messprozesse messen vor sich hin, in persönlichen großen Ringpuffer.&lt;br /&gt;
# zentrale Instanz holt sich ab und an aus den Ringpuffern die Daten die sie haben will und schreibt sie in ein File&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Verschiedene Prozesse ==&lt;br /&gt;
Die Kommunikation könnte man über Pipes, Fifos, Shared-Memory, Message-Queues, TCP (Sockets) machen, im Prinzip auch mit MPI.&lt;br /&gt;
&lt;br /&gt;
* MPI ist Mist, weil man dann immer ein MPI-System braucht&lt;br /&gt;
* Message Queues sind im Prinzip cool, praktisch aber viel zu kurz und für zu kleine Datenmengen gedacht (10 Messages a 8kB ist Standard unter Linux). Dafür soll das halt sehr schnell sein (im L1-Cache bleiben etc).&lt;br /&gt;
* Pipes, Fifos ist halt ein bisschen fummelig. TCP keine Ahnung&lt;br /&gt;
* SHMem ist eigentlich ziemlich ok. Man muss natürlich von Hand synchronisieren. Das ist eigentlich auch kein Ding weiter. Wenn man einmal Zugriff auf den gemeinsamen Speicherbereich hat, sollte das nicht schwieriger sein als mit OpenMP (s.u.).&lt;br /&gt;
&lt;br /&gt;
*[http://www.ecst.csuchico.edu/~beej/guide/ipc/mq.html Message Queues]&lt;br /&gt;
*[http://kirkwylie.blogspot.com/2008/10/posix-message-queues-useful-but-limited.html POSIX Message in Linux]&lt;br /&gt;
&lt;br /&gt;
== Verschiedene Threads ==&lt;br /&gt;
Nachteil ist, dass die einzelnen Ausleseprozesse nicht gegeneinander geschützt sind. &lt;br /&gt;
=== OpenMP ===&lt;br /&gt;
Dafür gibt es die nahezu triviale Variante mit OpenMP. Der geringe Aufwand könnte die eher theoretischen Nachteile durchaus wieder wettmachen, finde ich.&lt;br /&gt;
Ich stelle mit das ungefähr so vor:&lt;br /&gt;
&lt;br /&gt;
 #include &amp;lt;iostream&amp;gt;&lt;br /&gt;
 #include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;omp.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 using namespace std;&lt;br /&gt;
 int showAction; &lt;br /&gt;
 &lt;br /&gt;
 /* Das ist eine etwas missbräuchliche aber immer noch sehr einfache Verwendung&lt;br /&gt;
   von OpenMP zur Arbeit mit Threads. Auf alle Fälle ist es schön&lt;br /&gt;
   einfach. Evtl. müssen die Jobs das Lesen nicht in einer critical Section&lt;br /&gt;
   machen aber es wird hier nichts schaden.&lt;br /&gt;
 */&lt;br /&gt;
 &lt;br /&gt;
 int job1(void)&lt;br /&gt;
 {&lt;br /&gt;
  for(;;)&lt;br /&gt;
  {&lt;br /&gt;
 #pragma  critical&lt;br /&gt;
   int sAct=showAction;&lt;br /&gt;
   if (sAct&amp;amp;1) cout &amp;lt;&amp;lt; &amp;quot;1&amp;quot;;&lt;br /&gt;
   cout.flush();&lt;br /&gt;
   usleep(5000); // nominell 5 ms&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 int job2(void)&lt;br /&gt;
 {&lt;br /&gt;
  for(;;)&lt;br /&gt;
  {&lt;br /&gt;
   #pragma  critical&lt;br /&gt;
   int sAct=showAction;&lt;br /&gt;
   if (sAct&amp;amp;2) cout &amp;lt;&amp;lt; &amp;quot;2&amp;quot;;&lt;br /&gt;
   cout.flush();&lt;br /&gt;
   usleep(5000); // 5 ms&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 int job3(void)&lt;br /&gt;
 {&lt;br /&gt;
  for(;;)&lt;br /&gt;
  {&lt;br /&gt;
   #pragma  critical&lt;br /&gt;
   int sAct=showAction;&lt;br /&gt;
   if (sAct&amp;amp;4) cout &amp;lt;&amp;lt; &amp;quot;3&amp;quot;;&lt;br /&gt;
   cout.flush();&lt;br /&gt;
   usleep(5000); // 5 ms&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 int main()&lt;br /&gt;
 {&lt;br /&gt;
  int nthreads, tid;&lt;br /&gt;
  omp_set_nested(1);&lt;br /&gt;
 &lt;br /&gt;
 /* Fork a team of threads with each thread having a private tid variable */&lt;br /&gt;
 #pragma omp parallel private(tid) num_threads (4)&lt;br /&gt;
   {&lt;br /&gt;
 &lt;br /&gt;
   /* Obtain and print thread id */&lt;br /&gt;
   tid = omp_get_thread_num();&lt;br /&gt;
   printf(&amp;quot;Hello World from thread = %d\n&amp;quot;, tid);&lt;br /&gt;
   switch (tid)&lt;br /&gt;
   {&lt;br /&gt;
    case 1: job1(); break;&lt;br /&gt;
    case 2: job2(); break;&lt;br /&gt;
    case 3: job3(); break;&lt;br /&gt;
   }&lt;br /&gt;
   /* Only master thread does this */&lt;br /&gt;
   if (tid == 0)&lt;br /&gt;
   {&lt;br /&gt;
    nthreads = omp_get_num_threads();&lt;br /&gt;
    printf(&amp;quot;Number of threads = %d\n&amp;quot;, nthreads);&lt;br /&gt;
   }&lt;br /&gt;
   for(;;) // master thread verteilt die aufgaben&lt;br /&gt;
   {&lt;br /&gt;
 #pragma critical&lt;br /&gt;
    showAction=rand();&lt;br /&gt;
    usleep(100000); // nominell 100 ms&lt;br /&gt;
   }&lt;br /&gt;
  }  /* All threads join master thread and terminate */&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* [http://cclh61.chm.tu-dresden.de/edv/manuals/xlc5/compiler/ref/ruompcrt.htm critical section]&lt;br /&gt;
&lt;br /&gt;
== Synchronisation ==&lt;br /&gt;
Mit den Pragmas von OpenMP kann man eine Synchronisation erreichen. Ein Thread wartet auf andere Threads, ich würde denken aktiv. Für Zwecke des Datensampelns sind die meisten Threads fast immer in Wartestellung. OpenMP bietet die Möglichkeit, Locks zu setzen. Darauf aufbauend könnte man eine sinnvolle Datenübergabe bauen und dazwischen die Threads Schlafen legen.&lt;br /&gt;
Das stelle ich mir so vor:&lt;/div&gt;</summary>
		<author><name>Penner</name></author>
	</entry>
	<entry>
		<id>https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Daten_Auslesen&amp;diff=742</id>
		<title>Daten Auslesen</title>
		<link rel="alternate" type="text/html" href="https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Daten_Auslesen&amp;diff=742"/>
		<updated>2009-10-02T14:42:06Z</updated>

		<summary type="html">&lt;p&gt;Penner: /* Rohdatenspeicherung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Paralleles Auslesen von diversen Sensoren und Zusammenbauen der Daten=&lt;br /&gt;
== Rohdatenspeicherung ==&lt;br /&gt;
Soweit ich verstanden habe, besteht die Aufgabe darin, den AD-Wandler mit einer Frequenz im Bereich 1 kHz und die Koordinaten mit einer Frequenz im Bereich 10 Hz auszulesen. Evtl. kommen auch mal noch weitere Sensoren hinzu. Die Weiterverarbeitung soll in Form von n-Tupeln (Zeitstempel; AD-Wert; Koordinaten) erfolgen. Das Ganze soll auch unter Belastung des Rechners noch zuverlässig erfolgen. Die Speicherung der Rohdaten erfolgt dabei sinnvollerweise nicht als n-Tupel, sondern in einem Raster der Art:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;(t_{n,0},ad_{n,0},c_{n,0});\, (t_1,ad_1);\, (t_2,ad_2);\, ... (t_{n,i},ad_{n,i},c_{n,i});\, (t_{n+1},ad_{n+1});\, ... &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
mit &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;n=k*i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Koordinaten werden also nur aller k Zeitschritte auch wirklich ausgelesen und aufgeschrieben. Aus solch einem File kann für die Weiterverarbeitung wieder eine Liste mit kompletten n-Tupen erstellt werden. Dabei kann man die Koordinaten zwischen den Stützstellen interpolieren oder man lässt sie einfach konstant bis zum nächsten Messpunkt. Evtl. würde eine von beiden Varianten irgendwelche Statistiken stören. Die Rohdaten verursachen so weniger Last beim Schreiben und belegen weniger Speicherplatz als wenn immer ganze n-Tupel geschrieben werden müssten.&lt;br /&gt;
&lt;br /&gt;
== Datenaufnahme ==&lt;br /&gt;
Um eine möglichst jitterarme Datenaufnahme zu gewährleisten scheint es sinvoll, die einzelnen Sensoren in jeweils einen eigenen Prozess oder Thread zu packen. Dann kann der sich in aller Genauigkeit um seinen Sensor kümmern und wird hoffentlich vom Betriebssystem richtig mit Zeitscheiben versorgt. Dabei benötigt man allerdings eine gemeinsame Zeitbasis mit ausreichender Genauigkeit.&lt;br /&gt;
&lt;br /&gt;
In [[Daten_Auswerten#Einzelwerte]] steht etwas von einem Ringpuffer der im DA vorhanden sei und dessen eigenständiger Messwertaufnahme in eben diesen Ringpuffer. Wie funktioniert das denn eigentlich?&lt;br /&gt;
&lt;br /&gt;
Ich stelle mir den prinzipiellen Ablauf so vor:&lt;br /&gt;
# zentrale Instanz übergibt Details wie Samplefrequenz, ... und den Startzeitpunkt an einzelne Messprozesse.&lt;br /&gt;
# Messprozesse warten auf Startzeitpunkt und legen dann los&lt;br /&gt;
# Messprozesse messen vor sich hin, in persönlichen großen Ringpuffer.&lt;br /&gt;
# zentrale Instanz holt sich ab und an aus den Ringpuffern die Daten die sie haben will und schreibt sie in ein File&lt;br /&gt;
&lt;br /&gt;
== Verschiedene Prozesse ==&lt;br /&gt;
Die Kommunikation könnte man über Pipes, Fifos, Shared-Memory, Message-Queues, TCP (Sockets) machen, im Prinzip auch mit MPI.&lt;br /&gt;
&lt;br /&gt;
* MPI ist Mist, weil man dann immer ein MPI-System braucht&lt;br /&gt;
* Message Queues sind im Prinzip cool, praktisch aber viel zu kurz und für zu kleine Datenmengen gedacht (10 Messages a 8kB ist Standard unter Linux). Dafür soll das halt sehr schnell sein (im L1-Cache bleiben etc).&lt;br /&gt;
* Pipes, Fifos ist halt ein bisschen fummelig. TCP keine Ahnung&lt;br /&gt;
* SHMem ist eigentlich ziemlich ok. Man muss natürlich von Hand synchronisieren. Das ist eigentlich auch kein Ding weiter. Wenn man einmal Zugriff auf den gemeinsamen Speicherbereich hat, sollte das nicht schwieriger sein als mit OpenMP (s.u.).&lt;br /&gt;
&lt;br /&gt;
*[http://www.ecst.csuchico.edu/~beej/guide/ipc/mq.html Message Queues]&lt;br /&gt;
*[http://kirkwylie.blogspot.com/2008/10/posix-message-queues-useful-but-limited.html POSIX Message in Linux]&lt;br /&gt;
&lt;br /&gt;
== Verschiedene Threads ==&lt;br /&gt;
Nachteil ist, dass die einzelnen Ausleseprozesse nicht gegeneinander geschützt sind. &lt;br /&gt;
=== OpenMP ===&lt;br /&gt;
Dafür gibt es die nahezu triviale Variante mit OpenMP. Der geringe Aufwand könnte die eher theoretischen Nachteile durchaus wieder wettmachen, finde ich.&lt;br /&gt;
Ich stelle mit das ungefähr so vor:&lt;br /&gt;
&lt;br /&gt;
 #include &amp;lt;iostream&amp;gt;&lt;br /&gt;
 #include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;omp.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 using namespace std;&lt;br /&gt;
 int showAction; &lt;br /&gt;
 &lt;br /&gt;
 /* Das ist eine etwas missbräuchliche aber immer noch sehr einfache Verwendung&lt;br /&gt;
   von OpenMP zur Arbeit mit Threads. Auf alle Fälle ist es schön&lt;br /&gt;
   einfach. Evtl. müssen die Jobs das Lesen nicht in einer critical Section&lt;br /&gt;
   machen aber es wird hier nichts schaden.&lt;br /&gt;
 */&lt;br /&gt;
 &lt;br /&gt;
 int job1(void)&lt;br /&gt;
 {&lt;br /&gt;
  for(;;)&lt;br /&gt;
  {&lt;br /&gt;
 #pragma  critical&lt;br /&gt;
   int sAct=showAction;&lt;br /&gt;
   if (sAct&amp;amp;1) cout &amp;lt;&amp;lt; &amp;quot;1&amp;quot;;&lt;br /&gt;
   cout.flush();&lt;br /&gt;
   usleep(5000); // nominell 5 ms&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 int job2(void)&lt;br /&gt;
 {&lt;br /&gt;
  for(;;)&lt;br /&gt;
  {&lt;br /&gt;
   #pragma  critical&lt;br /&gt;
   int sAct=showAction;&lt;br /&gt;
   if (sAct&amp;amp;2) cout &amp;lt;&amp;lt; &amp;quot;2&amp;quot;;&lt;br /&gt;
   cout.flush();&lt;br /&gt;
   usleep(5000); // 5 ms&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 int job3(void)&lt;br /&gt;
 {&lt;br /&gt;
  for(;;)&lt;br /&gt;
  {&lt;br /&gt;
   #pragma  critical&lt;br /&gt;
   int sAct=showAction;&lt;br /&gt;
   if (sAct&amp;amp;4) cout &amp;lt;&amp;lt; &amp;quot;3&amp;quot;;&lt;br /&gt;
   cout.flush();&lt;br /&gt;
   usleep(5000); // 5 ms&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 int main()&lt;br /&gt;
 {&lt;br /&gt;
  int nthreads, tid;&lt;br /&gt;
  omp_set_nested(1);&lt;br /&gt;
 &lt;br /&gt;
 /* Fork a team of threads with each thread having a private tid variable */&lt;br /&gt;
 #pragma omp parallel private(tid) num_threads (4)&lt;br /&gt;
   {&lt;br /&gt;
 &lt;br /&gt;
   /* Obtain and print thread id */&lt;br /&gt;
   tid = omp_get_thread_num();&lt;br /&gt;
   printf(&amp;quot;Hello World from thread = %d\n&amp;quot;, tid);&lt;br /&gt;
   switch (tid)&lt;br /&gt;
   {&lt;br /&gt;
    case 1: job1(); break;&lt;br /&gt;
    case 2: job2(); break;&lt;br /&gt;
    case 3: job3(); break;&lt;br /&gt;
   }&lt;br /&gt;
   /* Only master thread does this */&lt;br /&gt;
   if (tid == 0)&lt;br /&gt;
   {&lt;br /&gt;
    nthreads = omp_get_num_threads();&lt;br /&gt;
    printf(&amp;quot;Number of threads = %d\n&amp;quot;, nthreads);&lt;br /&gt;
   }&lt;br /&gt;
   for(;;) // master thread verteilt die aufgaben&lt;br /&gt;
   {&lt;br /&gt;
 #pragma critical&lt;br /&gt;
    showAction=rand();&lt;br /&gt;
    usleep(100000); // nominell 100 ms&lt;br /&gt;
   }&lt;br /&gt;
  }  /* All threads join master thread and terminate */&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* [http://cclh61.chm.tu-dresden.de/edv/manuals/xlc5/compiler/ref/ruompcrt.htm critical section]&lt;br /&gt;
&lt;br /&gt;
== Synchronisation ==&lt;br /&gt;
Mit den Pragmas von OpenMP kann man eine Synchronisation erreichen. Ein Thread wartet auf andere Threads, ich würde denken aktiv. Für Zwecke des Datensampelns sind die meisten Threads fast immer in Wartestellung. OpenMP bietet die Möglichkeit, Locks zu setzen. Darauf aufbauend könnte man eine sinnvolle Datenübergabe bauen und dazwischen die Threads Schlafen legen.&lt;br /&gt;
Das stelle ich mir so vor:&lt;/div&gt;</summary>
		<author><name>Penner</name></author>
	</entry>
	<entry>
		<id>https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Daten_Auslesen&amp;diff=741</id>
		<title>Daten Auslesen</title>
		<link rel="alternate" type="text/html" href="https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Daten_Auslesen&amp;diff=741"/>
		<updated>2009-10-02T14:41:38Z</updated>

		<summary type="html">&lt;p&gt;Penner: /* Rohdatenspeicherung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Paralleles Auslesen von diversen Sensoren und Zusammenbauen der Daten=&lt;br /&gt;
== Rohdatenspeicherung ==&lt;br /&gt;
Soweit ich verstanden habe, besteht die Aufgabe darin, den AD-Wandler mit einer Frequenz im Bereich 1 kHz und die Koordinaten mit einer Frequenz im Bereich 10 Hz auszulesen. Evtl. kommen auch mal noch weitere Sensoren hinzu. Die Weiterverarbeitung soll in Form von n-Tupeln (Zeitstempel; AD-Wert; Koordinaten) erfolgen. Das Ganze soll auch unter Belastung des Rechners noch zuverlässig erfolgen. Die Speicherung der Rohdaten erfolgt dabei sinnvollerweise nicht als n-Tupel, sondern in einem Raster der Art:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;(t_1,ad_1);\, (t_2,ad_2);\, ... (t_{n,i},ad_{n,i},c_{n,i});\, (t_{n+1},ad_{n+1});\, ... &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
mit &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;n=k*i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Koordinaten werden also nur aller k Zeitschritte auch wirklich ausgelesen und aufgeschrieben. Aus solch einem File kann für die Weiterverarbeitung wieder eine Liste mit kompletten n-Tupen erstellt werden. Dabei kann man die Koordinaten zwischen den Stützstellen interpolieren oder man lässt sie einfach konstant bis zum nächsten Messpunkt. Evtl. würde eine von beiden Varianten irgendwelche Statistiken stören. Die Rohdaten verursachen so weniger Last beim Schreiben und belegen weniger Speicherplatz als wenn immer ganze n-Tupel geschrieben werden müssten.&lt;br /&gt;
&lt;br /&gt;
== Datenaufnahme ==&lt;br /&gt;
Um eine möglichst jitterarme Datenaufnahme zu gewährleisten scheint es sinvoll, die einzelnen Sensoren in jeweils einen eigenen Prozess oder Thread zu packen. Dann kann der sich in aller Genauigkeit um seinen Sensor kümmern und wird hoffentlich vom Betriebssystem richtig mit Zeitscheiben versorgt. Dabei benötigt man allerdings eine gemeinsame Zeitbasis mit ausreichender Genauigkeit.&lt;br /&gt;
&lt;br /&gt;
In [[Daten_Auswerten#Einzelwerte]] steht etwas von einem Ringpuffer der im DA vorhanden sei und dessen eigenständiger Messwertaufnahme in eben diesen Ringpuffer. Wie funktioniert das denn eigentlich?&lt;br /&gt;
&lt;br /&gt;
Ich stelle mir den prinzipiellen Ablauf so vor:&lt;br /&gt;
# zentrale Instanz übergibt Details wie Samplefrequenz, ... und den Startzeitpunkt an einzelne Messprozesse.&lt;br /&gt;
# Messprozesse warten auf Startzeitpunkt und legen dann los&lt;br /&gt;
# Messprozesse messen vor sich hin, in persönlichen großen Ringpuffer.&lt;br /&gt;
# zentrale Instanz holt sich ab und an aus den Ringpuffern die Daten die sie haben will und schreibt sie in ein File&lt;br /&gt;
&lt;br /&gt;
== Verschiedene Prozesse ==&lt;br /&gt;
Die Kommunikation könnte man über Pipes, Fifos, Shared-Memory, Message-Queues, TCP (Sockets) machen, im Prinzip auch mit MPI.&lt;br /&gt;
&lt;br /&gt;
* MPI ist Mist, weil man dann immer ein MPI-System braucht&lt;br /&gt;
* Message Queues sind im Prinzip cool, praktisch aber viel zu kurz und für zu kleine Datenmengen gedacht (10 Messages a 8kB ist Standard unter Linux). Dafür soll das halt sehr schnell sein (im L1-Cache bleiben etc).&lt;br /&gt;
* Pipes, Fifos ist halt ein bisschen fummelig. TCP keine Ahnung&lt;br /&gt;
* SHMem ist eigentlich ziemlich ok. Man muss natürlich von Hand synchronisieren. Das ist eigentlich auch kein Ding weiter. Wenn man einmal Zugriff auf den gemeinsamen Speicherbereich hat, sollte das nicht schwieriger sein als mit OpenMP (s.u.).&lt;br /&gt;
&lt;br /&gt;
*[http://www.ecst.csuchico.edu/~beej/guide/ipc/mq.html Message Queues]&lt;br /&gt;
*[http://kirkwylie.blogspot.com/2008/10/posix-message-queues-useful-but-limited.html POSIX Message in Linux]&lt;br /&gt;
&lt;br /&gt;
== Verschiedene Threads ==&lt;br /&gt;
Nachteil ist, dass die einzelnen Ausleseprozesse nicht gegeneinander geschützt sind. &lt;br /&gt;
=== OpenMP ===&lt;br /&gt;
Dafür gibt es die nahezu triviale Variante mit OpenMP. Der geringe Aufwand könnte die eher theoretischen Nachteile durchaus wieder wettmachen, finde ich.&lt;br /&gt;
Ich stelle mit das ungefähr so vor:&lt;br /&gt;
&lt;br /&gt;
 #include &amp;lt;iostream&amp;gt;&lt;br /&gt;
 #include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;omp.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 using namespace std;&lt;br /&gt;
 int showAction; &lt;br /&gt;
 &lt;br /&gt;
 /* Das ist eine etwas missbräuchliche aber immer noch sehr einfache Verwendung&lt;br /&gt;
   von OpenMP zur Arbeit mit Threads. Auf alle Fälle ist es schön&lt;br /&gt;
   einfach. Evtl. müssen die Jobs das Lesen nicht in einer critical Section&lt;br /&gt;
   machen aber es wird hier nichts schaden.&lt;br /&gt;
 */&lt;br /&gt;
 &lt;br /&gt;
 int job1(void)&lt;br /&gt;
 {&lt;br /&gt;
  for(;;)&lt;br /&gt;
  {&lt;br /&gt;
 #pragma  critical&lt;br /&gt;
   int sAct=showAction;&lt;br /&gt;
   if (sAct&amp;amp;1) cout &amp;lt;&amp;lt; &amp;quot;1&amp;quot;;&lt;br /&gt;
   cout.flush();&lt;br /&gt;
   usleep(5000); // nominell 5 ms&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 int job2(void)&lt;br /&gt;
 {&lt;br /&gt;
  for(;;)&lt;br /&gt;
  {&lt;br /&gt;
   #pragma  critical&lt;br /&gt;
   int sAct=showAction;&lt;br /&gt;
   if (sAct&amp;amp;2) cout &amp;lt;&amp;lt; &amp;quot;2&amp;quot;;&lt;br /&gt;
   cout.flush();&lt;br /&gt;
   usleep(5000); // 5 ms&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 int job3(void)&lt;br /&gt;
 {&lt;br /&gt;
  for(;;)&lt;br /&gt;
  {&lt;br /&gt;
   #pragma  critical&lt;br /&gt;
   int sAct=showAction;&lt;br /&gt;
   if (sAct&amp;amp;4) cout &amp;lt;&amp;lt; &amp;quot;3&amp;quot;;&lt;br /&gt;
   cout.flush();&lt;br /&gt;
   usleep(5000); // 5 ms&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 int main()&lt;br /&gt;
 {&lt;br /&gt;
  int nthreads, tid;&lt;br /&gt;
  omp_set_nested(1);&lt;br /&gt;
 &lt;br /&gt;
 /* Fork a team of threads with each thread having a private tid variable */&lt;br /&gt;
 #pragma omp parallel private(tid) num_threads (4)&lt;br /&gt;
   {&lt;br /&gt;
 &lt;br /&gt;
   /* Obtain and print thread id */&lt;br /&gt;
   tid = omp_get_thread_num();&lt;br /&gt;
   printf(&amp;quot;Hello World from thread = %d\n&amp;quot;, tid);&lt;br /&gt;
   switch (tid)&lt;br /&gt;
   {&lt;br /&gt;
    case 1: job1(); break;&lt;br /&gt;
    case 2: job2(); break;&lt;br /&gt;
    case 3: job3(); break;&lt;br /&gt;
   }&lt;br /&gt;
   /* Only master thread does this */&lt;br /&gt;
   if (tid == 0)&lt;br /&gt;
   {&lt;br /&gt;
    nthreads = omp_get_num_threads();&lt;br /&gt;
    printf(&amp;quot;Number of threads = %d\n&amp;quot;, nthreads);&lt;br /&gt;
   }&lt;br /&gt;
   for(;;) // master thread verteilt die aufgaben&lt;br /&gt;
   {&lt;br /&gt;
 #pragma critical&lt;br /&gt;
    showAction=rand();&lt;br /&gt;
    usleep(100000); // nominell 100 ms&lt;br /&gt;
   }&lt;br /&gt;
  }  /* All threads join master thread and terminate */&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* [http://cclh61.chm.tu-dresden.de/edv/manuals/xlc5/compiler/ref/ruompcrt.htm critical section]&lt;br /&gt;
&lt;br /&gt;
== Synchronisation ==&lt;br /&gt;
Mit den Pragmas von OpenMP kann man eine Synchronisation erreichen. Ein Thread wartet auf andere Threads, ich würde denken aktiv. Für Zwecke des Datensampelns sind die meisten Threads fast immer in Wartestellung. OpenMP bietet die Möglichkeit, Locks zu setzen. Darauf aufbauend könnte man eine sinnvolle Datenübergabe bauen und dazwischen die Threads Schlafen legen.&lt;br /&gt;
Das stelle ich mir so vor:&lt;/div&gt;</summary>
		<author><name>Penner</name></author>
	</entry>
	<entry>
		<id>https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Daten_Auslesen&amp;diff=740</id>
		<title>Daten Auslesen</title>
		<link rel="alternate" type="text/html" href="https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Daten_Auslesen&amp;diff=740"/>
		<updated>2009-10-02T14:41:02Z</updated>

		<summary type="html">&lt;p&gt;Penner: /* Rohdatenspeicherung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Paralleles Auslesen von diversen Sensoren und Zusammenbauen der Daten=&lt;br /&gt;
== Rohdatenspeicherung ==&lt;br /&gt;
Soweit ich verstanden habe, besteht die Aufgabe darin, den AD-Wandler mit einer Frequenz im Bereich 1 kHz und die Koordinaten mit einer Frequenz im Bereich 10 Hz auszulesen. Evtl. kommen auch mal noch weitere Sensoren hinzu. Die Weiterverarbeitung soll in Form von n-Tupeln (Zeitstempel; AD-Wert; Koordinaten) erfolgen. Das Ganze soll auch unter Belastung des Rechners noch zuverlässig erfolgen. Die Speicherung der Rohdaten erfolgt dabei sinnvollerweise nicht als n-Tupel, sondern in einem Raster der Art:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;(t_1,ad_1);\, (t_2,ad_2), ... (t_{n,i},ad_{n,i},c_{n,i}), (t_{n+1},ad_{n+1}), ... &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
mit &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;n=k*i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Koordinaten werden also nur aller k Zeitschritte auch wirklich ausgelesen und aufgeschrieben. Aus solch einem File kann für die Weiterverarbeitung wieder eine Liste mit kompletten n-Tupen erstellt werden. Dabei kann man die Koordinaten zwischen den Stützstellen interpolieren oder man lässt sie einfach konstant bis zum nächsten Messpunkt. Evtl. würde eine von beiden Varianten irgendwelche Statistiken stören. Die Rohdaten verursachen so weniger Last beim Schreiben und belegen weniger Speicherplatz als wenn immer ganze n-Tupel geschrieben werden müssten.&lt;br /&gt;
&lt;br /&gt;
== Datenaufnahme ==&lt;br /&gt;
Um eine möglichst jitterarme Datenaufnahme zu gewährleisten scheint es sinvoll, die einzelnen Sensoren in jeweils einen eigenen Prozess oder Thread zu packen. Dann kann der sich in aller Genauigkeit um seinen Sensor kümmern und wird hoffentlich vom Betriebssystem richtig mit Zeitscheiben versorgt. Dabei benötigt man allerdings eine gemeinsame Zeitbasis mit ausreichender Genauigkeit.&lt;br /&gt;
&lt;br /&gt;
In [[Daten_Auswerten#Einzelwerte]] steht etwas von einem Ringpuffer der im DA vorhanden sei und dessen eigenständiger Messwertaufnahme in eben diesen Ringpuffer. Wie funktioniert das denn eigentlich?&lt;br /&gt;
&lt;br /&gt;
Ich stelle mir den prinzipiellen Ablauf so vor:&lt;br /&gt;
# zentrale Instanz übergibt Details wie Samplefrequenz, ... und den Startzeitpunkt an einzelne Messprozesse.&lt;br /&gt;
# Messprozesse warten auf Startzeitpunkt und legen dann los&lt;br /&gt;
# Messprozesse messen vor sich hin, in persönlichen großen Ringpuffer.&lt;br /&gt;
# zentrale Instanz holt sich ab und an aus den Ringpuffern die Daten die sie haben will und schreibt sie in ein File&lt;br /&gt;
&lt;br /&gt;
== Verschiedene Prozesse ==&lt;br /&gt;
Die Kommunikation könnte man über Pipes, Fifos, Shared-Memory, Message-Queues, TCP (Sockets) machen, im Prinzip auch mit MPI.&lt;br /&gt;
&lt;br /&gt;
* MPI ist Mist, weil man dann immer ein MPI-System braucht&lt;br /&gt;
* Message Queues sind im Prinzip cool, praktisch aber viel zu kurz und für zu kleine Datenmengen gedacht (10 Messages a 8kB ist Standard unter Linux). Dafür soll das halt sehr schnell sein (im L1-Cache bleiben etc).&lt;br /&gt;
* Pipes, Fifos ist halt ein bisschen fummelig. TCP keine Ahnung&lt;br /&gt;
* SHMem ist eigentlich ziemlich ok. Man muss natürlich von Hand synchronisieren. Das ist eigentlich auch kein Ding weiter. Wenn man einmal Zugriff auf den gemeinsamen Speicherbereich hat, sollte das nicht schwieriger sein als mit OpenMP (s.u.).&lt;br /&gt;
&lt;br /&gt;
*[http://www.ecst.csuchico.edu/~beej/guide/ipc/mq.html Message Queues]&lt;br /&gt;
*[http://kirkwylie.blogspot.com/2008/10/posix-message-queues-useful-but-limited.html POSIX Message in Linux]&lt;br /&gt;
&lt;br /&gt;
== Verschiedene Threads ==&lt;br /&gt;
Nachteil ist, dass die einzelnen Ausleseprozesse nicht gegeneinander geschützt sind. &lt;br /&gt;
=== OpenMP ===&lt;br /&gt;
Dafür gibt es die nahezu triviale Variante mit OpenMP. Der geringe Aufwand könnte die eher theoretischen Nachteile durchaus wieder wettmachen, finde ich.&lt;br /&gt;
Ich stelle mit das ungefähr so vor:&lt;br /&gt;
&lt;br /&gt;
 #include &amp;lt;iostream&amp;gt;&lt;br /&gt;
 #include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;omp.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 using namespace std;&lt;br /&gt;
 int showAction; &lt;br /&gt;
 &lt;br /&gt;
 /* Das ist eine etwas missbräuchliche aber immer noch sehr einfache Verwendung&lt;br /&gt;
   von OpenMP zur Arbeit mit Threads. Auf alle Fälle ist es schön&lt;br /&gt;
   einfach. Evtl. müssen die Jobs das Lesen nicht in einer critical Section&lt;br /&gt;
   machen aber es wird hier nichts schaden.&lt;br /&gt;
 */&lt;br /&gt;
 &lt;br /&gt;
 int job1(void)&lt;br /&gt;
 {&lt;br /&gt;
  for(;;)&lt;br /&gt;
  {&lt;br /&gt;
 #pragma  critical&lt;br /&gt;
   int sAct=showAction;&lt;br /&gt;
   if (sAct&amp;amp;1) cout &amp;lt;&amp;lt; &amp;quot;1&amp;quot;;&lt;br /&gt;
   cout.flush();&lt;br /&gt;
   usleep(5000); // nominell 5 ms&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 int job2(void)&lt;br /&gt;
 {&lt;br /&gt;
  for(;;)&lt;br /&gt;
  {&lt;br /&gt;
   #pragma  critical&lt;br /&gt;
   int sAct=showAction;&lt;br /&gt;
   if (sAct&amp;amp;2) cout &amp;lt;&amp;lt; &amp;quot;2&amp;quot;;&lt;br /&gt;
   cout.flush();&lt;br /&gt;
   usleep(5000); // 5 ms&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 int job3(void)&lt;br /&gt;
 {&lt;br /&gt;
  for(;;)&lt;br /&gt;
  {&lt;br /&gt;
   #pragma  critical&lt;br /&gt;
   int sAct=showAction;&lt;br /&gt;
   if (sAct&amp;amp;4) cout &amp;lt;&amp;lt; &amp;quot;3&amp;quot;;&lt;br /&gt;
   cout.flush();&lt;br /&gt;
   usleep(5000); // 5 ms&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 int main()&lt;br /&gt;
 {&lt;br /&gt;
  int nthreads, tid;&lt;br /&gt;
  omp_set_nested(1);&lt;br /&gt;
 &lt;br /&gt;
 /* Fork a team of threads with each thread having a private tid variable */&lt;br /&gt;
 #pragma omp parallel private(tid) num_threads (4)&lt;br /&gt;
   {&lt;br /&gt;
 &lt;br /&gt;
   /* Obtain and print thread id */&lt;br /&gt;
   tid = omp_get_thread_num();&lt;br /&gt;
   printf(&amp;quot;Hello World from thread = %d\n&amp;quot;, tid);&lt;br /&gt;
   switch (tid)&lt;br /&gt;
   {&lt;br /&gt;
    case 1: job1(); break;&lt;br /&gt;
    case 2: job2(); break;&lt;br /&gt;
    case 3: job3(); break;&lt;br /&gt;
   }&lt;br /&gt;
   /* Only master thread does this */&lt;br /&gt;
   if (tid == 0)&lt;br /&gt;
   {&lt;br /&gt;
    nthreads = omp_get_num_threads();&lt;br /&gt;
    printf(&amp;quot;Number of threads = %d\n&amp;quot;, nthreads);&lt;br /&gt;
   }&lt;br /&gt;
   for(;;) // master thread verteilt die aufgaben&lt;br /&gt;
   {&lt;br /&gt;
 #pragma critical&lt;br /&gt;
    showAction=rand();&lt;br /&gt;
    usleep(100000); // nominell 100 ms&lt;br /&gt;
   }&lt;br /&gt;
  }  /* All threads join master thread and terminate */&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* [http://cclh61.chm.tu-dresden.de/edv/manuals/xlc5/compiler/ref/ruompcrt.htm critical section]&lt;br /&gt;
&lt;br /&gt;
== Synchronisation ==&lt;br /&gt;
Mit den Pragmas von OpenMP kann man eine Synchronisation erreichen. Ein Thread wartet auf andere Threads, ich würde denken aktiv. Für Zwecke des Datensampelns sind die meisten Threads fast immer in Wartestellung. OpenMP bietet die Möglichkeit, Locks zu setzen. Darauf aufbauend könnte man eine sinnvolle Datenübergabe bauen und dazwischen die Threads Schlafen legen.&lt;br /&gt;
Das stelle ich mir so vor:&lt;/div&gt;</summary>
		<author><name>Penner</name></author>
	</entry>
	<entry>
		<id>https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Daten_Auslesen&amp;diff=739</id>
		<title>Daten Auslesen</title>
		<link rel="alternate" type="text/html" href="https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Daten_Auslesen&amp;diff=739"/>
		<updated>2009-10-02T14:27:05Z</updated>

		<summary type="html">&lt;p&gt;Penner: /* Datenausfnahme */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Paralleles Auslesen von diversen Sensoren und Zusammenbauen der Daten=&lt;br /&gt;
== Rohdatenspeicherung ==&lt;br /&gt;
Soweit ich verstanden habe, besteht die Aufgabe darin, den AD-Wandler mit einer Frequenz im Bereich 1 kHz und die Koordinaten mit einer Frequenz im Bereich 10 Hz auszulesen. Evtl. kommen auch mal noch weitere Sensoren hinzu. Die Weiterverarbeitung soll in Form von n-Tupeln (Zeitstempel; AD-Wert; Koordinaten) erfolgen. Das Ganze soll auch unter Belastung des Rechners noch zuverlässig erfolgen. Die Speicherung der Rohdaten erfolgt dabei sinnvollerweise nicht als n-Tupel, sondern in einem Raster der Art:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;(t_1,ad_1);\, (t_2,ad_2), ... (t_{n,i},ad_{n,i},c_{n,i}), (t_{n+1},ad_{n+1}), ... &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
mit &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;n=k*i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Koordinaten werden also z.B. nur immer aller k Zeitschritte auch wirklich ausgelesen und aufgeschrieben. Aus solch einem File kann für die Weiterverarbeitung sofort eine Liste mit kompletten n-Tupen erstellt werden. Dabei kann man die Koordinaten zwischen den Stützstellen interpolieren oder man lässt sie einfach konstant bis zum nächsten Messpunkt. Evtl. würde eine von beiden Varianten irgendwelche Statistiken stören.&lt;br /&gt;
&lt;br /&gt;
== Datenaufnahme ==&lt;br /&gt;
Um eine möglichst jitterarme Datenaufnahme zu gewährleisten scheint es sinvoll, die einzelnen Sensoren in jeweils einen eigenen Prozess oder Thread zu packen. Dann kann der sich in aller Genauigkeit um seinen Sensor kümmern und wird hoffentlich vom Betriebssystem richtig mit Zeitscheiben versorgt. Dabei benötigt man allerdings eine gemeinsame Zeitbasis mit ausreichender Genauigkeit.&lt;br /&gt;
&lt;br /&gt;
In [[Daten_Auswerten#Einzelwerte]] steht etwas von einem Ringpuffer der im DA vorhanden sei und dessen eigenständiger Messwertaufnahme in eben diesen Ringpuffer. Wie funktioniert das denn eigentlich?&lt;br /&gt;
&lt;br /&gt;
Ich stelle mir den prinzipiellen Ablauf so vor:&lt;br /&gt;
# zentrale Instanz übergibt Details wie Samplefrequenz, ... und den Startzeitpunkt an einzelne Messprozesse.&lt;br /&gt;
# Messprozesse warten auf Startzeitpunkt und legen dann los&lt;br /&gt;
# Messprozesse messen vor sich hin, in persönlichen großen Ringpuffer.&lt;br /&gt;
# zentrale Instanz holt sich ab und an aus den Ringpuffern die Daten die sie haben will und schreibt sie in ein File&lt;br /&gt;
&lt;br /&gt;
== Verschiedene Prozesse ==&lt;br /&gt;
Die Kommunikation könnte man über Pipes, Fifos, Shared-Memory, Message-Queues, TCP (Sockets) machen, im Prinzip auch mit MPI.&lt;br /&gt;
&lt;br /&gt;
* MPI ist Mist, weil man dann immer ein MPI-System braucht&lt;br /&gt;
* Message Queues sind im Prinzip cool, praktisch aber viel zu kurz und für zu kleine Datenmengen gedacht (10 Messages a 8kB ist Standard unter Linux). Dafür soll das halt sehr schnell sein (im L1-Cache bleiben etc).&lt;br /&gt;
* Pipes, Fifos ist halt ein bisschen fummelig. TCP keine Ahnung&lt;br /&gt;
* SHMem ist eigentlich ziemlich ok. Man muss natürlich von Hand synchronisieren. Das ist eigentlich auch kein Ding weiter. Wenn man einmal Zugriff auf den gemeinsamen Speicherbereich hat, sollte das nicht schwieriger sein als mit OpenMP (s.u.).&lt;br /&gt;
&lt;br /&gt;
*[http://www.ecst.csuchico.edu/~beej/guide/ipc/mq.html Message Queues]&lt;br /&gt;
*[http://kirkwylie.blogspot.com/2008/10/posix-message-queues-useful-but-limited.html POSIX Message in Linux]&lt;br /&gt;
&lt;br /&gt;
== Verschiedene Threads ==&lt;br /&gt;
Nachteil ist, dass die einzelnen Ausleseprozesse nicht gegeneinander geschützt sind. &lt;br /&gt;
=== OpenMP ===&lt;br /&gt;
Dafür gibt es die nahezu triviale Variante mit OpenMP. Der geringe Aufwand könnte die eher theoretischen Nachteile durchaus wieder wettmachen, finde ich.&lt;br /&gt;
Ich stelle mit das ungefähr so vor:&lt;br /&gt;
&lt;br /&gt;
 #include &amp;lt;iostream&amp;gt;&lt;br /&gt;
 #include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;omp.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 using namespace std;&lt;br /&gt;
 int showAction; &lt;br /&gt;
 &lt;br /&gt;
 /* Das ist eine etwas missbräuchliche aber immer noch sehr einfache Verwendung&lt;br /&gt;
   von OpenMP zur Arbeit mit Threads. Auf alle Fälle ist es schön&lt;br /&gt;
   einfach. Evtl. müssen die Jobs das Lesen nicht in einer critical Section&lt;br /&gt;
   machen aber es wird hier nichts schaden.&lt;br /&gt;
 */&lt;br /&gt;
 &lt;br /&gt;
 int job1(void)&lt;br /&gt;
 {&lt;br /&gt;
  for(;;)&lt;br /&gt;
  {&lt;br /&gt;
 #pragma  critical&lt;br /&gt;
   int sAct=showAction;&lt;br /&gt;
   if (sAct&amp;amp;1) cout &amp;lt;&amp;lt; &amp;quot;1&amp;quot;;&lt;br /&gt;
   cout.flush();&lt;br /&gt;
   usleep(5000); // nominell 5 ms&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 int job2(void)&lt;br /&gt;
 {&lt;br /&gt;
  for(;;)&lt;br /&gt;
  {&lt;br /&gt;
   #pragma  critical&lt;br /&gt;
   int sAct=showAction;&lt;br /&gt;
   if (sAct&amp;amp;2) cout &amp;lt;&amp;lt; &amp;quot;2&amp;quot;;&lt;br /&gt;
   cout.flush();&lt;br /&gt;
   usleep(5000); // 5 ms&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 int job3(void)&lt;br /&gt;
 {&lt;br /&gt;
  for(;;)&lt;br /&gt;
  {&lt;br /&gt;
   #pragma  critical&lt;br /&gt;
   int sAct=showAction;&lt;br /&gt;
   if (sAct&amp;amp;4) cout &amp;lt;&amp;lt; &amp;quot;3&amp;quot;;&lt;br /&gt;
   cout.flush();&lt;br /&gt;
   usleep(5000); // 5 ms&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 int main()&lt;br /&gt;
 {&lt;br /&gt;
  int nthreads, tid;&lt;br /&gt;
  omp_set_nested(1);&lt;br /&gt;
 &lt;br /&gt;
 /* Fork a team of threads with each thread having a private tid variable */&lt;br /&gt;
 #pragma omp parallel private(tid) num_threads (4)&lt;br /&gt;
   {&lt;br /&gt;
 &lt;br /&gt;
   /* Obtain and print thread id */&lt;br /&gt;
   tid = omp_get_thread_num();&lt;br /&gt;
   printf(&amp;quot;Hello World from thread = %d\n&amp;quot;, tid);&lt;br /&gt;
   switch (tid)&lt;br /&gt;
   {&lt;br /&gt;
    case 1: job1(); break;&lt;br /&gt;
    case 2: job2(); break;&lt;br /&gt;
    case 3: job3(); break;&lt;br /&gt;
   }&lt;br /&gt;
   /* Only master thread does this */&lt;br /&gt;
   if (tid == 0)&lt;br /&gt;
   {&lt;br /&gt;
    nthreads = omp_get_num_threads();&lt;br /&gt;
    printf(&amp;quot;Number of threads = %d\n&amp;quot;, nthreads);&lt;br /&gt;
   }&lt;br /&gt;
   for(;;) // master thread verteilt die aufgaben&lt;br /&gt;
   {&lt;br /&gt;
 #pragma critical&lt;br /&gt;
    showAction=rand();&lt;br /&gt;
    usleep(100000); // nominell 100 ms&lt;br /&gt;
   }&lt;br /&gt;
  }  /* All threads join master thread and terminate */&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* [http://cclh61.chm.tu-dresden.de/edv/manuals/xlc5/compiler/ref/ruompcrt.htm critical section]&lt;br /&gt;
&lt;br /&gt;
== Synchronisation ==&lt;br /&gt;
Mit den Pragmas von OpenMP kann man eine Synchronisation erreichen. Ein Thread wartet auf andere Threads, ich würde denken aktiv. Für Zwecke des Datensampelns sind die meisten Threads fast immer in Wartestellung. OpenMP bietet die Möglichkeit, Locks zu setzen. Darauf aufbauend könnte man eine sinnvolle Datenübergabe bauen und dazwischen die Threads Schlafen legen.&lt;br /&gt;
Das stelle ich mir so vor:&lt;/div&gt;</summary>
		<author><name>Penner</name></author>
	</entry>
	<entry>
		<id>https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Daten_Auslesen&amp;diff=738</id>
		<title>Daten Auslesen</title>
		<link rel="alternate" type="text/html" href="https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Daten_Auslesen&amp;diff=738"/>
		<updated>2009-10-02T13:31:41Z</updated>

		<summary type="html">&lt;p&gt;Penner: /* Datenausfnahme */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Paralleles Auslesen von diversen Sensoren und Zusammenbauen der Daten=&lt;br /&gt;
== Rohdatenspeicherung ==&lt;br /&gt;
Soweit ich verstanden habe, besteht die Aufgabe darin, den AD-Wandler mit einer Frequenz im Bereich 1 kHz und die Koordinaten mit einer Frequenz im Bereich 10 Hz auszulesen. Evtl. kommen auch mal noch weitere Sensoren hinzu. Die Weiterverarbeitung soll in Form von n-Tupeln (Zeitstempel; AD-Wert; Koordinaten) erfolgen. Das Ganze soll auch unter Belastung des Rechners noch zuverlässig erfolgen. Die Speicherung der Rohdaten erfolgt dabei sinnvollerweise nicht als n-Tupel, sondern in einem Raster der Art:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;(t_1,ad_1);\, (t_2,ad_2), ... (t_{n,i},ad_{n,i},c_{n,i}), (t_{n+1},ad_{n+1}), ... &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
mit &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;n=k*i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Koordinaten werden also z.B. nur immer aller k Zeitschritte auch wirklich ausgelesen und aufgeschrieben. Aus solch einem File kann für die Weiterverarbeitung sofort eine Liste mit kompletten n-Tupen erstellt werden. Dabei kann man die Koordinaten zwischen den Stützstellen interpolieren oder man lässt sie einfach konstant bis zum nächsten Messpunkt. Evtl. würde eine von beiden Varianten irgendwelche Statistiken stören.&lt;br /&gt;
&lt;br /&gt;
== Datenausfnahme ==&lt;br /&gt;
Um eine möglichst jitterarme Datenaufnahme zu gewährleisten scheint es sinvoll, die einzelnen Sensoren in jeweils einen eigenen Prozess oder Thread zu packen. Dann kann der sich in aller Genauigkeit um seinen Sensor kümmern. Dabei benötigt man allerdings eine gemeinsame Zeitbasis mit ausreichender Genauigkeit.&lt;br /&gt;
&lt;br /&gt;
In [[Daten_Auswerten#Einzelwerte]] steht etwas von einem Ringpuffer der im DA vorhanden sei und dessen eigenständiger Messwertaufnahme in eben diesen Ringpuffer. Wie funktioniert das denn eigentlich?&lt;br /&gt;
&lt;br /&gt;
Ich stelle mir den prinzipiellen Ablauf so vor:&lt;br /&gt;
# zentrale Instanz übergibt Details wie Samplefrequenz, ... und den Startzeitpunkt an einzelne Messprozesse.&lt;br /&gt;
# Messprozesse warten auf Startzeitpunkt und legen dann los&lt;br /&gt;
# Messprozesse messen vor sich hin, in persönlichen großen Ringpuffer.&lt;br /&gt;
# zentrale Instanz holt sich ab und an aus den Ringpuffern die Daten die sie haben will und schreibt sie in ein File&lt;br /&gt;
&lt;br /&gt;
== Verschiedene Prozesse ==&lt;br /&gt;
Die Kommunikation könnte man über Pipes, Fifos, Shared-Memory, Message-Queues, TCP (Sockets) machen, im Prinzip auch mit MPI.&lt;br /&gt;
&lt;br /&gt;
* MPI ist Mist, weil man dann immer ein MPI-System braucht&lt;br /&gt;
* Message Queues sind im Prinzip cool, praktisch aber viel zu kurz und für zu kleine Datenmengen gedacht (10 Messages a 8kB ist Standard unter Linux). Dafür soll das halt sehr schnell sein (im L1-Cache bleiben etc).&lt;br /&gt;
* Pipes, Fifos ist halt ein bisschen fummelig. TCP keine Ahnung&lt;br /&gt;
* SHMem ist eigentlich ziemlich ok. Man muss natürlich von Hand synchronisieren. Das ist eigentlich auch kein Ding weiter. Wenn man einmal Zugriff auf den gemeinsamen Speicherbereich hat, sollte das nicht schwieriger sein als mit OpenMP (s.u.).&lt;br /&gt;
&lt;br /&gt;
*[http://www.ecst.csuchico.edu/~beej/guide/ipc/mq.html Message Queues]&lt;br /&gt;
*[http://kirkwylie.blogspot.com/2008/10/posix-message-queues-useful-but-limited.html POSIX Message in Linux]&lt;br /&gt;
&lt;br /&gt;
== Verschiedene Threads ==&lt;br /&gt;
Nachteil ist, dass die einzelnen Ausleseprozesse nicht gegeneinander geschützt sind. &lt;br /&gt;
=== OpenMP ===&lt;br /&gt;
Dafür gibt es die nahezu triviale Variante mit OpenMP. Der geringe Aufwand könnte die eher theoretischen Nachteile durchaus wieder wettmachen, finde ich.&lt;br /&gt;
Ich stelle mit das ungefähr so vor:&lt;br /&gt;
&lt;br /&gt;
 #include &amp;lt;iostream&amp;gt;&lt;br /&gt;
 #include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;omp.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 using namespace std;&lt;br /&gt;
 int showAction; &lt;br /&gt;
 &lt;br /&gt;
 /* Das ist eine etwas missbräuchliche aber immer noch sehr einfache Verwendung&lt;br /&gt;
   von OpenMP zur Arbeit mit Threads. Auf alle Fälle ist es schön&lt;br /&gt;
   einfach. Evtl. müssen die Jobs das Lesen nicht in einer critical Section&lt;br /&gt;
   machen aber es wird hier nichts schaden.&lt;br /&gt;
 */&lt;br /&gt;
 &lt;br /&gt;
 int job1(void)&lt;br /&gt;
 {&lt;br /&gt;
  for(;;)&lt;br /&gt;
  {&lt;br /&gt;
 #pragma  critical&lt;br /&gt;
   int sAct=showAction;&lt;br /&gt;
   if (sAct&amp;amp;1) cout &amp;lt;&amp;lt; &amp;quot;1&amp;quot;;&lt;br /&gt;
   cout.flush();&lt;br /&gt;
   usleep(5000); // nominell 5 ms&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 int job2(void)&lt;br /&gt;
 {&lt;br /&gt;
  for(;;)&lt;br /&gt;
  {&lt;br /&gt;
   #pragma  critical&lt;br /&gt;
   int sAct=showAction;&lt;br /&gt;
   if (sAct&amp;amp;2) cout &amp;lt;&amp;lt; &amp;quot;2&amp;quot;;&lt;br /&gt;
   cout.flush();&lt;br /&gt;
   usleep(5000); // 5 ms&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 int job3(void)&lt;br /&gt;
 {&lt;br /&gt;
  for(;;)&lt;br /&gt;
  {&lt;br /&gt;
   #pragma  critical&lt;br /&gt;
   int sAct=showAction;&lt;br /&gt;
   if (sAct&amp;amp;4) cout &amp;lt;&amp;lt; &amp;quot;3&amp;quot;;&lt;br /&gt;
   cout.flush();&lt;br /&gt;
   usleep(5000); // 5 ms&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 int main()&lt;br /&gt;
 {&lt;br /&gt;
  int nthreads, tid;&lt;br /&gt;
  omp_set_nested(1);&lt;br /&gt;
 &lt;br /&gt;
 /* Fork a team of threads with each thread having a private tid variable */&lt;br /&gt;
 #pragma omp parallel private(tid) num_threads (4)&lt;br /&gt;
   {&lt;br /&gt;
 &lt;br /&gt;
   /* Obtain and print thread id */&lt;br /&gt;
   tid = omp_get_thread_num();&lt;br /&gt;
   printf(&amp;quot;Hello World from thread = %d\n&amp;quot;, tid);&lt;br /&gt;
   switch (tid)&lt;br /&gt;
   {&lt;br /&gt;
    case 1: job1(); break;&lt;br /&gt;
    case 2: job2(); break;&lt;br /&gt;
    case 3: job3(); break;&lt;br /&gt;
   }&lt;br /&gt;
   /* Only master thread does this */&lt;br /&gt;
   if (tid == 0)&lt;br /&gt;
   {&lt;br /&gt;
    nthreads = omp_get_num_threads();&lt;br /&gt;
    printf(&amp;quot;Number of threads = %d\n&amp;quot;, nthreads);&lt;br /&gt;
   }&lt;br /&gt;
   for(;;) // master thread verteilt die aufgaben&lt;br /&gt;
   {&lt;br /&gt;
 #pragma critical&lt;br /&gt;
    showAction=rand();&lt;br /&gt;
    usleep(100000); // nominell 100 ms&lt;br /&gt;
   }&lt;br /&gt;
  }  /* All threads join master thread and terminate */&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* [http://cclh61.chm.tu-dresden.de/edv/manuals/xlc5/compiler/ref/ruompcrt.htm critical section]&lt;br /&gt;
&lt;br /&gt;
== Synchronisation ==&lt;br /&gt;
Mit den Pragmas von OpenMP kann man eine Synchronisation erreichen. Ein Thread wartet auf andere Threads, ich würde denken aktiv. Für Zwecke des Datensampelns sind die meisten Threads fast immer in Wartestellung. OpenMP bietet die Möglichkeit, Locks zu setzen. Darauf aufbauend könnte man eine sinnvolle Datenübergabe bauen und dazwischen die Threads Schlafen legen.&lt;br /&gt;
Das stelle ich mir so vor:&lt;/div&gt;</summary>
		<author><name>Penner</name></author>
	</entry>
	<entry>
		<id>https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Daten_Auslesen&amp;diff=737</id>
		<title>Daten Auslesen</title>
		<link rel="alternate" type="text/html" href="https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Daten_Auslesen&amp;diff=737"/>
		<updated>2009-10-02T13:31:04Z</updated>

		<summary type="html">&lt;p&gt;Penner: /* Datenausfnahme */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Paralleles Auslesen von diversen Sensoren und Zusammenbauen der Daten=&lt;br /&gt;
== Rohdatenspeicherung ==&lt;br /&gt;
Soweit ich verstanden habe, besteht die Aufgabe darin, den AD-Wandler mit einer Frequenz im Bereich 1 kHz und die Koordinaten mit einer Frequenz im Bereich 10 Hz auszulesen. Evtl. kommen auch mal noch weitere Sensoren hinzu. Die Weiterverarbeitung soll in Form von n-Tupeln (Zeitstempel; AD-Wert; Koordinaten) erfolgen. Das Ganze soll auch unter Belastung des Rechners noch zuverlässig erfolgen. Die Speicherung der Rohdaten erfolgt dabei sinnvollerweise nicht als n-Tupel, sondern in einem Raster der Art:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;(t_1,ad_1);\, (t_2,ad_2), ... (t_{n,i},ad_{n,i},c_{n,i}), (t_{n+1},ad_{n+1}), ... &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
mit &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;n=k*i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Koordinaten werden also z.B. nur immer aller k Zeitschritte auch wirklich ausgelesen und aufgeschrieben. Aus solch einem File kann für die Weiterverarbeitung sofort eine Liste mit kompletten n-Tupen erstellt werden. Dabei kann man die Koordinaten zwischen den Stützstellen interpolieren oder man lässt sie einfach konstant bis zum nächsten Messpunkt. Evtl. würde eine von beiden Varianten irgendwelche Statistiken stören.&lt;br /&gt;
&lt;br /&gt;
== Datenausfnahme ==&lt;br /&gt;
Um eine möglichst jitterarme Datenaufnahme zu gewährleisten scheint es sinvoll, die einzelnen Sensoren in jeweils einen eigenen Prozess oder Thread zu packen. Dann kann der sich in aller Genauigkeit um seinen Sensor kümmern. Dabei benötigt man allerdings eine gemeinsame Zeitbasis mit ausreichender Genauigkeit.&lt;br /&gt;
&lt;br /&gt;
In [[Daten_Auswerten#Einzelwerte]] steht etwas von einem Ringpuffer der im DA vorhanden sei und dessen eigenständiger Messwertaufnahme in eben diesen Ringpuffer. Wie funktioniert das denn eigentlich?&lt;br /&gt;
&lt;br /&gt;
Ich stelle mir den prinzipiellen Ablauf so vor:&lt;br /&gt;
# zentrale Instanz übergibt Details wie Samplefrequenz, ... und den Startzeitpunkt an einzelne Messprozesse.&lt;br /&gt;
# Messprozesse messen vor sich hin, in persönlichen großen Ringpuffer.&lt;br /&gt;
# zentrale Instanz holt sich ab und an aus den Ringpuffern die Daten die sie haben will und schreibt sie in ein File&lt;br /&gt;
&lt;br /&gt;
== Verschiedene Prozesse ==&lt;br /&gt;
Die Kommunikation könnte man über Pipes, Fifos, Shared-Memory, Message-Queues, TCP (Sockets) machen, im Prinzip auch mit MPI.&lt;br /&gt;
&lt;br /&gt;
* MPI ist Mist, weil man dann immer ein MPI-System braucht&lt;br /&gt;
* Message Queues sind im Prinzip cool, praktisch aber viel zu kurz und für zu kleine Datenmengen gedacht (10 Messages a 8kB ist Standard unter Linux). Dafür soll das halt sehr schnell sein (im L1-Cache bleiben etc).&lt;br /&gt;
* Pipes, Fifos ist halt ein bisschen fummelig. TCP keine Ahnung&lt;br /&gt;
* SHMem ist eigentlich ziemlich ok. Man muss natürlich von Hand synchronisieren. Das ist eigentlich auch kein Ding weiter. Wenn man einmal Zugriff auf den gemeinsamen Speicherbereich hat, sollte das nicht schwieriger sein als mit OpenMP (s.u.).&lt;br /&gt;
&lt;br /&gt;
*[http://www.ecst.csuchico.edu/~beej/guide/ipc/mq.html Message Queues]&lt;br /&gt;
*[http://kirkwylie.blogspot.com/2008/10/posix-message-queues-useful-but-limited.html POSIX Message in Linux]&lt;br /&gt;
&lt;br /&gt;
== Verschiedene Threads ==&lt;br /&gt;
Nachteil ist, dass die einzelnen Ausleseprozesse nicht gegeneinander geschützt sind. &lt;br /&gt;
=== OpenMP ===&lt;br /&gt;
Dafür gibt es die nahezu triviale Variante mit OpenMP. Der geringe Aufwand könnte die eher theoretischen Nachteile durchaus wieder wettmachen, finde ich.&lt;br /&gt;
Ich stelle mit das ungefähr so vor:&lt;br /&gt;
&lt;br /&gt;
 #include &amp;lt;iostream&amp;gt;&lt;br /&gt;
 #include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;omp.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 using namespace std;&lt;br /&gt;
 int showAction; &lt;br /&gt;
 &lt;br /&gt;
 /* Das ist eine etwas missbräuchliche aber immer noch sehr einfache Verwendung&lt;br /&gt;
   von OpenMP zur Arbeit mit Threads. Auf alle Fälle ist es schön&lt;br /&gt;
   einfach. Evtl. müssen die Jobs das Lesen nicht in einer critical Section&lt;br /&gt;
   machen aber es wird hier nichts schaden.&lt;br /&gt;
 */&lt;br /&gt;
 &lt;br /&gt;
 int job1(void)&lt;br /&gt;
 {&lt;br /&gt;
  for(;;)&lt;br /&gt;
  {&lt;br /&gt;
 #pragma  critical&lt;br /&gt;
   int sAct=showAction;&lt;br /&gt;
   if (sAct&amp;amp;1) cout &amp;lt;&amp;lt; &amp;quot;1&amp;quot;;&lt;br /&gt;
   cout.flush();&lt;br /&gt;
   usleep(5000); // nominell 5 ms&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 int job2(void)&lt;br /&gt;
 {&lt;br /&gt;
  for(;;)&lt;br /&gt;
  {&lt;br /&gt;
   #pragma  critical&lt;br /&gt;
   int sAct=showAction;&lt;br /&gt;
   if (sAct&amp;amp;2) cout &amp;lt;&amp;lt; &amp;quot;2&amp;quot;;&lt;br /&gt;
   cout.flush();&lt;br /&gt;
   usleep(5000); // 5 ms&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 int job3(void)&lt;br /&gt;
 {&lt;br /&gt;
  for(;;)&lt;br /&gt;
  {&lt;br /&gt;
   #pragma  critical&lt;br /&gt;
   int sAct=showAction;&lt;br /&gt;
   if (sAct&amp;amp;4) cout &amp;lt;&amp;lt; &amp;quot;3&amp;quot;;&lt;br /&gt;
   cout.flush();&lt;br /&gt;
   usleep(5000); // 5 ms&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 int main()&lt;br /&gt;
 {&lt;br /&gt;
  int nthreads, tid;&lt;br /&gt;
  omp_set_nested(1);&lt;br /&gt;
 &lt;br /&gt;
 /* Fork a team of threads with each thread having a private tid variable */&lt;br /&gt;
 #pragma omp parallel private(tid) num_threads (4)&lt;br /&gt;
   {&lt;br /&gt;
 &lt;br /&gt;
   /* Obtain and print thread id */&lt;br /&gt;
   tid = omp_get_thread_num();&lt;br /&gt;
   printf(&amp;quot;Hello World from thread = %d\n&amp;quot;, tid);&lt;br /&gt;
   switch (tid)&lt;br /&gt;
   {&lt;br /&gt;
    case 1: job1(); break;&lt;br /&gt;
    case 2: job2(); break;&lt;br /&gt;
    case 3: job3(); break;&lt;br /&gt;
   }&lt;br /&gt;
   /* Only master thread does this */&lt;br /&gt;
   if (tid == 0)&lt;br /&gt;
   {&lt;br /&gt;
    nthreads = omp_get_num_threads();&lt;br /&gt;
    printf(&amp;quot;Number of threads = %d\n&amp;quot;, nthreads);&lt;br /&gt;
   }&lt;br /&gt;
   for(;;) // master thread verteilt die aufgaben&lt;br /&gt;
   {&lt;br /&gt;
 #pragma critical&lt;br /&gt;
    showAction=rand();&lt;br /&gt;
    usleep(100000); // nominell 100 ms&lt;br /&gt;
   }&lt;br /&gt;
  }  /* All threads join master thread and terminate */&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* [http://cclh61.chm.tu-dresden.de/edv/manuals/xlc5/compiler/ref/ruompcrt.htm critical section]&lt;br /&gt;
&lt;br /&gt;
== Synchronisation ==&lt;br /&gt;
Mit den Pragmas von OpenMP kann man eine Synchronisation erreichen. Ein Thread wartet auf andere Threads, ich würde denken aktiv. Für Zwecke des Datensampelns sind die meisten Threads fast immer in Wartestellung. OpenMP bietet die Möglichkeit, Locks zu setzen. Darauf aufbauend könnte man eine sinnvolle Datenübergabe bauen und dazwischen die Threads Schlafen legen.&lt;br /&gt;
Das stelle ich mir so vor:&lt;/div&gt;</summary>
		<author><name>Penner</name></author>
	</entry>
	<entry>
		<id>https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Daten_Auslesen&amp;diff=736</id>
		<title>Daten Auslesen</title>
		<link rel="alternate" type="text/html" href="https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Daten_Auslesen&amp;diff=736"/>
		<updated>2009-10-02T13:25:02Z</updated>

		<summary type="html">&lt;p&gt;Penner: /* Paralleles Auslesen von diversen Sensoren und Zusammenbauen der Daten */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Paralleles Auslesen von diversen Sensoren und Zusammenbauen der Daten=&lt;br /&gt;
== Rohdatenspeicherung ==&lt;br /&gt;
Soweit ich verstanden habe, besteht die Aufgabe darin, den AD-Wandler mit einer Frequenz im Bereich 1 kHz und die Koordinaten mit einer Frequenz im Bereich 10 Hz auszulesen. Evtl. kommen auch mal noch weitere Sensoren hinzu. Die Weiterverarbeitung soll in Form von n-Tupeln (Zeitstempel; AD-Wert; Koordinaten) erfolgen. Das Ganze soll auch unter Belastung des Rechners noch zuverlässig erfolgen. Die Speicherung der Rohdaten erfolgt dabei sinnvollerweise nicht als n-Tupel, sondern in einem Raster der Art:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;(t_1,ad_1);\, (t_2,ad_2), ... (t_{n,i},ad_{n,i},c_{n,i}), (t_{n+1},ad_{n+1}), ... &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
mit &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;n=k*i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Koordinaten werden also z.B. nur immer aller k Zeitschritte auch wirklich ausgelesen und aufgeschrieben. Aus solch einem File kann für die Weiterverarbeitung sofort eine Liste mit kompletten n-Tupen erstellt werden. Dabei kann man die Koordinaten zwischen den Stützstellen interpolieren oder man lässt sie einfach konstant bis zum nächsten Messpunkt. Evtl. würde eine von beiden Varianten irgendwelche Statistiken stören.&lt;br /&gt;
&lt;br /&gt;
== Datenausfnahme ==&lt;br /&gt;
Um eine möglichst jitterarme Datenaufnahme zu gewährleisten scheint es sinvoll, die einzelnen Sensoren in jeweils einen eigenen Prozess oder Thread zu packen. Dann kann der sich in aller Genauigkeit um seinen Sensor kümmern. Dabei benötigt man eine gemeinsame Datenbasis.&lt;br /&gt;
&lt;br /&gt;
== Verschiedene Prozesse ==&lt;br /&gt;
Die Kommunikation könnte man über Pipes, Fifos, Shared-Memory, Message-Queues, TCP (Sockets) machen, im Prinzip auch mit MPI.&lt;br /&gt;
&lt;br /&gt;
* MPI ist Mist, weil man dann immer ein MPI-System braucht&lt;br /&gt;
* Message Queues sind im Prinzip cool, praktisch aber viel zu kurz und für zu kleine Datenmengen gedacht (10 Messages a 8kB ist Standard unter Linux). Dafür soll das halt sehr schnell sein (im L1-Cache bleiben etc).&lt;br /&gt;
* Pipes, Fifos ist halt ein bisschen fummelig. TCP keine Ahnung&lt;br /&gt;
* SHMem ist eigentlich ziemlich ok. Man muss natürlich von Hand synchronisieren. Das ist eigentlich auch kein Ding weiter. Wenn man einmal Zugriff auf den gemeinsamen Speicherbereich hat, sollte das nicht schwieriger sein als mit OpenMP (s.u.).&lt;br /&gt;
&lt;br /&gt;
*[http://www.ecst.csuchico.edu/~beej/guide/ipc/mq.html Message Queues]&lt;br /&gt;
*[http://kirkwylie.blogspot.com/2008/10/posix-message-queues-useful-but-limited.html POSIX Message in Linux]&lt;br /&gt;
&lt;br /&gt;
== Verschiedene Threads ==&lt;br /&gt;
Nachteil ist, dass die einzelnen Ausleseprozesse nicht gegeneinander geschützt sind. &lt;br /&gt;
=== OpenMP ===&lt;br /&gt;
Dafür gibt es die nahezu triviale Variante mit OpenMP. Der geringe Aufwand könnte die eher theoretischen Nachteile durchaus wieder wettmachen, finde ich.&lt;br /&gt;
Ich stelle mit das ungefähr so vor:&lt;br /&gt;
&lt;br /&gt;
 #include &amp;lt;iostream&amp;gt;&lt;br /&gt;
 #include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;omp.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 using namespace std;&lt;br /&gt;
 int showAction; &lt;br /&gt;
 &lt;br /&gt;
 /* Das ist eine etwas missbräuchliche aber immer noch sehr einfache Verwendung&lt;br /&gt;
   von OpenMP zur Arbeit mit Threads. Auf alle Fälle ist es schön&lt;br /&gt;
   einfach. Evtl. müssen die Jobs das Lesen nicht in einer critical Section&lt;br /&gt;
   machen aber es wird hier nichts schaden.&lt;br /&gt;
 */&lt;br /&gt;
 &lt;br /&gt;
 int job1(void)&lt;br /&gt;
 {&lt;br /&gt;
  for(;;)&lt;br /&gt;
  {&lt;br /&gt;
 #pragma  critical&lt;br /&gt;
   int sAct=showAction;&lt;br /&gt;
   if (sAct&amp;amp;1) cout &amp;lt;&amp;lt; &amp;quot;1&amp;quot;;&lt;br /&gt;
   cout.flush();&lt;br /&gt;
   usleep(5000); // nominell 5 ms&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 int job2(void)&lt;br /&gt;
 {&lt;br /&gt;
  for(;;)&lt;br /&gt;
  {&lt;br /&gt;
   #pragma  critical&lt;br /&gt;
   int sAct=showAction;&lt;br /&gt;
   if (sAct&amp;amp;2) cout &amp;lt;&amp;lt; &amp;quot;2&amp;quot;;&lt;br /&gt;
   cout.flush();&lt;br /&gt;
   usleep(5000); // 5 ms&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 int job3(void)&lt;br /&gt;
 {&lt;br /&gt;
  for(;;)&lt;br /&gt;
  {&lt;br /&gt;
   #pragma  critical&lt;br /&gt;
   int sAct=showAction;&lt;br /&gt;
   if (sAct&amp;amp;4) cout &amp;lt;&amp;lt; &amp;quot;3&amp;quot;;&lt;br /&gt;
   cout.flush();&lt;br /&gt;
   usleep(5000); // 5 ms&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 int main()&lt;br /&gt;
 {&lt;br /&gt;
  int nthreads, tid;&lt;br /&gt;
  omp_set_nested(1);&lt;br /&gt;
 &lt;br /&gt;
 /* Fork a team of threads with each thread having a private tid variable */&lt;br /&gt;
 #pragma omp parallel private(tid) num_threads (4)&lt;br /&gt;
   {&lt;br /&gt;
 &lt;br /&gt;
   /* Obtain and print thread id */&lt;br /&gt;
   tid = omp_get_thread_num();&lt;br /&gt;
   printf(&amp;quot;Hello World from thread = %d\n&amp;quot;, tid);&lt;br /&gt;
   switch (tid)&lt;br /&gt;
   {&lt;br /&gt;
    case 1: job1(); break;&lt;br /&gt;
    case 2: job2(); break;&lt;br /&gt;
    case 3: job3(); break;&lt;br /&gt;
   }&lt;br /&gt;
   /* Only master thread does this */&lt;br /&gt;
   if (tid == 0)&lt;br /&gt;
   {&lt;br /&gt;
    nthreads = omp_get_num_threads();&lt;br /&gt;
    printf(&amp;quot;Number of threads = %d\n&amp;quot;, nthreads);&lt;br /&gt;
   }&lt;br /&gt;
   for(;;) // master thread verteilt die aufgaben&lt;br /&gt;
   {&lt;br /&gt;
 #pragma critical&lt;br /&gt;
    showAction=rand();&lt;br /&gt;
    usleep(100000); // nominell 100 ms&lt;br /&gt;
   }&lt;br /&gt;
  }  /* All threads join master thread and terminate */&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* [http://cclh61.chm.tu-dresden.de/edv/manuals/xlc5/compiler/ref/ruompcrt.htm critical section]&lt;br /&gt;
&lt;br /&gt;
== Synchronisation ==&lt;br /&gt;
Mit den Pragmas von OpenMP kann man eine Synchronisation erreichen. Ein Thread wartet auf andere Threads, ich würde denken aktiv. Für Zwecke des Datensampelns sind die meisten Threads fast immer in Wartestellung. OpenMP bietet die Möglichkeit, Locks zu setzen. Darauf aufbauend könnte man eine sinnvolle Datenübergabe bauen und dazwischen die Threads Schlafen legen.&lt;br /&gt;
Das stelle ich mir so vor:&lt;/div&gt;</summary>
		<author><name>Penner</name></author>
	</entry>
	<entry>
		<id>https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Daten_Auslesen&amp;diff=735</id>
		<title>Daten Auslesen</title>
		<link rel="alternate" type="text/html" href="https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Daten_Auslesen&amp;diff=735"/>
		<updated>2009-10-02T13:13:16Z</updated>

		<summary type="html">&lt;p&gt;Penner: /* Paralleles Auslesen von diversen Sensoren und Zusammenbauen der Daten */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Paralleles Auslesen von diversen Sensoren und Zusammenbauen der Daten=&lt;br /&gt;
Soweit ich verstanden habe, besteht die Aufgabe darin, den AD-Wandler mit einer Frequenz im Bereich 1 kHz und die Koordinaten mit einer Frequenz im Bereich 10 Hz auszulesen. Evtl. kommen auch mal noch weitere Sensoren hinzu. Die Weiterverarbeitung soll in Form von n-Tupeln (Zeitstempel; AD-Wert; Koordinaten) erfolgen. Das Ganze soll auch unter Belastung des Rechners noch zuverlässig erfolgen. Die Speicherung der Rohdaten erfolgt dabei sinnvollerweise nicht als n-Tupel, sondern in einem Raster der Art:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;(t_1,ad_1);\, (t_2,ad_2), ... (t_{n,i},ad_{n,i},c_{n,i}), (t_{n+1},ad_{n+1}), ... &amp;lt;/math&amp;gt;&lt;br /&gt;
mit &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;n=k*i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Koordinaten werden also z.B. nur immer aller 100 Werte auch wirklich ausgelesen und aufgeschrieben. Aus solch einem File kann für die Weiterverarbeitung sofort eine Liste mit kompletten n-Tupen erstellt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Verschiedene Prozesse ==&lt;br /&gt;
Die Kommunikation könnte man über Pipes, Fifos, Shared-Memory, Message-Queues, TCP (Sockets) machen, im Prinzip auch mit MPI.&lt;br /&gt;
&lt;br /&gt;
* MPI ist Mist, weil man dann immer ein MPI-System braucht&lt;br /&gt;
* Message Queues sind im Prinzip cool, praktisch aber viel zu kurz und für zu kleine Datenmengen gedacht (10 Messages a 8kB ist Standard unter Linux). Dafür soll das halt sehr schnell sein (im L1-Cache bleiben etc).&lt;br /&gt;
* Pipes, Fifos ist halt ein bisschen fummelig. TCP keine Ahnung&lt;br /&gt;
* SHMem ist eigentlich ziemlich ok. Man muss natürlich von Hand synchronisieren. Das ist eigentlich auch kein Ding weiter. Wenn man einmal Zugriff auf den gemeinsamen Speicherbereich hat, sollte das nicht schwieriger sein als mit OpenMP (s.u.).&lt;br /&gt;
&lt;br /&gt;
*[http://www.ecst.csuchico.edu/~beej/guide/ipc/mq.html Message Queues]&lt;br /&gt;
*[http://kirkwylie.blogspot.com/2008/10/posix-message-queues-useful-but-limited.html POSIX Message in Linux]&lt;br /&gt;
&lt;br /&gt;
== Verschiedene Threads ==&lt;br /&gt;
Nachteil ist, dass die einzelnen Ausleseprozesse nicht gegeneinander geschützt sind. &lt;br /&gt;
=== OpenMP ===&lt;br /&gt;
Dafür gibt es die nahezu triviale Variante mit OpenMP. Der geringe Aufwand könnte die eher theoretischen Nachteile durchaus wieder wettmachen, finde ich.&lt;br /&gt;
Ich stelle mit das ungefähr so vor:&lt;br /&gt;
&lt;br /&gt;
 #include &amp;lt;iostream&amp;gt;&lt;br /&gt;
 #include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;omp.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 using namespace std;&lt;br /&gt;
 int showAction; &lt;br /&gt;
 &lt;br /&gt;
 /* Das ist eine etwas missbräuchliche aber immer noch sehr einfache Verwendung&lt;br /&gt;
   von OpenMP zur Arbeit mit Threads. Auf alle Fälle ist es schön&lt;br /&gt;
   einfach. Evtl. müssen die Jobs das Lesen nicht in einer critical Section&lt;br /&gt;
   machen aber es wird hier nichts schaden.&lt;br /&gt;
 */&lt;br /&gt;
 &lt;br /&gt;
 int job1(void)&lt;br /&gt;
 {&lt;br /&gt;
  for(;;)&lt;br /&gt;
  {&lt;br /&gt;
 #pragma  critical&lt;br /&gt;
   int sAct=showAction;&lt;br /&gt;
   if (sAct&amp;amp;1) cout &amp;lt;&amp;lt; &amp;quot;1&amp;quot;;&lt;br /&gt;
   cout.flush();&lt;br /&gt;
   usleep(5000); // nominell 5 ms&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 int job2(void)&lt;br /&gt;
 {&lt;br /&gt;
  for(;;)&lt;br /&gt;
  {&lt;br /&gt;
   #pragma  critical&lt;br /&gt;
   int sAct=showAction;&lt;br /&gt;
   if (sAct&amp;amp;2) cout &amp;lt;&amp;lt; &amp;quot;2&amp;quot;;&lt;br /&gt;
   cout.flush();&lt;br /&gt;
   usleep(5000); // 5 ms&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 int job3(void)&lt;br /&gt;
 {&lt;br /&gt;
  for(;;)&lt;br /&gt;
  {&lt;br /&gt;
   #pragma  critical&lt;br /&gt;
   int sAct=showAction;&lt;br /&gt;
   if (sAct&amp;amp;4) cout &amp;lt;&amp;lt; &amp;quot;3&amp;quot;;&lt;br /&gt;
   cout.flush();&lt;br /&gt;
   usleep(5000); // 5 ms&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 int main()&lt;br /&gt;
 {&lt;br /&gt;
  int nthreads, tid;&lt;br /&gt;
  omp_set_nested(1);&lt;br /&gt;
 &lt;br /&gt;
 /* Fork a team of threads with each thread having a private tid variable */&lt;br /&gt;
 #pragma omp parallel private(tid) num_threads (4)&lt;br /&gt;
   {&lt;br /&gt;
 &lt;br /&gt;
   /* Obtain and print thread id */&lt;br /&gt;
   tid = omp_get_thread_num();&lt;br /&gt;
   printf(&amp;quot;Hello World from thread = %d\n&amp;quot;, tid);&lt;br /&gt;
   switch (tid)&lt;br /&gt;
   {&lt;br /&gt;
    case 1: job1(); break;&lt;br /&gt;
    case 2: job2(); break;&lt;br /&gt;
    case 3: job3(); break;&lt;br /&gt;
   }&lt;br /&gt;
   /* Only master thread does this */&lt;br /&gt;
   if (tid == 0)&lt;br /&gt;
   {&lt;br /&gt;
    nthreads = omp_get_num_threads();&lt;br /&gt;
    printf(&amp;quot;Number of threads = %d\n&amp;quot;, nthreads);&lt;br /&gt;
   }&lt;br /&gt;
   for(;;) // master thread verteilt die aufgaben&lt;br /&gt;
   {&lt;br /&gt;
 #pragma critical&lt;br /&gt;
    showAction=rand();&lt;br /&gt;
    usleep(100000); // nominell 100 ms&lt;br /&gt;
   }&lt;br /&gt;
  }  /* All threads join master thread and terminate */&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* [http://cclh61.chm.tu-dresden.de/edv/manuals/xlc5/compiler/ref/ruompcrt.htm critical section]&lt;br /&gt;
&lt;br /&gt;
== Synchronisation ==&lt;br /&gt;
Mit den Pragmas von OpenMP kann man eine Synchronisation erreichen. Ein Thread wartet auf andere Threads, ich würde denken aktiv. Für Zwecke des Datensampelns sind die meisten Threads fast immer in Wartestellung. OpenMP bietet die Möglichkeit, Locks zu setzen. Darauf aufbauend könnte man eine sinnvolle Datenübergabe bauen und dazwischen die Threads Schlafen legen.&lt;br /&gt;
Das stelle ich mir so vor:&lt;/div&gt;</summary>
		<author><name>Penner</name></author>
	</entry>
	<entry>
		<id>https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Sandbox&amp;diff=67</id>
		<title>Sandbox</title>
		<link rel="alternate" type="text/html" href="https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Sandbox&amp;diff=67"/>
		<updated>2009-08-14T11:51:33Z</updated>

		<summary type="html">&lt;p&gt;Penner: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Media:27m.raw]]&lt;br /&gt;
[[Media:29m.raw]]&lt;br /&gt;
[[Media:32m.raw]]&lt;/div&gt;</summary>
		<author><name>Penner</name></author>
	</entry>
	<entry>
		<id>https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Sandbox&amp;diff=62</id>
		<title>Sandbox</title>
		<link rel="alternate" type="text/html" href="https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Sandbox&amp;diff=62"/>
		<updated>2009-08-14T11:33:11Z</updated>

		<summary type="html">&lt;p&gt;Penner: Die Seite wurde neu angelegt: „Media:27m.raw Media:29m.raw“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Media:27m.raw]]&lt;br /&gt;
[[Media:29m.raw]]&lt;/div&gt;</summary>
		<author><name>Penner</name></author>
	</entry>
	<entry>
		<id>https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Hardware&amp;diff=23</id>
		<title>Hardware</title>
		<link rel="alternate" type="text/html" href="https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Hardware&amp;diff=23"/>
		<updated>2009-08-12T21:11:13Z</updated>

		<summary type="html">&lt;p&gt;Penner: /* technische Dokumentation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== technische Dokumentation ==&lt;br /&gt;
&lt;br /&gt;
technische Dokumentation des Radioteleskops als pdf-file:&lt;br /&gt;
[[Media:doku.pdf|technische Dokumentation des Radioteleskops]]&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
== Datenblätter ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.atmel.com/atmel/acrobat/doc2467.pdf ATMega128 (ATMEL)]&lt;br /&gt;
* [http://cds.linear.com/docs/Datasheet/485fh.pdf LTC485 (LT)]&lt;br /&gt;
* [http://focus.ti.com/lit/ds/symlink/max232.pdf MAX232 (TI)]&lt;br /&gt;
* [http://www.analog.com/static/imported-files/data_sheets/AD9851.pdf AD9851 DDS (AD)] &lt;br /&gt;
* [http://www.analog.com/static/imported-files/Data_Sheets/AD9858.pdf AD9858 DDS (AD)]&lt;br /&gt;
* [http://www.analog.com/static/imported-files/data_sheets/AD8307.pdf AD8307 log. Detektor]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Hgz|Hgz]] 19:39, 12. Aug. 2009 (UTC)&lt;/div&gt;</summary>
		<author><name>Penner</name></author>
	</entry>
	<entry>
		<id>https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Hauptseite&amp;diff=8</id>
		<title>Hauptseite</title>
		<link rel="alternate" type="text/html" href="https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Hauptseite&amp;diff=8"/>
		<updated>2009-08-12T19:24:29Z</updated>

		<summary type="html">&lt;p&gt;Penner: /* Vorhandene Seiten */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;&#039;&#039;&#039;MediaWiki wurde erfolgreich installiert.&#039;&#039;&#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hilfe zur Benutzung und Konfiguration der Wiki-Software findest du im [http://meta.wikimedia.org/wiki/Help:Contents Benutzerhandbuch].&lt;br /&gt;
&lt;br /&gt;
== Vorhandene Seiten ==&lt;br /&gt;
* [[Daten Auslesen]]&lt;br /&gt;
* [[Zugang von Aussen]]&lt;br /&gt;
&lt;br /&gt;
== Starthilfen ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.mediawiki.org/wiki/Manual:Configuration_settings Liste der Konfigurationsvariablen]&lt;br /&gt;
* [http://www.mediawiki.org/wiki/Manual:FAQ MediaWiki-FAQ]&lt;br /&gt;
* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailingliste neuer MediaWiki-Versionen]&lt;/div&gt;</summary>
		<author><name>Penner</name></author>
	</entry>
	<entry>
		<id>https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Daten_Auslesen&amp;diff=7</id>
		<title>Daten Auslesen</title>
		<link rel="alternate" type="text/html" href="https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Daten_Auslesen&amp;diff=7"/>
		<updated>2009-08-12T19:23:06Z</updated>

		<summary type="html">&lt;p&gt;Penner: /* VirtualBox, PPTP */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Paralleles Auslesen von diversen Sensoren und Zusammenbauen der Daten=&lt;br /&gt;
== Verschiedene Prozesse ==&lt;br /&gt;
Die Kommunikation könnte man über Pipes, Fifos, Shared-Memory, Message-Queues, TCP (Sockets) machen, im Prinzip auch mit MPI.&lt;br /&gt;
&lt;br /&gt;
* MPI ist Mist, weil man dann immer ein MPI-System braucht&lt;br /&gt;
* Message Queues sind im Prinzip cool, praktisch aber viel zu kurz und für zu kleine Datenmengen gedacht (10 Messages a 8kB ist Standard unter Linux). Dafür soll das halt sehr schnell sein (im L1-Cache bleiben etc).&lt;br /&gt;
* Pipes, Fifos ist halt ein bisschen fummelig. TCP keine Ahnung&lt;br /&gt;
* SHMem ist eigentlich ziemlich ok. Man muss natürlich von Hand synchronisieren. Das ist eigentlich auch kein Ding weiter. Wenn man einmal Zugriff auf den gemeinsamen Speicherbereich hat, sollte das nicht schwieriger sein als mit OpenMP (s.u.).&lt;br /&gt;
&lt;br /&gt;
*[http://www.ecst.csuchico.edu/~beej/guide/ipc/mq.html Message Queues]&lt;br /&gt;
*[http://kirkwylie.blogspot.com/2008/10/posix-message-queues-useful-but-limited.html POSIX Message in Linux]&lt;br /&gt;
&lt;br /&gt;
== Verschiedene Threads ==&lt;br /&gt;
Nachteil ist, dass die einzelnen Ausleseprozesse nicht gegeneinander geschützt sind. &lt;br /&gt;
=== OpenMP ===&lt;br /&gt;
Dafür gibt es die nahezu triviale Variante mit OpenMP. Der geringe Aufwand könnte die eher theoretischen Nachteile durchaus wieder wettmachen, finde ich.&lt;br /&gt;
Ich stelle mit das ungefähr so vor:&lt;br /&gt;
&lt;br /&gt;
 #include &amp;lt;iostream&amp;gt;&lt;br /&gt;
 #include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;omp.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 using namespace std;&lt;br /&gt;
 int showAction; &lt;br /&gt;
 &lt;br /&gt;
 /* Das ist eine etwas missbräuchliche aber immer noch sehr einfache Verwendung&lt;br /&gt;
   von OpenMP zur Arbeit mit Threads. Auf alle Fälle ist es schön&lt;br /&gt;
   einfach. Evtl. müssen die Jobs das Lesen nicht in einer critical Section&lt;br /&gt;
   machen aber es wird hier nichts schaden.&lt;br /&gt;
 */&lt;br /&gt;
 &lt;br /&gt;
 int job1(void)&lt;br /&gt;
 {&lt;br /&gt;
  for(;;)&lt;br /&gt;
  {&lt;br /&gt;
 #pragma  critical&lt;br /&gt;
   int sAct=showAction;&lt;br /&gt;
   if (sAct&amp;amp;1) cout &amp;lt;&amp;lt; &amp;quot;1&amp;quot;;&lt;br /&gt;
   cout.flush();&lt;br /&gt;
   usleep(5000); // nominell 5 ms&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 int job2(void)&lt;br /&gt;
 {&lt;br /&gt;
  for(;;)&lt;br /&gt;
  {&lt;br /&gt;
   #pragma  critical&lt;br /&gt;
   int sAct=showAction;&lt;br /&gt;
   if (sAct&amp;amp;2) cout &amp;lt;&amp;lt; &amp;quot;2&amp;quot;;&lt;br /&gt;
   cout.flush();&lt;br /&gt;
   usleep(5000); // 5 ms&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 int job3(void)&lt;br /&gt;
 {&lt;br /&gt;
  for(;;)&lt;br /&gt;
  {&lt;br /&gt;
   #pragma  critical&lt;br /&gt;
   int sAct=showAction;&lt;br /&gt;
   if (sAct&amp;amp;4) cout &amp;lt;&amp;lt; &amp;quot;3&amp;quot;;&lt;br /&gt;
   cout.flush();&lt;br /&gt;
   usleep(5000); // 5 ms&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 int main()&lt;br /&gt;
 {&lt;br /&gt;
  int nthreads, tid;&lt;br /&gt;
  omp_set_nested(1);&lt;br /&gt;
 &lt;br /&gt;
 /* Fork a team of threads with each thread having a private tid variable */&lt;br /&gt;
 #pragma omp parallel private(tid) num_threads (4)&lt;br /&gt;
   {&lt;br /&gt;
 &lt;br /&gt;
   /* Obtain and print thread id */&lt;br /&gt;
   tid = omp_get_thread_num();&lt;br /&gt;
   printf(&amp;quot;Hello World from thread = %d\n&amp;quot;, tid);&lt;br /&gt;
   switch (tid)&lt;br /&gt;
   {&lt;br /&gt;
    case 1: job1(); break;&lt;br /&gt;
    case 2: job2(); break;&lt;br /&gt;
    case 3: job3(); break;&lt;br /&gt;
   }&lt;br /&gt;
   /* Only master thread does this */&lt;br /&gt;
   if (tid == 0)&lt;br /&gt;
   {&lt;br /&gt;
    nthreads = omp_get_num_threads();&lt;br /&gt;
    printf(&amp;quot;Number of threads = %d\n&amp;quot;, nthreads);&lt;br /&gt;
   }&lt;br /&gt;
   for(;;) // master thread verteilt die aufgaben&lt;br /&gt;
   {&lt;br /&gt;
 #pragma critical&lt;br /&gt;
    showAction=rand();&lt;br /&gt;
    usleep(100000); // nominell 100 ms&lt;br /&gt;
   }&lt;br /&gt;
  }  /* All threads join master thread and terminate */&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* [http://cclh61.chm.tu-dresden.de/edv/manuals/xlc5/compiler/ref/ruompcrt.htm critical section]&lt;br /&gt;
&lt;br /&gt;
== Synchronisation ==&lt;br /&gt;
Mit den Pragmas von OpenMP kann man eine Synchronisation erreichen. Ein Thread wartet auf andere Threads, ich würde denken aktiv. Für Zwecke des Datensampelns sind die meisten Threads fast immer in Wartestellung. OpenMP bietet die Möglichkeit, Locks zu setzen. Darauf aufbauend könnte man eine sinnvolle Datenübergabe bauen und dazwischen die Threads Schlafen legen.&lt;br /&gt;
Das stelle ich mir so vor:&lt;/div&gt;</summary>
		<author><name>Penner</name></author>
	</entry>
	<entry>
		<id>https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Hauptseite&amp;diff=5</id>
		<title>Hauptseite</title>
		<link rel="alternate" type="text/html" href="https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Hauptseite&amp;diff=5"/>
		<updated>2009-08-12T19:20:57Z</updated>

		<summary type="html">&lt;p&gt;Penner: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;&#039;&#039;&#039;MediaWiki wurde erfolgreich installiert.&#039;&#039;&#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hilfe zur Benutzung und Konfiguration der Wiki-Software findest du im [http://meta.wikimedia.org/wiki/Help:Contents Benutzerhandbuch].&lt;br /&gt;
&lt;br /&gt;
== Vorhandene Seiten ==&lt;br /&gt;
* [[Daten_Auslesen]]&lt;br /&gt;
* [[Zugang von Aussen]]&lt;br /&gt;
&lt;br /&gt;
== Starthilfen ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.mediawiki.org/wiki/Manual:Configuration_settings Liste der Konfigurationsvariablen]&lt;br /&gt;
* [http://www.mediawiki.org/wiki/Manual:FAQ MediaWiki-FAQ]&lt;br /&gt;
* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailingliste neuer MediaWiki-Versionen]&lt;/div&gt;</summary>
		<author><name>Penner</name></author>
	</entry>
	<entry>
		<id>https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Hauptseite&amp;diff=3</id>
		<title>Hauptseite</title>
		<link rel="alternate" type="text/html" href="https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Hauptseite&amp;diff=3"/>
		<updated>2009-08-12T19:18:37Z</updated>

		<summary type="html">&lt;p&gt;Penner: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;&#039;&#039;&#039;MediaWiki wurde erfolgreich installiert.&#039;&#039;&#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hilfe zur Benutzung und Konfiguration der Wiki-Software findest du im [http://meta.wikimedia.org/wiki/Help:Contents Benutzerhandbuch].&lt;br /&gt;
&lt;br /&gt;
* [[Daten_Auslesen]]&lt;br /&gt;
&lt;br /&gt;
== Starthilfen ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.mediawiki.org/wiki/Manual:Configuration_settings Liste der Konfigurationsvariablen]&lt;br /&gt;
* [http://www.mediawiki.org/wiki/Manual:FAQ MediaWiki-FAQ]&lt;br /&gt;
* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailingliste neuer MediaWiki-Versionen]&lt;/div&gt;</summary>
		<author><name>Penner</name></author>
	</entry>
	<entry>
		<id>https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Daten_Auslesen&amp;diff=2</id>
		<title>Daten Auslesen</title>
		<link rel="alternate" type="text/html" href="https://radioastronomie.sternwarte-radebeul.de/radiowiki/index.php?title=Daten_Auslesen&amp;diff=2"/>
		<updated>2009-08-12T19:17:36Z</updated>

		<summary type="html">&lt;p&gt;Penner: Die Seite wurde neu angelegt: „= VirtualBox, PPTP = Der Zugang zum Sternwartenetzwerk soll in Zukunft standardmäßig über die offizielle VPN-Adresse erfolgen. Dazu wird ein PPTP-Tunnel zu Mon…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= VirtualBox, PPTP =&lt;br /&gt;
Der Zugang zum Sternwartenetzwerk soll in Zukunft standardmäßig über die offizielle VPN-Adresse erfolgen. Dazu wird ein PPTP-Tunnel zu Mond aufgebaut und dabei erhält man eine offizielle Adresse. Die kann wechseln, daher muss DynDns eingesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Die offizielle Adresse kann man gleich noch für 100 andere Sachen verbraten. Grundsätzlich sollen alle Dienste aber über SSH abgesichert sein. So können wir alles Mögliche basteln und trotzdem in Ruhe schlafen. Denkbare Dienste:&lt;br /&gt;
 &lt;br /&gt;
* OpenVPN&lt;br /&gt;
* Webserver (u.a. Wiki]&lt;br /&gt;
* SSH zum Perseiden&lt;br /&gt;
&lt;br /&gt;
== Gatewayrechner ==&lt;br /&gt;
Im Prinzip könnte der Perseid gleich selbst den Tunnel aufrechterhalten. Dabei gibt es zwei Probleme:&lt;br /&gt;
&lt;br /&gt;
* Der Perseid hat dann eine völlig offene IP-Adresse ohne die Möglichkeit, eine Firewall davorzustellen und auf ihm laufen prinzipiell alle möglichen und unmöglichen Netzwerkdienste. Er müsste sich also selbst mittels Iptables vor Spaßvögeln aus dem Internet schützen.&lt;br /&gt;
* Wie sollte der Perseid Antwortpakete schicken, die seine Kommunikation über die offizielle Adresse betreffen? Sein Standardgateway geht über das NAT-des FBN und das soll asu diversen Gründen auch so bleiben. Im Prinzip könnte man wahrscheinlich nur die passenden Pakete über den Mond routen. Ich weiß erstens nicht wie das geht und zweitens erscheint mir das ganz furchtbar unsauber.&lt;br /&gt;
&lt;br /&gt;
Die Lösung ist ein separater Gatewayrechner. Der kann im Perseid als virtuelle Maschine leben und braucht &#039;&#039;nur&#039;&#039; 64 MB RAM, wenn ich ein ein ganz normales Ubuntu in der Serverinstallation verwende. Der wird über die host-only-Variante von Virtualbox angeschlossen und damit kann der Perseid recht gut kontrollieren, was der Gatewayrechner darf und was nicht. In diesem [http://www.giannistsakiris.com/index.php/2007/11/01/host-only-networking-for-virtualbox Artikel] ist beschrieben, wie man das mittel &#039;&#039;Host-Interfaces&#039;&#039; und tunectl machen kann.&lt;br /&gt;
&lt;br /&gt;
= Paralleles Auslesen von diversen Sensoren und Zusammenbauen der Daten=&lt;br /&gt;
== Verschiedene Prozesse ==&lt;br /&gt;
Die Kommunikation könnte man über Pipes, Fifos, Shared-Memory, Message-Queues, TCP (Sockets) machen, im Prinzip auch mit MPI.&lt;br /&gt;
&lt;br /&gt;
* MPI ist Mist, weil man dann immer ein MPI-System braucht&lt;br /&gt;
* Message Queues sind im Prinzip cool, praktisch aber viel zu kurz und für zu kleine Datenmengen gedacht (10 Messages a 8kB ist Standard unter Linux). Dafür soll das halt sehr schnell sein (im L1-Cache bleiben etc).&lt;br /&gt;
* Pipes, Fifos ist halt ein bisschen fummelig. TCP keine Ahnung&lt;br /&gt;
* SHMem ist eigentlich ziemlich ok. Man muss natürlich von Hand synchronisieren. Das ist eigentlich auch kein Ding weiter. Wenn man einmal Zugriff auf den gemeinsamen Speicherbereich hat, sollte das nicht schwieriger sein als mit OpenMP (s.u.).&lt;br /&gt;
&lt;br /&gt;
*[http://www.ecst.csuchico.edu/~beej/guide/ipc/mq.html Message Queues]&lt;br /&gt;
*[http://kirkwylie.blogspot.com/2008/10/posix-message-queues-useful-but-limited.html POSIX Message in Linux]&lt;br /&gt;
&lt;br /&gt;
== Verschiedene Threads ==&lt;br /&gt;
Nachteil ist, dass die einzelnen Ausleseprozesse nicht gegeneinander geschützt sind. &lt;br /&gt;
=== OpenMP ===&lt;br /&gt;
Dafür gibt es die nahezu triviale Variante mit OpenMP. Der geringe Aufwand könnte die eher theoretischen Nachteile durchaus wieder wettmachen, finde ich.&lt;br /&gt;
Ich stelle mit das ungefähr so vor:&lt;br /&gt;
&lt;br /&gt;
 #include &amp;lt;iostream&amp;gt;&lt;br /&gt;
 #include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;omp.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 using namespace std;&lt;br /&gt;
 int showAction; &lt;br /&gt;
 &lt;br /&gt;
 /* Das ist eine etwas missbräuchliche aber immer noch sehr einfache Verwendung&lt;br /&gt;
   von OpenMP zur Arbeit mit Threads. Auf alle Fälle ist es schön&lt;br /&gt;
   einfach. Evtl. müssen die Jobs das Lesen nicht in einer critical Section&lt;br /&gt;
   machen aber es wird hier nichts schaden.&lt;br /&gt;
 */&lt;br /&gt;
 &lt;br /&gt;
 int job1(void)&lt;br /&gt;
 {&lt;br /&gt;
  for(;;)&lt;br /&gt;
  {&lt;br /&gt;
 #pragma  critical&lt;br /&gt;
   int sAct=showAction;&lt;br /&gt;
   if (sAct&amp;amp;1) cout &amp;lt;&amp;lt; &amp;quot;1&amp;quot;;&lt;br /&gt;
   cout.flush();&lt;br /&gt;
   usleep(5000); // nominell 5 ms&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 int job2(void)&lt;br /&gt;
 {&lt;br /&gt;
  for(;;)&lt;br /&gt;
  {&lt;br /&gt;
   #pragma  critical&lt;br /&gt;
   int sAct=showAction;&lt;br /&gt;
   if (sAct&amp;amp;2) cout &amp;lt;&amp;lt; &amp;quot;2&amp;quot;;&lt;br /&gt;
   cout.flush();&lt;br /&gt;
   usleep(5000); // 5 ms&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 int job3(void)&lt;br /&gt;
 {&lt;br /&gt;
  for(;;)&lt;br /&gt;
  {&lt;br /&gt;
   #pragma  critical&lt;br /&gt;
   int sAct=showAction;&lt;br /&gt;
   if (sAct&amp;amp;4) cout &amp;lt;&amp;lt; &amp;quot;3&amp;quot;;&lt;br /&gt;
   cout.flush();&lt;br /&gt;
   usleep(5000); // 5 ms&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 int main()&lt;br /&gt;
 {&lt;br /&gt;
  int nthreads, tid;&lt;br /&gt;
  omp_set_nested(1);&lt;br /&gt;
 &lt;br /&gt;
 /* Fork a team of threads with each thread having a private tid variable */&lt;br /&gt;
 #pragma omp parallel private(tid) num_threads (4)&lt;br /&gt;
   {&lt;br /&gt;
 &lt;br /&gt;
   /* Obtain and print thread id */&lt;br /&gt;
   tid = omp_get_thread_num();&lt;br /&gt;
   printf(&amp;quot;Hello World from thread = %d\n&amp;quot;, tid);&lt;br /&gt;
   switch (tid)&lt;br /&gt;
   {&lt;br /&gt;
    case 1: job1(); break;&lt;br /&gt;
    case 2: job2(); break;&lt;br /&gt;
    case 3: job3(); break;&lt;br /&gt;
   }&lt;br /&gt;
   /* Only master thread does this */&lt;br /&gt;
   if (tid == 0)&lt;br /&gt;
   {&lt;br /&gt;
    nthreads = omp_get_num_threads();&lt;br /&gt;
    printf(&amp;quot;Number of threads = %d\n&amp;quot;, nthreads);&lt;br /&gt;
   }&lt;br /&gt;
   for(;;) // master thread verteilt die aufgaben&lt;br /&gt;
   {&lt;br /&gt;
 #pragma critical&lt;br /&gt;
    showAction=rand();&lt;br /&gt;
    usleep(100000); // nominell 100 ms&lt;br /&gt;
   }&lt;br /&gt;
  }  /* All threads join master thread and terminate */&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* [http://cclh61.chm.tu-dresden.de/edv/manuals/xlc5/compiler/ref/ruompcrt.htm critical section]&lt;br /&gt;
&lt;br /&gt;
== Synchronisation ==&lt;br /&gt;
Mit den Pragmas von OpenMP kann man eine Synchronisation erreichen. Ein Thread wartet auf andere Threads, ich würde denken aktiv. Für Zwecke des Datensampelns sind die meisten Threads fast immer in Wartestellung. OpenMP bietet die Möglichkeit, Locks zu setzen. Darauf aufbauend könnte man eine sinnvolle Datenübergabe bauen und dazwischen die Threads Schlafen legen.&lt;br /&gt;
Das stelle ich mir so vor:&lt;/div&gt;</summary>
		<author><name>Penner</name></author>
	</entry>
</feed>