<?xml version="1.0" encoding="iso-8859-1"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<copyright>Manuel Josupeit-Walter</copyright>
		<generator>Capits.Simple Blog</generator>
		<language>de</language>
		<lastBuildDate>Tue, 06 Jan 2009 03:08:48 +0100</lastBuildDate>
		<managingEditor>webmaster@josupeit.com (Manuel Josupeit-Walter)</managingEditor>
		<webMaster>webmaster@josupeit.com (Manuel Josupeit-Walter)</webMaster>
		<ttl>1440</ttl>
		<title>josupeit.com</title>
		<link>http://www.josupeit.com/weblog</link>
		<description>Aus dem Leben eines Homo Informaticus</description>
		<pubDate>Mon, 15 Oct 2007 18:54:45 +0200</pubDate>
		<atom:link rel="self" type="application/rss+xml" href="http://www.josupeit.com/weblog?output=rss" />
		
		<item>	
			<title>Impressionen einer Party</title>
			<link>http://www.josupeit.com/weblog~privat,impressionen-einer-party.html</link>
			<guid>http://www.josupeit.com/front_content.php?lang=1&amp;idart=72</guid>
			<pubDate>Tue, 30 Dec 2008 23:32:10 +0100</pubDate>
			<author>webmaster@josupeit.com (Manuel Josupeit-Walter)</author>
			<description><![CDATA[ <p>
			Als letzte Amtshandlung in diesem Jahr m&ouml;chte ich kurz auf die <a href="front_content.php?idart=71&amp;idcat=6&amp;lang=1&amp;client=1">Fotos meiner Geburtstagsfeier</a> verweisen, damit auch die Feedleser davon Wind bekommen. :-) Vielen Dank an alle G&auml;ste f&uuml;r die sch&ouml;ne Stimmung und gute Laune, es hat mal wieder riesig Spa&szlig; gemacht mit Euch allen.
			</p>
			<p>
			Ansonsten w&uuml;nsche ich allen einen guten Rutsch ins neue Jahr. Auf das all Eure W&uuml;nsche in Erf&uuml;llung gehen und Ihr Euren Vors&auml;tzen treu bleibt. :-P 
			</p>
			<div style="margin: 10px 0pt; text-align: center">
			<div style="border: 1px solid black; margin: 0pt auto; padding: 10px; width: 400px; text-align: right">
			<img src="upload/fotos/unsortiert/949371_91033874.jpg" alt="Foto eines Feuerwerks" width="400" height="300" /><br />
			Image (c) by Agnie<br />
			<a href="http://www.sxc.hu/photo/949371">sxc.hu</a>
			</div>
			</div>
			 ]]></description>
		</item>
		<item>
			<title>Frohe Weihnachten</title>
			<link>http://www.josupeit.com/weblog~privat,frohe-weihnachten.html</link>
			<guid>http://www.josupeit.com/front_content.php?lang=1&amp;idart=70</guid>
			<pubDate>Wed, 24 Dec 2008 13:46:34 +0100</pubDate>
			<author>webmaster@josupeit.com (Manuel Josupeit-Walter)</author>
			<description><![CDATA[ <p>
			Ich w&uuml;nsche allen Leserinnen und Lesern ein frohes Weihnachtsfest und einen guten Rutsch ins Jahr 2009. Ich denke, im n&auml;chsten Jahr wird an dieser Stelle wieder mehr erscheinen.
			</p>
			<p>
			Wer trotz Weihnachten jedoch keine Lust auf klassische Weihnachtsmusik hat, kann nebenbei bemerkt gerne die neuen Songs der <i>Rettungsschwimmer-Punk-Rock-Combo</i> CJ Parker aus Essen probeh&ouml;ren: <a href="http://www.myspace.com/2cjparker" target="_blank">CJ Parker bei MySpace</a> ;-)
			</p>
			 ]]></description>
		</item>
		<item>
			<title>Bild des Monats</title>
			<link>http://www.josupeit.com/weblog~funstuff,bild-des-monats-0810.html</link>
			<guid>http://www.josupeit.com/front_content.php?lang=1&amp;idart=69</guid>
			<pubDate>Wed, 05 Nov 2008 23:58:12 +0100</pubDate>
			<author>webmaster@josupeit.com (Manuel Josupeit-Walter)</author>
			<description><![CDATA[ <div style="text-align: center">
			<img src="upload/fotos/unsortiert/IMAGE0018_19.JPG" alt="Ohne Worte" style="border: 1px solid black" width="600" height="400" />
			</div>
			 ]]></description>
		</item>
		<item>
			<title>Rot und Blau vertauscht</title>
			<link>http://www.josupeit.com/weblog~informatik-und-technik,rot-und-blau-vertauscht.html</link>
			<guid>http://www.josupeit.com/front_content.php?lang=1&amp;idart=67</guid>
			<pubDate>Sun, 12 Oct 2008 17:42:48 +0200</pubDate>
			<author>webmaster@josupeit.com (Manuel Josupeit-Walter)</author>
			<description><![CDATA[ <p>
			In der letzten Zeit verfolgte mich im B&uuml;ro ein interessantes Ph&auml;nomen: Mein Arbeitsplatzrechner zeigte konsequent rote Schrift in blauer Farbe an und andersherum. Anfangs hielt ich es f&uuml;r ein Problem der RaveReport Software, mit der ich Berichte f&uuml;r eine Delphi Anwendung schrieb, bis mir auffiel, dass sich das Problem durch alle Anwendungen an meinem PC zog. Komischerweise trat es nur bei Text auf, nicht bei Grafiken, und auch nur dann, wenn die Schrift eine Gr&ouml;&szlig;e von 14pt &uuml;berstieg, oder fett war. (Schade, ich hielt es f&uuml;r ein neues Feature, dass Google die Schlagworte der Suchergebnisse nun in Rot zeigt. ;-))
			</p>
			<p>
			Was die Ursache des Problems ist, lie&szlig; sich bis heute nicht kl&auml;ren, allerdings half es, die Kantengl&auml;ttung f&uuml;r Schriften abzuschalten oder auf ClearType umzustellen. F&uuml;r alle, die das selbe Problem haben: Einfach ausprobieren. F&uuml;r bessere L&ouml;sungen bin ich angesichts meiner nunmehr pixeligen Schriften sehr dankbar. :-)
			</p>
			 ]]></description>
		</item>
		<item>
			<title>Entwicklung mit Eclipse protokollieren</title>
			<link>http://www.josupeit.com/weblog~informatik-und-technik~java,entwicklung-mit-eclipse-protokollieren.html</link>
			<guid>http://www.josupeit.com/front_content.php?lang=1&amp;idart=66</guid>
			<pubDate>Sat, 04 Oct 2008 16:57:51 +0200</pubDate>
			<author>webmaster@josupeit.com (Manuel Josupeit-Walter)</author>
			<description><![CDATA[ <p>
			Im Zuge einer empirischen Studie an der Universit&auml;t Duisburg-Essen habe ich im Rahmen meines Projektseminars ein Eclipse Plugin in Java entwickelt, das es erm&ouml;glicht, alle Schritte eines Entwicklers m&ouml;glichst detailliert nachvollziehen - und entwickelten Quellcode rekonstruieren zu k&ouml;nnen.
			</p>
			<p>
			Das einzige Tool auf das ich gesto&szlig;en bin, das in irgendeiner Form zu einem solchen Zweck geeignet gewesen w&auml;re, hei&szlig;t <a href="http://www.eclipse.org/tptp/home/downloads/" target="_blank">Automated GUI Recorder</a> vom TPTP Projekt. Leider erwies es sich jedoch als leichter gesagt, als getan, dieses Plugin in einer Form zu erweitern, die den Anforderungen der Studie entsprachen, so scheiterte ich bereits am vollst&auml;ndigen Checkout des Quellcodes via CVS. Auch diverse Newsgroup Aufrufe verliefen im Sande, so dass selbst entwickeln die einzig brauchbare L&ouml;sung zu sein schien.
			</p>
			<p>
			So entstand also das Development Trace Plugin, das auf Eclipse Ganymede (3.4) l&auml;uft und s&auml;mtliche Aktionen, wie Commands (g&auml;ngige Operationen, wie Copy und Paste, Builds oder Saves), Fensterwechsel (Ge&ouml;ffnet, Aktiviert, Geschlossen), Runs (Run, Debug) und intern getriggerte Aktionen in einer PostgreSQL Datenbank speichert. S&auml;mtliche gesammelten Datens&auml;tze, so auch alle Dateien und Ordner des Workspaces, die vom mitgelieferten Builder als kompilierbar oder nicht kompilierbar markiert und gespeichert werden, werden hierbei mit einer Sitzung verkn&uuml;pft, die beim Eclipse Start angelegt wird. Ein Speichern aller &Auml;nderungen wird automatisch nach jeder Modifikation in einem Editorfenster (mit einer Verz&ouml;gerung von 2 Sekunden) angesto&szlig;en, so dass eine sehr genaue Rekonstruktion zeitlicher &quot;Snapshots&quot;gew&auml;hrleistet wird.
			</p>
			<p>
			Sobald die Auswertung der gesammelten Daten fertiggestellt und die Ergebnisse der Studie ver&ouml;ffentlicht wurden, werde ich das Plugin und die Quelltexte inklusive der verwendeten Datenbankschemata und Ant-Scripte zur automatischen Rekonstruktion und Unit-Tests unter einer entsprechenden Lizenz im Downloadbereich ver&ouml;ffentlichen. 
			</p>
			 ]]></description>
		</item>
		<item>
			<title>Visual Studio 2008 auf Vista x64</title>
			<link>http://www.josupeit.com/weblog~informatik-und-technik~dotnet,visual-studio-2008-auf-vista-x64.html</link>
			<guid>http://www.josupeit.com/front_content.php?lang=1&amp;idart=64</guid>
			<pubDate>Fri, 03 Oct 2008 15:23:44 +0200</pubDate>
			<author>webmaster@josupeit.com (Manuel Josupeit-Walter)</author>
			<description><![CDATA[ <p>
			Seit geraumer Zeit bin ich endlich im Besitz meines neuen Rechners, allerdings bescherte mir die Installation von Visual Studio 2008 auf der 64-Bit Version von Windows Vista so einige Probleme, die auch <a href="http://grumpywookie.wordpress.com/2008/02/12/problems-installing-visual-studio-2008-on-vista-x64/" target="_blank">hier</a> bereits im Februar gebloggt wurden. (Leider bin ich trotz emsigen Googlens nicht auf eine solche Probleml&ouml;sung gesto&szlig;en.)
			</p>
			<p>
			Trotz einer frischen Installation von Windows und allen n&ouml;tigen Treibern scheiterte die Installation von Visual Studio bereits beim .NET Framework 3.5 mit einer ganzen Reihe roter Kreuze. Zudem erfreute ich mich seither daran, dass mein neuer Rechner nun ca. 10 Minuten (!!) zum booten brauchte, bis ich letztlich meinen Desktop vor mir sah (nicht, dass ich jetzt in der Lage gewesen w&auml;re, den PC in irgend einer Form zu bedienen :-)).
			</p>
			<p>
			Die L&ouml;sung des Problemes jedoch hei&szlig;t Service Pack 1 f&uuml;r Windows Vista x64, dass Microsoft gl&uuml;cklicherweise <a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=874a414b-32b2-41cc-bd8b-d71eda5ec07c&amp;DisplayLang=de" target="_blank">online zum Download</a> bereitstellt. Schade allerdings, dass dort explizit vom Download abgeraten wird, da die Updates in Vista automatisch erfolgten -- Leider wurde, jedenfalls bei mir, dieses Service Pack nicht per Auto-Update ausgeliefert. Vielen Dank, Mr. Ballmer, das bescherte mir 10 Stunden Arbeit... 
			</p>
			 ]]></description>
		</item>
		<item>
			<title>Verabschiedung Pater Otto Nosbisch</title>
			<link>http://www.josupeit.com/weblog~privat,verabschiedung-pater-otto-nosbisch.html</link>
			<guid>http://www.josupeit.com/front_content.php?lang=1&amp;idart=62</guid>
			<pubDate>Thu, 21 Aug 2008 19:13:35 +0200</pubDate>
			<author>webmaster@josupeit.com (Manuel Josupeit-Walter)</author>
			<description><![CDATA[ <p>
			Bereits zu meiner Schulzeit war Pater Otto Nosbisch Direktor am Don-Bosco Gymnasium in Essen-Borbeck. Noch heute treffen wir uns, als ehemaliges Sch&uuml;lersprecherteam von 2000, oft zu feucht-fr&ouml;hlichen Abenden. Zu unserem Bedauern werden diese Abende k&uuml;nftig leider seltener werden, denn wie es bei den Salesianern Don Boscos &uuml;blich ist, legt Otto nun nach Jahren guter Arbeit als &quot;Chef&quot; zwangsweise seine Arbeit am Don-Bosco Gymnasium nieder, um das St&auml;dchen Calhorn im hohen Norden aufzumischen.
			</p>
			<p>
			Bei dieser Gelegenheit m&ouml;chten wir als ehemalige SV und mittlerweile gute Freunde nochmals&nbsp;<i>&raquo;Danke&laquo;</i> sagen f&uuml;r die sch&ouml;ne Zeit und w&uuml;nschen Dir, lieber Otto, alles Gute f&uuml;r den weiteren Lebensweg. 
			</p>
			<p>
			Fotos von der Abschiedsfeier sind <a href="front_content.php?idart=61&amp;idcat=6&amp;lang=1&amp;client=1">hier</a> online.<br />
			<br />
			</p>
			<p>
			<b>Nachgelegt (24. August):</b>
			</p>
			<p>
			&nbsp;
			</p>
			<div style="text-align: center">
			<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" width="240" height="320">
				<param name="width" value="240" />
				<param name="height" value="320" />
				<param name="wmode" value="transparent" />
				<param name="flashvars" value="file=/upload/videos/verabschiedung_otto/otto.flv" />
				<param name="src" value="upload/mediaplayer.swf" />
				<embed type="application/x-shockwave-flash" width="240" height="320" wmode="transparent" flashvars="file=/upload/videos/verabschiedung_otto/otto.flv" src="upload/mediaplayer.swf"></embed>
			</object>
			</div>
			<p>
			&nbsp;
			</p>
			 ]]></description>
		</item>
		<item>
			<title>Empirische Forschung an Objektorientierung</title>
			<link>http://www.josupeit.com/weblog~informatik-und-technik,empirische-forschung-an-objektorientierung.html</link>
			<guid>http://www.josupeit.com/front_content.php?lang=1&amp;idart=60</guid>
			<pubDate>Sat, 05 Jul 2008 18:02:08 +0200</pubDate>
			<author>webmaster@josupeit.com (Manuel Josupeit-Walter)</author>
			<description><![CDATA[ <p>
			Dass Software ein wesentlicher Bestandteil unserer Gesellschaft ist, stellt in der heutigen
			Zeit selbst ein Laie nicht mehr in Frage. Viele Ausbildungsbetriebe und
			Hochschulen lehren k&uuml;nftiges IT-Personal Design und Entwicklung von Software, oft in
			objektorientierten Hochsprachen, wie Java, C++ oder C#.
			</p>
			<p>
			Dennoch gibt es Alternativen zur Entwicklung dieser Software, wie die Nutzung prozeduraler
			oder logischer Programmiersprachen, wie Pascal oder Prolog. In der Praxis stellt
			sich daher h&auml;ufig die Frage, auf welche Weise ein Softwareprojekt entwickelt werden
			soll.
			</p>
			<p>
			Die <a href="front_content.php?idart=48&amp;idcat=13&amp;lang=1&amp;client=1&amp;file=5e9f92a01c986bafcabbafd145520b13">hier zum Download</a> bereitgestellte Arbeit setzt sich mit dem Thema empirischer Forschung an Objektorientierung kritisch
			auseinander und beleuchtet, in wie fern Empirie als Entscheidungsgrundlage f&uuml;r
			die Wahl bestimmter Softwaredesigns oder Entwicklungsalternativen dienen kann.
			</p>
			<p>
			Viel Spa&szlig; beim Lesen...
			</p>
			 ]]></description>
		</item>
		<item>
			<title>Systemweiter Singleton in C#: Nachtrag</title>
			<link>http://www.josupeit.com/weblog~informatik-und-technik~dotnet,systemweiter-singleton-nachtrag.html</link>
			<guid>http://www.josupeit.com/front_content.php?lang=1&amp;idart=59</guid>
			<pubDate>Fri, 16 May 2008 13:29:02 +0200</pubDate>
			<author>webmaster@josupeit.com (Manuel Josupeit-Walter)</author>
			<description><![CDATA[ <p>
			Vor einiger Zeit berichtete ich <a href="front_content.php?idart=29&amp;idcat=10&amp;lang=1&amp;client=1">hier</a> &uuml;ber die Implementierung eines systemweiten Singleton in C#. Trotz Freigabe des registrierten Mutexes bei Terminierung des Hauptprozesses und damit einhergehender Vernichtung der &uuml;ber die Anwendungsdom&auml;ne hinaus bereitgestellten Objekte, wurde bei Aufruf der GetInstance-Methode kein neues Objekt erzeugt (vielen Dank f&uuml;r den Hinweis, Tom).
			</p>
			<p>
			Diesem Problem habe ich etwas Zeit gewidmet und eine L&ouml;sung zum <a href="front_content.php?idcat=13&amp;lang=1&amp;client=1">Download</a> bereitgestellt. 
			</p>
			 ]]></description>
		</item>
		<item>
			<title>Maxdome - Dank AVM Set-Top-Box ein Vergnügen</title>
			<link>http://www.josupeit.com/weblog~privat,maxdome-mit-avm-stb.html</link>
			<guid>http://www.josupeit.com/front_content.php?lang=1&amp;idart=58</guid>
			<pubDate>Mon, 12 May 2008 11:22:07 +0200</pubDate>
			<author>webmaster@josupeit.com (Manuel Josupeit-Walter)</author>
			<description><![CDATA[ <p>
			Vor einiger Zeit berichtete ich <a href="front_content.php?idart=35&amp;idcat=5&amp;lang=1&amp;client=1" title="Maxdome mit Telegent STB">hier</a> von meinen Erfahrungen mit dem 1 und 1 Support im Bezug auf die Set-Top-Box von Telegent. Heute m&ouml;chte ich ein wenig Lob loswerden, nicht an den Support, denn es hat mich wirklich ein paar graue Haare beschert, bis ich Maxdome endlich nutzen konnte, sondern vielmehr an AVM! Im Gegensatz zu Telegent scheint der deutsche Hersteller aus Berlin n&auml;mlich in der Lage zu sein, funktionist&uuml;chtige Empfangsger&auml;te bereitzustellen. Ich besitze die Box nun seit einigen Monaten und bin begeistert: Die Box st&uuml;rzt nie ab, die Bedienung erfolgt schnell und die Filme ruckeln nicht. Sogar die Fernbedienung funktioniert. ;-)
			</p>
			<p>
			Jetzt l&auml;sst sich Maxdome also endlich genie&szlig;en. Einziges Manko: Die Preise f&uuml;r Filme und Serien sind nicht nur nach wie vor zu teuer (Blockbuster bis zu 3,99 Euro, Serien 1,49 Euro f&uuml;r je eine 24 Stunden-Lizenz zum Abspielen), sondern wurden offenbar sogar noch angehoben, denn Serien kosteten vorher nur 0,99 Euro. Die Videothek vor meiner T&uuml;r verleiht Filme und Serien f&uuml;r 1,30 Euro pro Kalenderwerktag. Au&szlig;erdem bietet beispielsweise RTL als Konkurrent zu Maxdome von Pro7 und Sat.1 viele Serienhighlights zum kostenlosen Streaming an. Dicker Daumen runter also f&uuml;r Maxdome :-(. Wer aber in Regionen wohnt, wo die Fahrt zur Videothek lang ist und bereit ist, knapp 4 Euro f&uuml;r aktuelle und gern gesehene Filme zu zahlen, kommt auf seine Kosten. Zumindest dann, wenn er sich keine Telegent-Box aufs Auge dr&uuml;cken l&auml;sst...
			</p>
			 ]]></description>
		</item>
		<item>
			<title>Capchas eingesetzt</title>
			<link>http://www.josupeit.com/weblog~informatik-und-technik~web,capchas-eingesetzt.html</link>
			<guid>http://www.josupeit.com/front_content.php?lang=1&amp;idart=57</guid>
			<pubDate>Wed, 07 May 2008 12:31:58 +0200</pubDate>
			<author>webmaster@josupeit.com (Manuel Josupeit-Walter)</author>
			<description><![CDATA[ <p>
			Nachdem ich anf&auml;nglich verschont wurde, sind nun doch endg&uuml;ltig Spam-Roboter auf meinen Blog aufmerksam geworden, so dass ich nun leider doch zu weiteren Mitteln greifen muss, um nicht t&auml;glich zig Spam-Kommentare l&ouml;schen zu m&uuml;ssen. Leider bleibt es mal wieder an den &quot;normalen&quot; Lesern h&auml;ngen, denn seit heute verwende ich, wie viele andere auch, visuelle Best&auml;tigungen. Das hei&szlig;t, wer k&uuml;nftig einen Kommentar schreiben m&ouml;chte, muss nun drei Buchstaben aus einem Bild ablesen und in ein K&auml;stchen eingeben.
			</p>
			<p>
			Vorher hatte ich einen Mechanismus verwendet, der bei Betreten dieser Seite die IP-Adresse des Besuchers mit t&auml;glich mehrfach aktualisierten Spammer-Datenbanken abglich. Da aber seit geraumer Zeit vermehrt IP-Adressen entf&uuml;hrter Rechner nur noch einmal verwendet werden, verlor diese Methode leider ihre Wirkung, so dass bedauerlicher Weise viele Leser von diesem Blog ausgesperrt wurden. Daher nochmal an dieser Stelle: Es tut mir wirklich leid, dass der Kampf gegen Spam immer auf Ihren Schultern ausgetragen wird, lieber Leser. Trotzdem hoffe ich, dass Sie mit der visuellen Best&auml;tigung kein Problem haben.
			</p>
			<p>
			Also: Nicht beirren lassen und flei&szlig;ig weiter kommentieren...&nbsp;
			</p>
			 ]]></description>
		</item>
		<item>
			<title>Contenido 4.8.1 erschienen</title>
			<link>http://www.josupeit.com/weblog~informatik-und-technik~web,contenido-481-erschienen.html</link>
			<guid>http://www.josupeit.com/front_content.php?lang=1&amp;idart=56</guid>
			<pubDate>Tue, 22 Apr 2008 17:45:00 +0200</pubDate>
			<author>webmaster@josupeit.com (Manuel Josupeit-Walter)</author>
			<description><![CDATA[ <p>
			Seit einigen Tagen ist sie da, die neuste Version des OpenSource CMS Contenido. Doch bereits kurz nach Veröffentlichung der Version 4.8.1 wurde auch diesmal direkt Version 4.8.2 hinterhergeschoben (Version 4.6.22 erschien ebenfalls am 04. Oktober 2007, Version 4.6.23 wurde am 22. Oktober veröffentlicht).
			</p>
			<p>
			Zunächst fällt ein komplett neues Design ins Auge: Nicht nur, dass der vom Hersteller for-four-business mitgelieferte "Beispielmandant" überarbeitet wurde, auch die Verwaltungsoberfläche, das sogenannte "Backend" erscheint in neuem Glanz. Erstes Manko: Selbst ich als geübter Contenido-Entwickler muss mich zunächst an die neuen Icons gewöhnen, so wird scheinbar nicht jedem auf Anhieb klar, dass ein Rechteck mit Schatten nun für "Artikel duplizieren" steht. Außerdem wirkt der neu eingeführte Hover-Effekt für die Hauptnavigation sehr träge, so dass ich bereits nach fünf Minuten Test genervt darüber war, dass ich, anstatt wie früher auf "Content" zu klicken, nun mit der Maus darüber verweilen muss, um zur gewünschten Verwaltungsseite zu gelangen.
			</p>
			<p>
			Einige Dinge sind dafür besser gelöst, so lassen sich nun beispielsweise Kategorien komfortabler erzeugen und im selben Schritt online setzen. Außerdem wurde das CMS um Workflows erweitert, so dass nun (offenbar) definiert werden kann, dass Redakteure Artikel zwar verfassen, ihre eigenen Artikel jedoch nicht selbst publizieren dürfen. Auch ein Linkchecker und eine Erweiterung namens "Content Allocation" wurden hinzugefügt (Sobald ich mir diese drei Dinge angesehen habe, werde ich an dieser Stelle darüber berichten).
			</p>
			<p>
			Dennoch scheint es sich bei allen "neuen Features" größtenteils um Schönheitsreparaturen zu handeln, so dass selbst seit September 2007 bekannte Bugs (vgl. <a href="http://forum.contenido.org/viewtopic.php?t=18175" title="Meta-Tags mit . in der Bezeichnung nicht möglich" target="_blank">http://forum.contenido.org/viewtopic.php?t=18175</a>) nicht behoben wurden. Eine Integration einer komfortablen mod_rewrite Kompatiblität ist seitens 4fB wieder einmal nicht integriert worden.
			</p>
			<p>
			Leider werde ich also - GPL sei Dank - wieder einmal meine eigene Contenido-Version aus eigenen Ergänzungen der Version 4.6.23 (wie verbesserte mod_rewrite-Unterstützung, so dass Artikel beispielsweise nicht gezwungenermaßen die Endung .html haben müssen, o.ä., Angabe eines Wertes zu Artikelspezifikationen und diverser Bugfixes wie oben angeführt) zusammenbauen. Schade, dass der Hersteller nicht einmal Fehler behebt, dessen Lösung die Community bereits ins Forum gestellt hat. 
			</p>
			 ]]></description>
		</item>
		<item>
			<title>Soulshift and Friends</title>
			<link>http://www.josupeit.com/weblog~musik,soulshift-and-friends.html</link>
			<guid>http://www.josupeit.com/front_content.php?lang=1&amp;idart=47</guid>
			<pubDate>Tue, 01 Apr 2008 16:58:31 +0200</pubDate>
			<author>webmaster@josupeit.com (Manuel Josupeit-Walter)</author>
			<description><![CDATA[ <p>
			Nachdem das letzte Fame But Insane-Konzert leider abgesagt wurde, gibts Mitte April nun doch wieder etwas auf die Ohren, denn unsere Freunde von <a href="http://www.soulshift.de" target="_blank">Soulshift</a> laden herzlich ein!
			</p>
			<p>
			Wer also Bock auf laute Rockmusik hat, ist herzlich eingeladen in Bochum vorbeizuschneien. Leider f&auml;llt der Termin auf einen Donnerstag, aber das wird euch doch wohl nicht abhalten, oder? =-O
			</p>
			<p>
			Alle Infos rund um die Veranstaltung gibts bei Soulshift oder <a href="http://www.famebutinsane.de/home/news/shoulshift_april.html" target="_blank">hier</a> bei Fame But Insane.&nbsp;
			</p>
			 ]]></description>
		</item>
		<item>
			<title>TrueCrypt - Verschlüsselung für Jedermann</title>
			<link>http://www.josupeit.com/weblog~informatik-und-technik,truecrypt-verschluesselung-fuer-jedermann.html</link>
			<guid>http://www.josupeit.com/front_content.php?lang=1&amp;idart=46</guid>
			<pubDate>Fri, 28 Mar 2008 11:49:03 +0100</pubDate>
			<author>webmaster@josupeit.com (Manuel Josupeit-Walter)</author>
			<description><![CDATA[ <p>
			Zu Zeiten des Internet sollte sich jeder Gedanken &uuml;ber die Sicherheit seiner Daten machen. Wer Dateien per Mail verschickt, konnte bereits zu Zeiten PGPs effiziente asymmetrische Verschl&uuml;sselungsmechanismen einsetzen, um sensible Daten &uuml;bers Netz &quot;zu jagen&quot;. Seit PGP ab Version 8 nicht mehr frei erh&auml;ltlich ist, tritt die OpenSource Software GPG in diese Fu&szlig;stapfen. Heute ist es selbst bei Downloads gang und g&auml;be, GPG Hashwerte mit anzugeben, damit der Nutzer auch wirklich sicher sein kann, dass die Dateien, die er herunter l&auml;dt nicht ver&auml;ndert wurden. Zu diesem Thema habe ich bereits <a href="front_content.php?idart=41&amp;idcat=8&amp;lang=1&amp;client=1" title="Die eigene Privatsph&auml;re">hier</a> einen kurzen Artikel geschrieben. 
			</p>
			<p>
			Allerdings sind nicht nur Daten vor fremden Augen zu sch&uuml;tzen: Gerade jetzt, wo USB Sticks Wegwerf-Ware geworden sind und Speicher immer g&uuml;nstiger wird sollte man sich im Klaren dar&uuml;ber sein, dass auch auf tragbaren Medien (dazu z&auml;hle ich auch Notebooks) gesch&uuml;tzt werden m&uuml;ssen. Die Antwort auf die Frage &quot;Wie denn?&quot; hei&szlig;t in diesem Fall: <a target="_blank" href="http://www.truecrypt.org">TrueCrypt</a>! 
			</p>
			<p>
			TrueCrypt ist, wie GPG, eine freie Verschl&uuml;sselungssoftware, die virtuelle Laufwerke in einzelnen Dateien auf der Festplatte anlegen und verschl&uuml;sseln kann. Sogar ganze Partitionen, wie USB-Sticks oder gar die Systempartition, auf der in vielen F&auml;llen Windows installiert ist, verschl&uuml;sselt das Tool souver&auml;n - sogar nachtr&auml;glich. Dabei werden als Algorithmen derzeit AES, Twofish und Serpent unterst&uuml;tzt und k&ouml;nnen wahlweise sogar &quot;in Reihe&quot; ausgef&uuml;hrt werden. 
			</p>
			<p>
			Nat&uuml;rlich verschl&uuml;ssele ich seit geraumer Zeit auf meinem Linux-System zuhause diverse Festplatten, allerdings war mir f&uuml;r Windows bisher keine gescheite Software bekannt. Nun habe ich vor zwei Wochen die Festplatte meines Notebooks mit TrueCrypt Verschl&uuml;sselt und ich bin begeistert. TrueCrypt legt sich dabei im MBR der Festplatte ab und wartet bereits beim Anschalten des PCs auf ein Passwort, um die Daten zu entschl&uuml;sseln. Ohne Passwort l&auml;uft nun nichts mehr; so sind zumindest meine Daten sicher, falls mein Notebook oder meine USB-Sticks gestohlen werden. 
			</p>
			<p>
			In diesem Sinne, Pr&auml;dikat des Autors: Sehr empfehlenswert! 
			</p>
			<p>
			<br />
			Als &quot;Schmankerl&quot; f&uuml;r meinen speziellen Apple-Freund: Die Software gibts f&uuml;r Windows, Linux <b>und</b> Mac (ab OS X)! In diesem Sinne: Happy encrypting... 
			</p>
			 ]]></description>
		</item>
		<item>
			<title>Zähle die Pässe</title>
			<link>http://www.josupeit.com/weblog~funstuff,zaehle-die-paesse.html</link>
			<guid>http://www.josupeit.com/front_content.php?lang=1&amp;idart=45</guid>
			<pubDate>Sun, 16 Mar 2008 10:47:00 +0100</pubDate>
			<author>webmaster@josupeit.com (Manuel Josupeit-Walter)</author>
			<description><![CDATA[ <p>
			Benni, ein Freund von mir hat mir gestern dieses Video gezeigt. Freut euch mit mir und z&auml;hlt einfach die P&auml;sse, die das Basketball-Team in den wei&szlig;en Trikots spielt. Viel Spa&szlig;
			</p>
			<p>
			<a href="upload/mediaplayer.swf" style="left: 472px ! important; top: 0px ! important" title="Klicken Sie hier, um dieses Objekt mit Adblock Plus zu blockieren" class="abp-objtab-09622476671566421 visible ontop"></a>
			</p>
			<br />
			<div align="center">
			<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" width="472" height="400" align="center">
				<param name="width" value="472" />
				<param name="height" value="400" />
				<param name="align" value="center" />
				<param name="wmode" value="transparent" />
				<param name="flashvars" value="file=http://media2.yourdailymedia.com/files/FyjZ3yAnJmeE.flv" />
				<param name="src" value="upload/mediaplayer.swf" />
				<embed type="application/x-shockwave-flash" width="472" height="400" align="center" wmode="transparent" flashvars="file=http://media2.yourdailymedia.com/files/FyjZ3yAnJmeE.flv" src="upload/mediaplayer.swf"></embed>
			</object>
			</div>
			<br />
			<br />
			 ]]></description>
		</item>
		<item>
			<title>Boppin' B - Wie immer genial</title>
			<link>http://www.josupeit.com/weblog~musik,boppin-b-wie-immer-genial.html</link>
			<guid>http://www.josupeit.com/front_content.php?lang=1&amp;idart=43</guid>
			<pubDate>Mon, 10 Mar 2008 13:40:20 +0100</pubDate>
			<author>webmaster@josupeit.com (Manuel Josupeit-Walter)</author>
			<description><![CDATA[ <p>
			Wie bereits <a href="front_content.php?idart=36&amp;idcat=11&amp;lang=1&amp;client=1">hier</a> beschrieben, haben sich gestern Boppin' B mal wieder &quot;im Pott&quot; sehen lassen, was leider sehr selten ist (Wink mit dem Zaunpfahl) und es war wie immer genial! Zwar hatte es die Vorband &quot;The Wildcats&quot; nicht ganz einfach zum Publikum durchzudringen, die Schei&szlig;kapelle hingegen hatte dank Ihres bekannten Charmes leichtes Spiel. Ich kann gar nicht alle Gags und St&uuml;cke aufz&auml;hlen, au&szlig;erdem hat Al das in seinem Blog schon getan (<a href="http://www.albogen.de/blog/musik/boppinb.html" target="_blank">Quelle</a>) :-).
			</p>
			<p>
			Was ich jedoch alle mit auf den Weg geben m&ouml;chte: Geht zu einem der Konzerte und Ihr werdet nicht entt&auml;uscht sein!!&nbsp;
			</p>
			 ]]></description>
		</item>
		<item>
			<title>Die Geschichte der Keywords</title>
			<link>http://www.josupeit.com/weblog~privat,privat-homo-fotos.html</link>
			<guid>http://www.josupeit.com/front_content.php?lang=1&amp;idart=42</guid>
			<pubDate>Fri, 07 Mar 2008 11:14:25 +0100</pubDate>
			<author>webmaster@josupeit.com (Manuel Josupeit-Walter)</author>
			<description><![CDATA[ <p>
			Manchmal frage ich mich, &uuml;ber welche omin&ouml;sen Suchbegriffe Leute auf meinem Blog landen. Immer mit dabei ist &quot;privat homo fotos&quot; - sp&auml;testens jetzt bekomm' ich diesen Suchbegriff nicht mehr weg. Ich geb ja zu, bei dem Titel meines Blogs sollte mich das nicht wundern...<br />
			<br />
			</p>
			<h2>So! &raquo; Popoclub &laquo;<br />
			</h2>
			<p>
			Mal gucken, was passiert :-)
			</p>
			 ]]></description>
		</item>
		<item>
			<title>Die eigene Privatsphäre</title>
			<link>http://www.josupeit.com/weblog~informatik-und-technik,die-eigene-privatsphaere.html</link>
			<guid>http://www.josupeit.com/front_content.php?lang=1&amp;idart=41</guid>
			<pubDate>Thu, 06 Mar 2008 12:02:17 +0100</pubDate>
			<author>webmaster@josupeit.com (Manuel Josupeit-Walter)</author>
			<description><![CDATA[ <p>
			Als ich <a href="http://www.thelackier.de/" target="_blank" title="thelackier">Sascha</a> letzten Samstag beim Umzug geholfen habe, hab ich mich mal wieder nett mit <a href="http://www.schlitt.info/" target="_blank">Toby</a> unterhalten k&ouml;nnen, diesmal &uuml;ber Datenschutz, Verschl&uuml;sselung, Zertifikate und sonstigen Informatiker-Smalltalk. Grob ging es darum, dass nicht nur viele Menschen nicht wissen, wie sie unter anderem im Netz sorgsam mit ihren Daten umgehen sollten, vielmehr fehlt teils gar das Interesse daran. Um nun ein wenig Aufkl&auml;rung zu betreiben, hat Toby schon einen Eintrag zum Thema in seinem Blog geschrieben <span class="nobr">(<a href="http://schlitt.info/applications/blog/index.php?/archives/584-Privacy-problems-explained.html" target="_blank">Quelle</a>&nbsp;<img src="upload/grafiken/english.gif" alt="Englische Seite" align="texttop" height="12" width="18" />)</span> und freundlicherweise eine nette Rundmail geschickt, die auch mich erreicht hat. Dem m&ouml;chte ich mich anschlie&szlig;en und poste an dieser Stelle ebenfalls den Link zu einem netten Flash-Video:
			</p>
			<p>
			<a href="http://eckpfeiler.net/panopticom/swf/index.htm" target="_blank">http://eckpfeiler.net/panopticom/swf/index.htm</a>
			</p>
			<p>
			Also einfach mal reinschauen, es lohnt sich!
			</p>
			<hr />
			<u>Weitere Empfehlungen:</u>
			<p>
			GNU Privacy Guard: <a href="http://www.gnupg.org/" target="_blank">http://www.gnupg.org/</a><br />
			Enigmail: <a href="http://enigmail.mozdev.org/" target="_blank">http://enigmail.mozdev.org/</a><br />
			Bundestrojaner: <a href="http://www.bundestrojaner.net/" target="_blank">http://www.bundestrojaner.net/</a><br />
			Virtuelles Datenschutzb&uuml;ro: <a href="http://www.datenschutz.de/" target="_blank">http://www.datenschutz.de/</a>
			</p>
			 ]]></description>
		</item>
		<item>
			<title>&quot;noindex&quot; im rel-Attribut</title>
			<link>http://www.josupeit.com/weblog~informatik-und-technik~web,noindex-im-rel-attribut.html</link>
			<guid>http://www.josupeit.com/front_content.php?lang=1&amp;idart=40</guid>
			<pubDate>Wed, 05 Mar 2008 20:34:20 +0100</pubDate>
			<author>webmaster@josupeit.com (Manuel Josupeit-Walter)</author>
			<description><![CDATA[ <p>
			Seit Google 2005 vorgemacht hat, wie man einzelne Links von der &quot;Verfolgung&quot; durch Suchmaschinen ausschlie&szlig;t <span class="nobr">(<a href="http://googleblog.blogspot.com/2005/01/preventing-comment-spam.html" target="_blank">Quelle</a> <img src="upload/grafiken/english.gif" alt="English Version" align="texttop" height="12" width="18" />)</span>, haben die meisten gro&szlig;en Suchmaschinen nachgezogen. An vielerlei Stellen wird Protest oder F&uuml;rsprache diesbez&uuml;glich laut, dem m&ouml;chte ich mich an dieser Stelle nicht anschlie&szlig;en. Vielmehr ist mir folgendes durch den Kopf gegangen: In Zeiten, in denen k&uuml;nftige Arbeitgeber f&auml;higen Leuten den Arbeitsplatz verweigern, weil sie zum Thema Umwelt in Greenpeace-Manier ihre Meinung mittels Kommentar in einem Blog kund getan haben, muss es doch m&ouml;glich sein, nicht nur Hyperlinks das <span class="inline_code">nofollow</span> Attribut zu &uuml;bergeben, sondern auch Teile einer Seite von der Indizierung durch Google &amp; Co. auszuschlie&szlig;en w&auml;hrend die Seite als Ganzes im Index bleibt.
			</p>
			<p class="code" rel="noindex">
			&lt;div rel=&quot;noindex&quot;&gt;<br />
			<span class="inaktiv">// Nicht indizierter Content //</span><br />
			&lt;/div&gt;
			</p>
			<p>
			Dieses Beispiel w&auml;re eine M&ouml;glichkeit daf&uuml;r, obgleich auch hier der Einsatz von <span class="inline_code">noindex </span>im Attribut rel semantisch falsch ist, den im obigen <span class="inline_code">div </span>eingeschlossenen Content (beispielsweise Blog-Kommentare auf Wunsch des Autors) &uuml;ber die Keywordsuche auszuschlie&szlig;en. Mit allen anderen Tags des <a href="http://de.wikipedia.org/w/index.php?title=Robots_Exclusion_Standard&amp;oldid=42855527" target="_blank">Robots Exclusion Standard</a> w&uuml;rde das &uuml;brigens analog funktionieren...
			</p>
			 ]]></description>
		</item>
		<item>
			<title>Boppin' B im Zentrum Altenberg</title>
			<link>http://www.josupeit.com/weblog~musik,boppin-b-im-altenberg.html</link>
			<guid>http://www.josupeit.com/front_content.php?lang=1&amp;idart=36</guid>
			<pubDate>Thu, 21 Feb 2008 17:51:55 +0100</pubDate>
			<author>webmaster@josupeit.com (Manuel Josupeit-Walter)</author>
			<description><![CDATA[ <p>
			Wer auf Rockabilly steht, sollte sich diesen Termin schonmal vormerken: Am Sonntag, den 09. M&auml;rz ist es wieder so weit, die gr&ouml;&szlig;te aller Schei&szlig;kapellen streift mal wieder durch den Ruhrpott und l&auml;sst sich in Oberhausen, im Zentrum Altenberg blicken. Karten gibts f&uuml;r 11 Euro im Vorverkauf oder f&uuml;r 14 Euro an der Abendkasse. Es lohnt sich!
			</p>
			<p>
			Also nix wie hin! Man sieht sich in Oberhausen. Falls ihr den Jungs das G&auml;stebuch vollkritzeln wollt: <a href="http://www.boppinb.de" target="_blank">www.boppinb.de</a>&nbsp;
			</p>
			 ]]></description>
		</item>
		<item>
			<title>Maxdome - aber künftig bitte ohne Telegent Set-Top-Box</title>
			<link>http://www.josupeit.com/weblog~privat,maxdome-mit-telegent-stb.html</link>
			<guid>http://www.josupeit.com/front_content.php?lang=1&amp;idart=35</guid>
			<pubDate>Fri, 08 Feb 2008 10:11:28 +0100</pubDate>
			<author>webmaster@josupeit.com (Manuel Josupeit-Walter)</author>
			<description><![CDATA[ <p>
			Seit November 2007 bin ich Maxdome-Kunde, abgesehen von den Preisen (bis zu 4 EUR f&uuml;r einen Film, der in der Videothek 1,30 EUR kostet) find ich das Angebot durchaus interessant: Kiste an, l&auml;uft nix, dann eben bei Maxdome streamen. Klingt einfach, hab ich gedacht...
			</p>
			<p>
			Ich bin im Besitz der Maxdome Set-Top-Box von Telegent und ich muss sagen, das Ding hat mich mehr als entt&auml;uscht. Die erste Box (jaaa, es gab mehrere) st&uuml;rzte im Men&uuml; und w&auml;hrend der Filme st&auml;ndig ab, au&szlig;erdem war sie furchtbar tr&auml;ge in der Bedienung. Nachdem ich also mehrere Mails mit dem Maxdome-Support (1 und 1) durch hatte, bekam ich (endlich) eine neue Box, wieder von Telegent (mein Bitten nach einem anderen Hersteller wurde offenbar nicht vernommen). Zack, angeschlossen, angeschaltet, Fernbedienung funktioniert nicht. Grrr. Vorgestern bekam ich eine neue Fernbedienung, die auch nicht funktionierte. Dieses Mal rief ich bei 1 und 1 an, doch auch das war nicht gerade was f&uuml;r meine Nerven, denn der Sprachcomputer kannte meine Kundennummer nicht, ich musste sie trotzdem drei Mal vorlesen und jeweils mit &quot;Ja&quot; best&auml;tigen (der Tonfall war der Laune entsprechend von Mal zu Mal schlechter). Erst nach dem dritten &quot;Tut mir leid, diese Nummer ist mir nicht bekannt.&quot; wurde ich trotzdem verbunden - zum n&auml;chsten Sprachcomputer. Irgendwann hatte ich jemanden in der Leitung. Leider ohne Erfolg, denn ich hatte im zweiten Men&uuml; &quot;Lieferung&quot; anstatt &quot;Technik&quot; gesagt. Man wollte mich wieder ins Hauptmen&uuml; verbinden, auch ohne Erfolg. Stattdessen musste ich nochmal anrufen und wieder drei mal meine Kundennummer erfolglos in den H&ouml;rer r&ouml;hren. Gl&uuml;cklicherweise hatte ich, nachdem ich mit einem Tonfall, der dem eines Engels glich, &quot;Technik&quot; in die Muschel meines Telefons zwitscherte, einen Herrn am anderen Ende, der mir helfen sollte:
			</p>
			<p>
			Bald bekomme ich eine neue, dritte Set-Top-Box - hoffentlich nicht von Telegent.
			</p>
			<p>
			<br />
			Ach ja: Die zwei Anrufe kosteten &uuml;ber zwei Euro. Das eigentliche Gespr&auml;ch dauerte keine zwei Minuten. Daumen hoch.&nbsp;
			</p>
			 ]]></description>
		</item>
		<item>
			<title>Konzert mit Le Mur abgeblasen</title>
			<link>http://www.josupeit.com/weblog~musik,konzert-abgeblasen.html</link>
			<guid>http://www.josupeit.com/front_content.php?lang=1&amp;idart=34</guid>
			<pubDate>Tue, 29 Jan 2008 13:33:28 +0100</pubDate>
			<author>webmaster@josupeit.com (Manuel Josupeit-Walter)</author>
			<description><![CDATA[ <p>
			Vor einiger Zeit habe ich <a href="front_content.php?idart=28&amp;idcat=11&amp;lang=1&amp;client=1" title="Fame But Insane Konzert mit Le Mur">hier</a> Werbung in eigener Sache gemacht. Heute hei&szlig;t es: Kommando zur&uuml;ck, denn <b>das Konzert im M&auml;rz findet leider nicht statt</b>. Laut Veranstalter (<a href="http://www.famebutinsane.de/home/news/konzert-abgeblasen.html" target="_blank" title="Konzert mit Le Mur entf&auml;llt">hier&nbsp; nachzulesen</a>) sollen wohl nur Dortmunder Bands auftreten. Schade eigentlich...
			</p>
			<p>
			Sobald es jedenfalls Neuigkeiten gibt, halte ich Euch hier nat&uuml;rlich auf dem Laufenden. Alternativ gibt's bei Fame But Insane nat&uuml;rlich auch alle Infos!
			</p>
			 ]]></description>
		</item>
		<item>
			<title>Mamageschenk - Auch für Männer wird Shopping einfach</title>
			<link>http://www.josupeit.com/weblog~privat,mamageschenk-nun-online.html</link>
			<guid>http://www.josupeit.com/front_content.php?lang=1&amp;idart=33</guid>
			<pubDate>Tue, 15 Jan 2008 13:25:30 +0100</pubDate>
			<author>webmaster@josupeit.com (Manuel Josupeit-Walter)</author>
			<description><![CDATA[ <div style="text-align: center">
			<img src="http://www.mamageschenk.de/upload/logos/default.png" alt="Mamageschenk.de Logo" height="72" width="125" />
			</div>
			<br />
			<p>
			Zwar war Sascha mit seinem Artikel auf seinem Blog (<a href="http://www.thelackier.de/internet/mamageschenk-online.html" target="_blank">hier zu lesen</a>) schneller, nichtsdestotrotz: Nachdem <a href="http://www.papageschenk.de" target="_blank">Papageschenk.de</a> nun schon seit August 2007 online ist und dort Frauen bereits f&uuml;r M&auml;nner die richtigen Geschenke finden (ja, wir wollen keine Socken), sollen auch wir es in Zukunft leicht haben, unseren M&auml;dels die richtigen Geschenke zu verpassen. Wer also bereits seiner Liebsten den passenden Satz Bohrer f&uuml;r die Bohrmaschine aus dem letzten Jahr geschenkt hat und zum Valentinstag mal wieder v&ouml;llig auf dem Schlauch steht, gibt's akut Abhilfe.
			</p>
			<p>
			In diesem Sinne: Ab zu <a href="http://www.mamageschenk.de" target="_blank">Mamageschenk.de</a> und endlich das Richtige schenken. Man sieht sich...
			</p>
			 ]]></description>
		</item>
		<item>
			<title>Frohes neues Jahr</title>
			<link>http://www.josupeit.com/weblog~privat,frohes-neues-jahr.html</link>
			<guid>http://www.josupeit.com/front_content.php?lang=1&amp;idart=31</guid>
			<pubDate>Tue, 01 Jan 2008 19:11:28 +0100</pubDate>
			<author>webmaster@josupeit.com (Manuel Josupeit-Walter)</author>
			<description><![CDATA[ <p>
			Ich w&uuml;nsche allen Leserinnen und Lesern meines Blogs ein frohes neues Jahr, viel Gesundheit und einen guten Start f&uuml;r 2008.
			</p>
			<p>
			Bei dieser Gelegenheit: Fotos von unserer Silvesterparty gibt es bereits heute in der <a href="front_content.php?idart=30&amp;idcat=6&amp;lang=1&amp;client=1">Fotogalerie</a>.&nbsp;
			</p>
			 ]]></description>
		</item>
		<item>
			<title>Systemweiter Singleton in C#</title>
			<link>http://www.josupeit.com/weblog~informatik-und-technik~dotnet,erweiterung-zum-globalen-singleton.html</link>
			<guid>http://www.josupeit.com/front_content.php?lang=1&amp;idart=29</guid>
			<pubDate>Wed, 19 Dec 2007 15:51:38 +0100</pubDate>
			<author>webmaster@josupeit.com (Manuel Josupeit-Walter)</author>
			<description><![CDATA[ <p>
			Am 21. November, also vor gut einem Monat habe ich in meinem Artikel <a href="front_content.php?idart=23&amp;idcat=10&amp;lang=1&amp;client=1">Singleton als vererbte Klasse am Beispiel C#</a> gezeigt, wie das Singleton Entwurfsmuster so implementiert werden kann, dass eine Klasse lediglich von einer Singleton-Oberklasse erben muss, um nicht mehr als einmal in der aktuellen Applikationsdom&auml;ne instanziiert werden zu k&ouml;nnen. Wie versprochen m&ouml;chte ich die damals Schritt f&uuml;r Schritt entwickelte Klasse heute so ausbauen, dass ein systemweiter Singleton realisiert werden kann. Dadurch kann von einer Klasse &uuml;ber die Applikationsdom&auml;ne hinaus nur ausschlie&szlig;lich eine Instanz existieren und wird es sehr einfach m&ouml;glich, dass eine Anwendung beispielsweise nur einmal gestartet werden kann und jeder weitere Start lediglich das Hauptfenster in den Vordergrund holt.
			</p>
			<p>
			Damit allerdings zwei Prozesse eines Systemes miteinander kommunizieren k&ouml;nnen, wird ein Datenkanal ben&ouml;tigt, &uuml;ber den dann ein Prozess von einem anderen ferngesteuert werden kann. Bitte behalten Sie also die folgende Illustration w&auml;hrend des lesens im Hinterkopf, es wird Ihnen das Leben etwas erleichtern:&nbsp;
			</p>
			<p>
			&nbsp;
			</p>
			<div style="text-align: center">
			<img src="upload/grafiken/remoting.gif" alt="Remoting Illustration" border="0" height="248" width="501" />
			</div>
			<br />
			<p>
			&nbsp;
			</p>
			<p>
			Bevor ich nun beginne, m&ouml;chte ich kurz den letzten Stand in Erinnerung rufen: Wir entwickelten eine <span class="inline_code">SingletonProvider</span> Klasse, die alle Instanzen im eigentlichen Sinne verwaltet hat. Eine Vererbung fand im Anschluss daran &uuml;ber die Klasse <span class="inline_code">SingletonBase</span> statt:
			</p>
			<br />
			<h4>SingletonProvider</h4>
			<span class="code"><span class="schluesselwort">using </span>System;<br />
			<span class="schluesselwort">using </span>System.Collections.Generic;<br />
			<span class="schluesselwort">using </span>System.Text;<br />
			<span class="schluesselwort">using </span>System.Collections;<br />
			<span class="schluesselwort">using </span>System.Reflection;<br />
			<br />
			<span class="schluesselwort">public static class</span> <span class="objekt">SingletonProvider</span><br />
			{<br />
			&nbsp; <span class="schluesselwort">private static</span> <span class="objekt">Hashtable </span>Selfs = <span class="schluesselwort">new </span>Hashtable();<br />
			&nbsp; <span class="schluesselwort">private static object</span> Lock&nbsp;&nbsp;&nbsp;&nbsp; = <span class="schluesselwort">new </span>Object();<br />
			<br />
			&nbsp; <span class="schluesselwort">public static</span> T GetInstance&lt;T&gt;(<span class="schluesselwort">out bool</span> New)<br />
			&nbsp;&nbsp;&nbsp; <span class="schluesselwort">where </span>T: <span class="schluesselwort">class </span><span class="kommentar">// Jede Klasse ist erlaubt</span><br />
			&nbsp; {<br />
			&nbsp;&nbsp;&nbsp; <span class="kommentar">// Auf &ouml;ffentlichen Konstruktor pr&uuml;fen</span><br />
			&nbsp;&nbsp;&nbsp; <span class="objekt">ConstructorInfo </span>checkCtor = (<span class="schluesselwort">typeof</span>(T)).GetConstructor(<span class="objekt">Type</span>.EmptyTypes);<br />
			&nbsp;&nbsp;&nbsp; <br />
			&nbsp;&nbsp;&nbsp; <span class="kommentar">/*<br />
			&nbsp;&nbsp;&nbsp; &nbsp;* Falls es einen solchen Konstruktor gibt,<br />
			&nbsp;&nbsp;&nbsp; &nbsp;* schmei&szlig;en wir einen Fehler, da es dem <br />
			&nbsp;&nbsp;&nbsp; &nbsp;* Charakter eines Singleton widerspricht.<br />
			&nbsp;&nbsp;&nbsp; &nbsp;*/</span><br />
			&nbsp;&nbsp;&nbsp; <span class="schluesselwort">if </span>(checkCtor != <span class="schluesselwort">null</span>)<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="schluesselwort">throw new</span> InvalidOperationException(<span class="zeichenfolge">&quot;Singleton means that you don't have any public constructors&quot;</span>);<br />
			<br />
			&nbsp;&nbsp;&nbsp; <span class="kommentar">// Threadsynchronisation</span><br />
			&nbsp;&nbsp;&nbsp; <span class="schluesselwort">lock </span>(Lock) {<br />
			&nbsp;&nbsp;&nbsp; &nbsp; <span class="schluesselwort">if </span>(Selfs.ContainsKey(<span class="schluesselwort">typeof</span>(T).GUID))<br />
			&nbsp;&nbsp;&nbsp; &nbsp; {<br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span class="kommentar">// Instanz existiert bereits</span><br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; New = <span class="schluesselwort">false</span>;<br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span class="schluesselwort">return </span>(T)Selfs[<span class="schluesselwort">typeof</span>(T).GUID];<br />
			&nbsp;&nbsp;&nbsp; &nbsp; }<br />
			<br />
			&nbsp;&nbsp;&nbsp; &nbsp; <span class="kommentar">// Neue Instanz &uuml;ber Reflektion erstellen</span><br />
			&nbsp; &nbsp;&nbsp;&nbsp; <span class="objekt">ConstructorInfo </span>ctorInfo;<br />
			&nbsp;&nbsp;&nbsp; &nbsp; <br />
			&nbsp;&nbsp;&nbsp; &nbsp; <span class="kommentar">// Gesch&uuml;tzte Konstruktoren auslesen</span><br />
			&nbsp;&nbsp;&nbsp; &nbsp; ctorInfo = <span class="schluesselwort">typeof</span>(T).GetConstructor(<br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="objekt">BindingFlags</span>.NonPublic | <br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; <span class="objekt">BindingFlags</span>.Instance,<br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; <span class="schluesselwort">null</span>,<br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; <span class="objekt">Type</span>.EmptyTypes,<br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; <span class="schluesselwort">null</span><br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; );<br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
			&nbsp;&nbsp;&nbsp; &nbsp; <span class="kommentar">// Konstruktor ohne Parameter aufrufen</span><br />
			&nbsp;&nbsp;&nbsp; &nbsp; T _Instanz = (T)ctorInfo.Invoke(<span class="schluesselwort">new object</span>[] { });<br />
			&nbsp;&nbsp;&nbsp; &nbsp; <br />
			&nbsp;&nbsp;&nbsp; &nbsp; <span class="kommentar">// Instanz der Hashtabelle zuf&uuml;hren</span><br />
			&nbsp;&nbsp;&nbsp; &nbsp; Selfs.Add(<span class="schluesselwort">typeof</span>(T).GUID, _Instanz);<br />
			&nbsp;&nbsp;&nbsp; &nbsp; New = <span class="schluesselwort">true</span>;<br />
			&nbsp;&nbsp;&nbsp; &nbsp; <br />
			&nbsp;&nbsp;&nbsp; &nbsp; <span class="schluesselwort">return </span>(T)Selfs[<span class="schluesselwort">typeof</span>(T).GUID];<br />
			&nbsp;&nbsp;&nbsp; }<br />
			&nbsp; }<br />
			&nbsp; <br />
			&nbsp; <span class="schluesselwort">public static</span> T GetInstance&lt;T&gt;()<br />
			&nbsp;&nbsp;&nbsp; <span class="schluesselwort">where </span>T: <span class="schluesselwort">class</span><br />
			&nbsp; {<br />
			&nbsp;&nbsp;&nbsp; <span class="schluesselwort">bool </span>_Trash;<br />
			&nbsp;&nbsp;&nbsp; <span class="schluesselwort">return </span>GetInstance&lt;T&gt;(<span class="schluesselwort">out </span>_Trash);<br />
			&nbsp; }<br />
			}<br />
			</span>
			<br />
			<h4>SingletonBase</h4>
			<span class="code"><span class="schluesselwort">public abstract class</span> <span class="objekt">SingletonBase</span>&lt;T&gt;<br />
			&nbsp; <span class="schluesselwort">where </span>T: <span class="objekt">SingletonBase</span>&lt;T&gt;<br />
			{<br />
			&nbsp; <span class="schluesselwort">public static</span> T GetInstance(<span class="schluesselwort">out bool</span> New)<br />
			&nbsp; {<br />
			&nbsp;&nbsp;&nbsp; <span class="schluesselwort">return </span><span class="objekt">SingletonProvider</span>.GetInstance&lt;T&gt;(<span class="schluesselwort">out </span>New);<br />
			&nbsp; }<br />
			&nbsp; <br />
			&nbsp; <span class="schluesselwort">public static</span> T GetInstance()<br />
			&nbsp; {<br />
			&nbsp;&nbsp;&nbsp; <span class="schluesselwort">bool </span>_Trash;<br />
			&nbsp;&nbsp;&nbsp; <span class="schluesselwort">return </span>GetInstance(<span class="schluesselwort">out </span>_Trash);<br />
			&nbsp; }<br />
			}<br />
			</span>
			<br />
			<p>
			Um nun zun&auml;chst die <span class="inline_code">SingletonProvider</span>-Klasse auszubauen, verwende ich einen sogenannten Mutex<a href="front_content.php?idart=29#fussnoten"><sup>1</sup></a>. Mutexe werden in aller Regel zur Prozesssynchronisation verwendet, das hei&szlig;t, um sicherzustellen, dass kritische Programmabschnitte nicht gleichzeitig ausgef&uuml;hrt werden k&ouml;nnen, um beispielsweise Dateninkonsistenzen zu vermeiden. Sie lassen sich allerdings auch f&uuml;r unseren Zweck nutzen, da Mutexe systemweit registriert werden. Da sich die n&ouml;tigen Klassen f&uuml;r Mutexe und unser folgendes Vorhaben aber in anderen Namensr&auml;umen (und Assemblies) befinden, m&uuml;ssen zun&auml;chst ein Verweis auf die Assembly <span class="inline_code">System.Runtime.Remoting</span> gesetzt - und die bekannten <span class="inline_code">using</span>-Direktiven um einige Namensr&auml;ume erg&auml;nzt werden, so dass unsere Klassendefinition <span class="inline_code">GlobalSingletonProvider</span> k&uuml;nftig von den folgenden Zeilen angef&uuml;hrt wird:<br />
			&nbsp;
			</p>
			<p class="code">
			<span class="schluesselwort">using </span>System;<br />
			<span class="schluesselwort">using </span>System.Threading;<br />
			<span class="schluesselwort">using </span>System.Runtime.InteropServices;<br />
			<span class="schluesselwort">using </span>System.Runtime.Remoting.Channels.Ipc;<br />
			<span class="schluesselwort">using </span>System.Runtime.Remoting.Channels;<br />
			<span class="schluesselwort">using </span>System.Runtime.Serialization.Formatters;<br />
			<span class="schluesselwort">using </span>System.Collections;<br />
			<span class="schluesselwort">using </span>System.Collections.Generic;<br />
			<span class="schluesselwort">using </span>System.Runtime.Remoting;<br />
			<span class="schluesselwort">using </span>System.Runtime.Serialization;<br />
			<span class="schluesselwort">using </span>System.Reflection;<br />
			<br />
			<span class="schluesselwort">public static class </span><span class="objekt">GlobalSingletonProvider</span><br />
			{ ... }
			</p>
			<br />
			<p>
			Dadurch aber m&uuml;ssen f&uuml;r jedes Singleton-Objekt nicht nur Instanzen verwaltet werden, sondern auch noch die zugeh&ouml;rigen Mutexe, die beim System registriert wurden. Hierzu wird unsere Liste von Deklarationen um eine Hashtabelle erweitert.<br />
			</p>
			<p class="code">
			<span class="schluesselwort">public static class</span> <span class="objekt">GlobalSingletonProvider</span><br />
			{<br />
			&nbsp; <span class="schluesselwort">private static </span><span class="objekt">Hashtable </span>Selfs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = <span class="schluesselwort">new </span><span class="objekt">Hashtable</span>();<br />
			&nbsp; <span class="schluesselwort">private static </span><span class="objekt">Hashtable </span>ApplicationMutexes = <span class="schluesselwort">new </span><span class="objekt">Hashtable</span>();<br />
			&nbsp; <span class="schluesselwort">private static </span><span class="objekt">object </span>Lock&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = <span class="schluesselwort">new </span><span class="objekt">Object</span>();<br />
			<br />
			<span class="kommentar">&nbsp; // ... </span><br />
			}
			</p>
			<p>
			<br />
			Im Gegensatz zum herk&ouml;mmlichen SingletonProvider, wird im Rupf der Methode <span class="inline_code">GetInstance()</span> nun direkt nach der &Uuml;berpr&uuml;fung, ob bereits in der aktuellen Applikationsdom&auml;ne eine Instanz der Klasse existiert, ein neuer Mutex registriert, der als Namen die GUID, also eine absolut eindeutige ID der zu instanziierenden Klasse tr&auml;gt. Eine boolsche Variable <span class="inline_code">New </span>gibt hier an, ob dem System ein solcher Mutex bereits bekannt ist. Das n&auml;mlich ist genau dann der Fall, wenn bereits au&szlig;erhalb der Applikationsdom&auml;ne eine Instanz erstellt worden ist; der dort registrierte Mutex tr&auml;gt n&auml;mlich aufgrund der ID der Klasse den selben Namen. Jetzt wird &uuml;ber sogenannte Ipc Channels ein Remote-Proxy auf dieses Objekt geholt, so dass das bestehende Objekt quasi &quot;ferngesteuert&quot; werden kann. Als Resultat dieser Hintergrundarbeit k&ouml;nnen Sie auf dem Objekt arbeiten, als h&auml;tten Sie es in Ihrer Applikationsdom&auml;ne erzeugt (Achtung: Das hei&szlig;t nicht, dass sie auf dem Objekt arbeiten k&ouml;nnen, als h&auml;tten Sie es im gleichen Thread erzeugt. Beachten Sie Thread&uuml;bergreifende Vorg&auml;nge!), alle Aufrufe werden in Wahrheit allerdings transparent weitergereicht. Kann im Gegensatz dazu der Mutex beim System neu registriert werden, l&auml;sst das darauf schlie&szlig;en, dass es sich um eine neue Instanz der Klasse handelt. Auch in diesem Fall wird ein Ipc Kanal bereitgestellt und dar&uuml;ber das Objekt verf&uuml;gbar gemacht. Dieses Vorgehen bezeichnet man h&auml;ufig auch als Marshalling<a href="front_content.php?idart=29#fussnoten"><sup>2</sup></a>. Vorraussetzung f&uuml;r das Marshallen von Objekten ist allerings, dass diese Objekte von der Klasse <span class="inline_code">MarshalByRefObject</span> erben.
			</p>
			<p>
			Das folgende Listing zeigt nun die bisherigen Modifikationen an der herk&ouml;mmlichen <span class="inline_code">SingletonProvider</span>-Klasse, bereits bekannte Zeilen sind hier allerdings ausgegraut, damit deutlich wird, welche neuen Anweisungen unserem Vorhaben dienlich sind:
			</p>
			<p>
			<br />
			<span class="code"><span class="inaktiv">using System;<br />
			using System.Collections.Generic;<br />
			using System.Text;<br />
			using System.Collections;<br />
			using System.Reflection;<br />
			</span><span class="schluesselwort">using </span>System.Threading;<br />
			<span class="schluesselwort">using </span>System.Runtime.InteropServices;<br />
			<span class="schluesselwort">using </span>System.Runtime.Remoting.Channels.Ipc;<br />
			<span class="schluesselwort">using </span>System.Runtime.Remoting.Channels;<br />
			<span class="schluesselwort">using </span>System.Runtime.Serialization.Formatters;<br />
			<span class="schluesselwort">using </span>System.Runtime.Remoting;<br />
			<span class="schluesselwort">using </span>System.Runtime.Serialization;<br />
			<br />
			<span class="inaktiv">
			public static class</span> <span class="objekt">GlobalSingletonProvider</span><br />
			<span class="inaktiv">
			{<br />
			&nbsp; private static Hashtable Selfs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = new Hashtable();<br />
			</span>&nbsp; <span class="schluesselwort">private static </span><span class="objekt">Hashtable </span>ApplicationMutexes = <span class="schluesselwort">new </span><span class="objekt">Hashtable</span>();<br />
			<span class="inaktiv">
			&nbsp; private static object Lock&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = new Object();<br />
			<br />
			&nbsp; public static T GetInstance&lt;T&gt;(out bool New)<br />
			&nbsp;&nbsp;&nbsp; where T: </span>
			<span class="objekt">MarshalByRefObjekt </span><span class="inaktiv">// Jede Klasse ist erlaubt</span><span class="kommentar">, die von MarshalByRefObjekt erbt</span><br />
			&nbsp; <span class="inaktiv">{<br />
			&nbsp;&nbsp;&nbsp; // Auf &ouml;ffentlichen Konstruktor pr&uuml;fen<br />
			&nbsp;&nbsp;&nbsp; ConstructorInfo checkCtor = (typeof(T)).GetConstructor(Type.EmptyTypes);<br />
			&nbsp;&nbsp;&nbsp; <br />
			&nbsp;&nbsp;&nbsp; /*<br />
			&nbsp;&nbsp;&nbsp; &nbsp;* Falls es einen solchen Konstruktor gibt,<br />
			&nbsp;&nbsp;&nbsp; &nbsp;* schmei&szlig;en wir einen Fehler, da es dem <br />
			&nbsp;&nbsp;&nbsp; &nbsp;* Charakter eines Singleton widerspricht.<br />
			&nbsp;&nbsp;&nbsp; &nbsp;*/<br />
			&nbsp;&nbsp;&nbsp; if (checkCtor != null)<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new InvalidOperationException(&quot;Singleton means that you don't have any public constructors&quot;);<br />
			<br />
			&nbsp;&nbsp;&nbsp; // Threadsynchronisation<br />
			&nbsp;&nbsp;&nbsp; lock (Lock) {<br />
			&nbsp;&nbsp;&nbsp; &nbsp; if (Selfs.ContainsKey(typeof(T).GUID))<br />
			&nbsp;&nbsp;&nbsp; &nbsp; {<br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // Instanz existiert bereits<br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; New = false;<br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return (T)Selfs[typeof(T).GUID];<br />
			&nbsp;&nbsp;&nbsp; &nbsp; }</span>
			<br />
			<br />
			<span class="kommentar">
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Mittels Mutex &uuml;berpr&uuml;fen, ob bereits eine Instanz existiert<br />
			</span>
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ApplicationMutexes.Add(<span class="schluesselwort">typeof</span>(T).GUID, <span class="schluesselwort">new </span><span class="objekt">Mutex</span>(<span class="schluesselwort">true</span>, <span class="schluesselwort">typeof</span>(T).GUID.ToString(), <span class="schluesselwort">out </span>New));<br />
			<br />
			<span class="kommentar">
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Ipc Kanal deklarieren</span><br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="objekt">IpcChannel </span>_Channel;<br />
			<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="schluesselwort">if </span>(!New)<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="kommentar">/*<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * Falls in einer anderen Applikationsdom&auml;ne eine Instanz existiert,<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * muss diese nun als Remote-Proxy bereitgestellt werden, dazu<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * wird zun&auml;chst ein Ipc Channel registriert.<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */</span><br />
			<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="objekt">SoapServerFormatterSinkProvider </span>_ServProv = <span class="schluesselwort">new </span><span class="objekt">SoapServerFormatterSinkProvider</span>();<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _ServProv.TypeFilterLevel = <span class="objekt">TypeFilterLevel</span>.Full;<br />
			<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="objekt">SoapClientFormatterSinkProvider </span>_ClientProv = <span class="schluesselwort">new </span><span class="objekt">SoapClientFormatterSinkProvider</span>();<br />
			<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="kommentar">// Zur Serialisierung wird der Soap-Formatter verwendet</span><br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _Channel = <span class="schluesselwort">new </span><span class="objekt">IpcChannel</span>(<span class="schluesselwort">null</span>, _ClientProv, _ServProv);<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="objekt">ChannelServices</span>.RegisterChannel(_Channel, <span class="schluesselwort">false</span>);<br />
			<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="kommentar">// Nun wird die Instanz &uuml;ber diesen Kanal geholt</span><br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; T _Inst = (T)<span class="objekt">Activator</span>.GetObject(<span class="objekt">typeof</span>(T), <span class="zeichenfolge">&quot;ipc://localhost:9190/GlobalSingleton_&quot;</span> + <span class="schluesselwort">typeof</span>(T).GUID.ToString());<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Selfs.Add(<span class="schluesselwort">typeof</span>(T).GUID, _Inst);<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="schluesselwort">else</span><br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="kommentar">/*<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * Es existiert keine Instanz, also wird eine neue Instanz erstellt,<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * der Mutex wird bei Applikationsende wieder freigegeben<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */</span><br />
			<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="objekt">AppDomain</span>.CurrentDomain.ProcessExit += <span class="schluesselwort">delegate</span>(<span class="schluesselwort">object</span> sender, <span class="objekt">EventArgs </span>e)<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="schluesselwort">try</span><br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((<span class="objekt">Mutex</span>)ApplicationMutexes[<span class="schluesselwort">typeof</span>(T).GUID]).ReleaseMutex();<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="schluesselwort">catch </span>{ <span class="kommentar">/* Fehler ignorieren */</span> }<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; };<br />
			<br />
			<span class="inaktiv">&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; // Neue Instanz &uuml;ber Reflektion erstellen<br />
			&nbsp; &nbsp; &nbsp;&nbsp;&nbsp; ConstructorInfo ctorInfo;<br />
			&nbsp;&nbsp;&nbsp; &nbsp; <br />
			&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; // Gesch&uuml;tzte Konstruktoren auslesen<br />
			&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; ctorInfo = typeof(T).GetConstructor(<br />
			&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BindingFlags.NonPublic | <br />
			&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; BindingFlags.Instance,<br />
			&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; null,<br />
			&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; Type.EmptyTypes,<br />
			&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; null<br />
			&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; );<br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
			&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; // Konstruktor ohne Parameter aufrufen<br />
			&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; T _Instanz = (T)ctorInfo.Invoke(new object[] { });<br />
			&nbsp;&nbsp;&nbsp; &nbsp; <br />
			&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; // Instanz der Hashtabelle zuf&uuml;hren<br />
			&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; Selfs.Add(typeof(T).GUID, _Instanz);<br />
			</span><br />
			<span class="kommentar">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Ipc Kanal registrieren</span><br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="objekt">SoapServerFormatterSinkProvider </span>_ServProv = <span class="schluesselwort">new </span><span class="objekt">SoapServerFormatterSinkProvider</span>();<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _ServProv.TypeFilterLevel = <span class="objekt">TypeFilterLevel</span>.Full;<br />
			<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="objekt">SoapClientFormatterSinkProvider </span>_ClientProv = <span class="schluesselwort">new </span><span class="objekt">SoapClientFormatterSinkProvider</span>();<br />
			<br />
			<span class="kommentar">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Einstellungen f&uuml;r den Kanal werden in einer Hashtabelle abgelegt</span><br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="objekt">IDictionary </span>_Hashtable = <span class="schluesselwort">new </span><span class="objekt">Hashtable</span>();<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _Hashtable[<span class="zeichenfolge">&quot;portName&quot;</span>] = <span class="zeichenfolge">&quot;localhost:9190&quot;</span>;<br />
			<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="kommentar">// Zur Serialisierung wird der Soap-Formatter verwendet</span><br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _Channel = <span class="schluesselwort">new </span><span class="objekt">IpcChannel</span>(_Hashtable, _ClientProv, _ServProv);<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="objekt">ChannelServices</span>.RegisterChannel(_Channel, false);<br />
			<br />
			<span class="kommentar">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Objekt via Ipc Kanal &quot;marshallen&quot;</span><br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="objekt">RemotingServices</span>.Marshal((<span class="objekt">MarshalByRefObject</span>)Selfs[<span class="schluesselwort">typeof</span>(T).GUID], <span class="zeichenfolge">&quot;GlobalSingleton_&quot;</span> + <span class="schluesselwort">typeof</span>(T).GUID.ToString());<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
			<br />
			<span class="inaktiv">
			&nbsp;&nbsp;&nbsp; &nbsp; return (T)Selfs[typeof(T).GUID];<br />
			&nbsp;&nbsp;&nbsp; }<br />
			&nbsp; }<br />
			&nbsp; <br />
			&nbsp; public static T GetInstance&lt;T&gt;()<br />
			&nbsp;&nbsp;&nbsp; where T:</span> <span class="objekt">MarshalByRefObject</span><br />
			<span class="inaktiv">
			&nbsp; {<br />
			&nbsp;&nbsp;&nbsp; bool _Trash;<br />
			&nbsp;&nbsp;&nbsp; return GetInstance&lt;T&gt;(out _Trash);<br />
			&nbsp; }<br />
			}</span>
			<br />
			</span>
			</p>
			<p>
			<br />
			Die Klasse <span class="inline_code">GlobalSingletonBase </span>unterscheidet sich kaum von der Klasse <span class="inline_code">SingletonBase</span>, mit Ausnahme, dass die neue Klasse nun von <span class="inline_code">MarshalByRefObject </span>erbt, so dass schlussendlich folgender Quelltext genau die Funktionalit&auml;t bietet, die in der Einleitung erw&auml;hnt wurde:
			</p>
			<span class="code"><span class="schluesselwort">using </span>System;<br />
			<span class="schluesselwort">using </span>System.Collections.Generic;<br />
			<span class="schluesselwort">using </span>System.Text;<br />
			<span class="schluesselwort">using </span>System.Collections;<br />
			<span class="schluesselwort">using </span>System.Reflection;<br />
			<span class="schluesselwort">using </span>System.Threading;<br />
			<span class="schluesselwort">using </span>System.Runtime.InteropServices;<br />
			<span class="schluesselwort">using </span>System.Runtime.Remoting.Channels.Ipc;<br />
			<span class="schluesselwort">using </span>System.Runtime.Remoting.Channels;<br />
			<span class="schluesselwort">using </span>System.Runtime.Serialization.Formatters;<br />
			<span class="schluesselwort">using </span>System.Runtime.Remoting;<br />
			<span class="schluesselwort">using </span>System.Runtime.Serialization;<br />
			<br />
			<span class="schluesselwort">
			public static class </span><span class="objekt">GlobalSingletonProvider</span><br />
			{<br />
			&nbsp; <span class="schluesselwort">private static </span><span class="objekt">Hashtable </span>Selfs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = <span class="schluesselwort">new </span><span class="objekt">Hashtable</span>();<br />
			&nbsp; <span class="schluesselwort">private static </span><span class="objekt">Hashtable </span>ApplicationMutexes = <span class="schluesselwort">new </span><span class="objekt">Hashtable</span>();<br />
			&nbsp; <span class="schluesselwort">private static object </span>Lock&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = <span class="schluesselwort">new </span><span class="objekt">Object</span>();<br />
			<br />
			&nbsp; <span class="schluesselwort">public static </span>T GetInstance&lt;T&gt;(<span class="schluesselwort">out bool</span> New)<br />
			&nbsp;&nbsp;&nbsp; <span class="schluesselwort">where </span>T: 
			<span class="objekt">MarshalByRefObjekt </span><span class="kommentar">// Jede Klasse ist erlaubt, die von MarshalByRefObjekt erbt</span><br />
			&nbsp; {<br />
			<span class="kommentar">
			&nbsp;&nbsp;&nbsp; // Auf &ouml;ffentlichen Konstruktor pr&uuml;fen</span><br />
			&nbsp;&nbsp;&nbsp; <span class="objekt">ConstructorInfo </span>checkCtor = (<span class="schluesselwort">typeof</span>(T)).GetConstructor(<span class="objekt">Type</span>.EmptyTypes);<br />
			&nbsp;&nbsp;&nbsp; <br />
			&nbsp;&nbsp;&nbsp; <span class="kommentar">/*<br />
			&nbsp;&nbsp;&nbsp; &nbsp;* Falls es einen solchen Konstruktor gibt,<br />
			&nbsp;&nbsp;&nbsp; &nbsp;* schmei&szlig;en wir einen Fehler, da es dem <br />
			&nbsp;&nbsp;&nbsp; &nbsp;* Charakter eines Singleton widerspricht.<br />
			&nbsp;&nbsp;&nbsp; &nbsp;*/</span><br />
			&nbsp;&nbsp;&nbsp; <span class="schluesselwort">if </span>(checkCtor != <span class="schluesselwort">null</span>)<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="schluesselwort">throw new</span> <span class="objekt">InvalidOperationException</span>(<span class="zeichenfolge">&quot;Singleton means that you don't have any public constructors&quot;</span>);<br />
			<br />
			<span class="kommentar">
			&nbsp;&nbsp;&nbsp; // Threadsynchronisation<br />
			</span>
			&nbsp;&nbsp;&nbsp; <span class="schluesselwort">lock </span>(Lock) {<br />
			&nbsp;&nbsp;&nbsp; &nbsp; <span class="schluesselwort">if </span>(Selfs.ContainsKey(<span class="schluesselwort">typeof</span>(T).GUID))<br />
			&nbsp;&nbsp;&nbsp; &nbsp; {<br />
			<span class="kommentar">
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // Instanz existiert bereits</span><br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; New = <span class="schluesselwort">false</span>;<br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span class="schluesselwort">return </span>(T)Selfs[<span class="schluesselwort">typeof</span>(T).GUID];<br />
			&nbsp;&nbsp;&nbsp; &nbsp; }
			<br />
			<br />
			<span class="kommentar">
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Mittels Mutex &uuml;berpr&uuml;fen, ob bereits eine Instanz existiert<br />
			</span>
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ApplicationMutexes.Add(<span class="schluesselwort">typeof</span>(T).GUID, <span class="schluesselwort">new </span><span class="objekt">Mutex</span>(<span class="schluesselwort">true</span>, <span class="schluesselwort">typeof</span>(T).GUID.ToString(), <span class="schluesselwort">out </span>New));<br />
			<br />
			<span class="kommentar">
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Ipc Kanal deklarieren</span><br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="objekt">IpcChannel </span>_Channel;<br />
			<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="schluesselwort">if </span>(!New)<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="kommentar">/*<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * Falls in einer anderen Applikationsdom&auml;ne eine Instanz existiert,<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * muss diese nun als Remote-Proxy bereitgestellt werden, dazu<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * wird zun&auml;chst ein Ipc Channel registriert.<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */</span><br />
			<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="objekt">SoapServerFormatterSinkProvider </span>_ServProv = <span class="schluesselwort">new </span><span class="objekt">SoapServerFormatterSinkProvider</span>();<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _ServProv.TypeFilterLevel = <span class="objekt">TypeFilterLevel</span>.Full;<br />
			<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="objekt">SoapClientFormatterSinkProvider </span>_ClientProv = <span class="schluesselwort">new </span><span class="objekt">SoapClientFormatterSinkProvider</span>();<br />
			<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="kommentar">// Zur Serialisierung wird der Soap-Formatter verwendet</span><br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _Channel = <span class="schluesselwort">new </span><span class="objekt">IpcChannel</span>(<span class="schluesselwort">null</span>, _ClientProv, _ServProv);<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="objekt">ChannelServices</span>.RegisterChannel(_Channel, <span class="schluesselwort">false</span>);<br />
			<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="kommentar">// Nun wird die Instanz &uuml;ber diesen Kanal geholt</span><br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; T _Inst = (T)<span class="objekt">Activator</span>.GetObject(<span class="objekt">typeof</span>(T), <span class="zeichenfolge">&quot;ipc://localhost:9190/GlobalSingleton_&quot;</span> + <span class="schluesselwort">typeof</span>(T).GUID.ToString());<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Selfs.Add(<span class="schluesselwort">typeof</span>(T).GUID, _Inst);<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="schluesselwort">else</span><br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="kommentar">/*<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * Es existiert keine Instanz, also wird eine neue Instanz erstellt,<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * der Mutex wird bei Applikationsende wieder freigegeben<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */</span><br />
			<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="objekt">AppDomain</span>.CurrentDomain.ProcessExit += <span class="schluesselwort">delegate</span>(<span class="schluesselwort">object</span> sender, <span class="objekt">EventArgs </span>e)<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="schluesselwort">try</span><br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((<span class="objekt">Mutex</span>)ApplicationMutexes[<span class="schluesselwort">typeof</span>(T).GUID]).ReleaseMutex();<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="schluesselwort">catch </span>{ <span class="kommentar">/* Fehler ignorieren */</span> }<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; };<br />
			<br />
			<span class="kommentar">&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; // Neue Instanz &uuml;ber Reflektion erstellen</span><br />
			&nbsp; &nbsp; &nbsp;&nbsp;&nbsp; <span class="objekt">ConstructorInfo </span>ctorInfo;<br />
			&nbsp;&nbsp;&nbsp; &nbsp; <br />
			<span class="kommentar">
			&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; // Gesch&uuml;tzte Konstruktoren auslesen</span><br />
			&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; ctorInfo = <span class="schluesselwort">typeof</span>(T).GetConstructor(<br />
			&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="objekt">BindingFlags</span>.NonPublic | <br />
			&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; <span class="objekt">BindingFlags</span>.Instance,<br />
			&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; <span class="schluesselwort">null</span>,<br />
			&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; <span class="objekt">Type</span>.EmptyTypes,<br />
			&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; <span class="schluesselwort">null</span><br />
			&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; );<br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
			<span class="kommentar">
			&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; // Konstruktor ohne Parameter aufrufen<br />
			</span>
			&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; T _Instanz = (T)ctorInfo.Invoke(<span class="schluesselwort">new </span><span class="schluesselwort">object</span>[] { });<br />
			&nbsp;&nbsp;&nbsp; &nbsp; <br />
			<span class="kommentar">
			&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; // Instanz der Hashtabelle zuf&uuml;hren</span><br />
			&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; Selfs.Add(<span class="schluesselwort">typeof</span>(T).GUID, _Instanz);<br />
			<br />
			<span class="kommentar">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Ipc Kanal registrieren</span><br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="objekt">SoapServerFormatterSinkProvider </span>_ServProv = <span class="schluesselwort">new </span><span class="objekt">SoapServerFormatterSinkProvider</span>();<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _ServProv.TypeFilterLevel = <span class="objekt">TypeFilterLevel</span>.Full;<br />
			<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="objekt">SoapClientFormatterSinkProvider </span>_ClientProv = <span class="schluesselwort">new </span><span class="objekt">SoapClientFormatterSinkProvider</span>();<br />
			<br />
			<span class="kommentar">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Einstellungen f&uuml;r den Kanal werden in einer Hashtabelle abgelegt</span><br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="objekt">IDictionary </span>_Hashtable = <span class="schluesselwort">new </span><span class="objekt">Hashtable</span>();<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _Hashtable[<span class="zeichenfolge">&quot;portName&quot;</span>] = <span class="zeichenfolge">&quot;localhost:9190&quot;</span>;<br />
			<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="kommentar">// Zur Serialisierung wird der Soap-Formatter verwendet</span><br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _Channel = <span class="schluesselwort">new </span><span class="objekt">IpcChannel</span>(_Hashtable, _ClientProv, _ServProv);<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="objekt">ChannelServices</span>.RegisterChannel(_Channel, false);<br />
			<br />
			<span class="kommentar">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Objekt via Ipc Kanal &quot;marshallen&quot;</span><br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="objekt">RemotingServices</span>.Marshal((<span class="objekt">MarshalByRefObject</span>)Selfs[<span class="schluesselwort">typeof</span>(T).GUID], <span class="zeichenfolge">&quot;GlobalSingleton_&quot;</span> + <span class="schluesselwort">typeof</span>(T).GUID.ToString());<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
			<br />
			&nbsp;&nbsp;&nbsp; &nbsp; <span class="schluesselwort">return </span>(T)Selfs[<span class="schluesselwort">typeof</span>(T).GUID];<br />
			&nbsp;&nbsp;&nbsp; }<br />
			&nbsp; }<br />
			&nbsp; <br />
			<span class="schluesselwort">
			&nbsp; public static</span> T GetInstance&lt;T&gt;()<br />
			&nbsp;&nbsp;&nbsp; <span class="schluesselwort">where </span>T: <span class="objekt">MarshalByRefObject</span><br />
			&nbsp; {<br />
			&nbsp;&nbsp;&nbsp; <span class="schluesselwort">bool </span>_Trash;<br />
			&nbsp;&nbsp;&nbsp; <span class="schluesselwort">return </span>GetInstance&lt;T&gt;(<span class="schluesselwort">out </span>_Trash);<br />
			&nbsp; }<br />
			}
			<br />
			<br />
			<br />
			<span class="schluesselwort">public abstract class</span> <span class="objekt">GlobalSingletonBase</span>&lt;T&gt; : <span class="objekt">MarshalByRefObject</span><br />
			&nbsp; <span class="schluesselwort">where </span>T: <span class="objekt">GlobalSingletonBase</span>&lt;T&gt;<br />
			{<br />
			&nbsp; <span class="schluesselwort">public static</span> T GetInstance(<span class="schluesselwort">out bool</span> New)<br />
			&nbsp; {<br />
			&nbsp;&nbsp;&nbsp; <span class="schluesselwort">return </span><span class="objekt">GlobalSingletonProvider</span>.GetInstance&lt;T&gt;(<span class="schluesselwort">out </span>New);<br />
			&nbsp; }<br />
			&nbsp; <br />
			&nbsp; <span class="schluesselwort">public static</span> T GetInstance()<br />
			&nbsp; {<br />
			&nbsp;&nbsp;&nbsp; <span class="schluesselwort">bool </span>_Trash;<br />
			&nbsp;&nbsp;&nbsp; <span class="schluesselwort">return </span>GetInstance(<span class="schluesselwort">out </span>_Trash);<br />
			&nbsp; }<br />
			}<br />
			</span>
			<p>
			&nbsp;<br />
			Auf diesem Weg kann nun &uuml;ber Vererbung ein systemweiter Singleton genutzt werden. Das folgende Beispiel zeigt die Verwendung in der Praxis:
			</p>
			<p class="code">
			<span class="schluesselwort">public class</span> <span class="objekt">Start </span>: <span class="objekt">GlobalSingletonBase</span>&lt;<span class="objekt">Start</span>&gt;<br />
			{<br />
			&nbsp;&nbsp;&nbsp; <span class="schluesselwort">public </span><span class="objekt">Form </span>WinForm;<br />
			<br />
			&nbsp;&nbsp;&nbsp; <span class="schluesselwort">private </span>Start()<br />
			&nbsp;&nbsp;&nbsp; { }<br />
			<br />
			&nbsp;&nbsp;&nbsp; [<span class="objekt">STAThread</span>]<br />
			&nbsp;&nbsp;&nbsp; <span class="schluesselwort">static void</span> Main(<span class="schluesselwort">string</span>[] args)<br />
			&nbsp;&nbsp;&nbsp; {<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <span class="schluesselwort">bool </span>Created;<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="objekt">Start </span>MainProcedure = <span class="schluesselwort">Start</span>.GetInstance(<span class="schluesselwort">out </span>Created);<br />
			<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="kommentar">// Applikation starten, falls es sich um die erste Instanz handelt</span><br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="schluesselwort">if </span>(Created)<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MainProcedure.WinForm = <span class="schluesselwort">new </span><span class="objekt">HauptFormular</span>();<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MainProcedure.WinForm.Show();<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="objekt">Application</span>.Run();<br />
			&nbsp; &nbsp; &nbsp; }<br />
			&nbsp; &nbsp; &nbsp; <span class="schluesselwort">else</span><br />
			&nbsp; &nbsp; &nbsp; {<br />
			&nbsp; &nbsp; &nbsp; &nbsp; <span class="kommentar">// Applikation l&auml;uft bereits, also in den Vordergrund holen</span><br />
			&nbsp; &nbsp; &nbsp; &nbsp; MainProcedure.WinForm.WindowState = <span class="objekt">FormWindowState</span>.Maximized;<br />
			&nbsp; &nbsp; &nbsp; &nbsp; SetForegroundWindow(MainProcedure.WinForm.Handle);<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
			&nbsp;&nbsp;&nbsp; }<br />
			<br />
			&nbsp;&nbsp;&nbsp; [<span class="objekt">DllImport</span>(<span class="zeichenfolge">&quot;user32.dll&quot;</span>)]<br />
			&nbsp;&nbsp;&nbsp; <span class="schluesselwort">public static extern bool</span> SetForegroundWindow(<span class="objekt">IntPtr </span>Handle);<br />
			}<br />
			<br />
			<span class="schluesselwort">public class </span><span class="objekt">HauptFormular </span>: System.Windows.Forms.<span class="objekt">Form</span><br />
			{<br />
			&nbsp;&nbsp;&nbsp; <span class="kommentar">// ...</span><br />
			}
			</p>
			<br />
			<p>
			An dieser Stelle m&ouml;chte ich mich f&uuml;r's lesen bedanken und hoffe, Ihnen an der ein oder anderen Stelle weitergeholfen zu haben. Dennoch bin ich mir bewusst dar&uuml;ber, dass einfach viele Dinge in diesem Artikel als bekannt vorrausgesetzt werden, daf&uuml;r m&ouml;chte ich mich entschuldigen. Sicher haben Sie Verst&auml;ndnis daf&uuml;r, dass es sich nur um einen kurzen Abriss dessen handelt, was m&ouml;glich ist und nicht um ein Handbuch und ich hoffe, dass bei Unklarheiten die Codebeispiele selbsterkl&auml;rend sind. Ohne Programmierkenntnisse f&auml;llt es sicherlich schwer, alle Gedanken auf anhieb zu verstehen, ich kann Ihnen daher nur empfehlen, diese Beispiele schrittweise nachzuvollziehen.
			</p>
			<p>
			&nbsp;
			</p>
			<hr />
			<a title="fussnoten" name="fussnoten"></a>
			<div style="float: right">
			<a href="front_content.php?idart=37&amp;idcat=4&amp;lang=1&amp;client=1"><img src="upload/grafiken/gplv3-88x31.gif" alt="GPLv3" border="0" /></a>
			</div>
			<sup>1</sup> <a href="http://de.wikipedia.org/wiki/Mutex" target="_blank">Mutex: Wikipedia</a><br />
			<sup>2</sup> <a href="http://de.wikipedia.org/wiki/Marshalling" target="_blank">Marshalling: Wikipedia</a>
			 ]]></description>
		</item>
		<item>
			<title>Fame But Insane Konzert mit Le Mur</title>
			<link>http://www.josupeit.com/weblog~musik,fame-but-insane-konzert-mit-le-mur.html</link>
			<guid>http://www.josupeit.com/front_content.php?lang=1&amp;idart=28</guid>
			<pubDate>Thu, 13 Dec 2007 16:02:24 +0100</pubDate>
			<author>webmaster@josupeit.com (Manuel Josupeit-Walter)</author>
			<description><![CDATA[ <p>
			Hey Leute,
			</p>
			<p>
			heute mal Werbung in eigener Sache: Fame But Insane spielt am 08. M&auml;rz 2008 zusammen mit Le Mur in Dortmund Scharnhorst. Wenn Ihr also Zeit und Lust habt, kommt einfach vorbei. Wir freu'n uns auf jeden Fall. N&auml;here Infos gibts bei <a href="http://www.famebutinsane.de/home/news/konzert_scharnhorst.html" target="_blank">Fame But Insane</a> oder sicher auch bei <a href="http://www.le-mur.net" target="_blank">Le Mur</a>.
			</p>
			 ]]></description>
		</item>
		<item>
			<title>Möbel zu verkaufen</title>
			<link>http://www.josupeit.com/weblog~privat,moebel-zu-verkaufen.html</link>
			<guid>http://www.josupeit.com/front_content.php?lang=1&amp;idart=26</guid>
			<pubDate>Wed, 12 Dec 2007 12:29:07 +0100</pubDate>
			<author>webmaster@josupeit.com (Manuel Josupeit-Walter)</author>
			<description><![CDATA[ <p>
			Um einer Freundin von mir ein wenig unter die Arme zu greifen, hier einmal offiziell:
			</p>
			<table align="center" border="0" cellpadding="0" cellspacing="10">
				<tbody>
					<tr>
						<td align="center" valign="top"><a href="upload/fotos/unsortiert/2007-12-12_schrank.jpg" title="Schlafzimmerschrank" target="_lightbox_1"><img src="upload/fotos/unsortiert/2007-12-12_schrank.jpg" alt="Illustration Schrank" style="border: 1px solid black" border="1111" height="129" width="150" /></a>
						</td>
						<td align="center" valign="top"><a href="upload/fotos/unsortiert/2007-12-12_lampe.jpg" title="Deckenleuchte" target="_lightbox_1"><img src="upload/fotos/unsortiert/2007-12-12_lampe.jpg" alt="Illustration Deckenleuchte" style="border: 1px solid black" border="1111" height="219" width="100" /></a>
						</td>
						<td align="center" valign="top"><a href="upload/fotos/unsortiert/2007-12-12_bild.jpg" title="Gerahmtes Bild" target="_lightbox_1"><img src="upload/fotos/unsortiert/2007-12-12_bild.jpg" alt="Illustration Gerahmtes Bild" style="border: 1px solid black" border="1111" height="122" width="150" /></a>
						</td>
					</tr>
					<tr>
						<td align="center" valign="top">			<b>Schlafzimmerschrank
						</b></td>
						<td align="center" valign="top">			<b>Deckenleuchte
						</b></td>
						<td align="center" valign="top"><b>			Gerahmtes Bild</b>
						</td>
					</tr>
				</tbody>
			</table>
			<br />
			<p>
			stehen ab sofort zwecks Umzug zum Verkauf und da die gute Frau auch noch wahnsinnig ordungsliebend ist, sind die Klamotten dementsprechend super in Schuss :-). Die Handyfotos sind nicht gerade gut, aber immerhin.
			</p>
			<p>
			Bei Interesse lass' doch einfach einen Kommentar da, ich stelle dann den Kontakt her. Die Preise sind nat&uuml;rlich verhandlungssache, der Schrank liegt glaube ich so bei 200 Euro. 
			</p>
			 ]]></description>
		</item>
		<item>
			<title>Implementierung eines Singleton in C#</title>
			<link>http://www.josupeit.com/weblog~informatik-und-technik~dotnet,implementierung-des-singleton.html</link>
			<guid>http://www.josupeit.com/front_content.php?lang=1&amp;idart=23</guid>
			<pubDate>Wed, 21 Nov 2007 09:59:24 +0100</pubDate>
			<author>webmaster@josupeit.com (Manuel Josupeit-Walter)</author>
			<description><![CDATA[ <p>
			Es gibt Situationen, in denen man als Entwickler sicherstellen m&ouml;chte, dass von einer Klasse nur ein Objekt instanziiert werden kann. F&uuml;r diesen Anwendungsfalls gibt es bereits einen L&ouml;sungsansatz: Das Singleton-Pattern<a href="front_content.php?idart=23#fussnoten"><sup>1</sup></a>. Das Prinzip dieses Ansatzes ist recht simpel und beruht unter anderem auf der Nutzung statischer Felder und Methoden. Diese sogenannten statischen Member einer Klasse unterscheiden sich von den Instanzmembern in sofern, als dass sie genutzt werden k&ouml;nnen, ohne explizit ein Objekt zu instanziieren.
			</p>
			<p>
			Am Beispiel C# (Mircosoft .NET Framework 2.0) m&ouml;chte ich an dieser Stelle in zwei Schritten eine Art systemweiten Singleton implementieren, dieser Artikel befasst sich allerdings zun&auml;chst mit dem ersten Schritt: der Implementierung des herk&ouml;mmlichen Singleton. Die Erweiterung einer bestehenden Klasse zum Singleton funktioniert in C# wie folgt:
			</p>
			<br />
			<span class="code"><span class="schluesselwort">public class</span> <span class="objekt">Beispiel</span><br />
			{<br />
			&nbsp; <span class="kommentar">/*<br />
			&nbsp;&nbsp; * Dieses statische Feld h&auml;lt unsere Instanz der<br />
			&nbsp;&nbsp; * Klasse<br />
			&nbsp;&nbsp; */<br />
			</span>&nbsp; <span class="schluesselwort">private static</span> <span class="objekt">Beispiel</span> _Instanz;<br />
			&nbsp; <br />
			&nbsp; <span class="kommentar">/*<br />
			&nbsp;&nbsp; * Konstruktor der Klasse wird &uuml;ber den Zugriffsmodifizierer<br />
			&nbsp;&nbsp; * &quot;private&quot; gesch&uuml;tzt, um eine Instanziierung der Klasse von<br />
			&nbsp;&nbsp; * au&szlig;en zu unterbinden.<br />
			&nbsp;&nbsp; */<br />
			</span>&nbsp; <span class="schluesselwort">private</span> Beispiel()<br />
			&nbsp; {<br />
			&nbsp;&nbsp;&nbsp; <span class="kommentar">// TODO: Implementieren Sie Ihren Konstruktor hier<br />
			</span>&nbsp; }<br />
			&nbsp; <br />
			&nbsp;<span class="kommentar"> /*<br />
			&nbsp;&nbsp; * Statische Methode, die die Instanz der Klasse zur&uuml;ck gibt.<br />
			&nbsp;&nbsp; */<br />
			</span>&nbsp; <span class="schluesselwort">public static</span> <span class="objekt">Beispiel</span> GetInstance()<br />
			&nbsp; {<br />
			&nbsp;&nbsp; if (_Instanz == <span class="schluesselwort">null</span>)<br />
			&nbsp;&nbsp;&nbsp; _Instanz = <span class="schluesselwort">new</span> Beispiel();<br />
			<br />
			&nbsp;&nbsp; <span class="schluesselwort">return</span> _Instanz;<br />
			&nbsp; }<br />
			}<br />
			</span><br />
			<p>
			Anhand dieses Beispiels sehen Sie, dass nur eine Instanz der Klasse Beispiel erzeugt wird und zwar &uuml;ber die statische Methode <span class="inline_code">GetInstance()</span>:
			</p>
			<br />
			<span class="code"><span class="schluesselwort">public static void</span> main(<span class="schluesselwort">string</span>[] args)<br />
			{<br />
			&nbsp;<span class="objekt">Beispiel</span> BeispielInstanz = <span class="objekt">Beispiel</span>.GetInstance();<br />
			}<br />
			</span><br />
			<p>
			Der direkte Aufruf von <span class="inline_code">BeispielInstanz = new Beispiel()</span>; ist unzul&auml;ssig, da der Konstruktor der Klasse privat ist.
			</p>
			<p>
			Um auf einfachem Wege ihren Quelltext wiederverwenden zu k&ouml;nnen, lagern wir nun diesen Code in eine Bibliothek aus. Dieses Vorhaben allerdings erscheint nur auf den ersten Blick einfach: &uuml;ber Vererbung. Allerdings kann aus der Basisklasse nicht ohne Weiteres auf die abgeleitete Klasse zugegriffen werden, dies widerspr&auml;che auch dem Sinn von Vererbung, so dass folgendes Vorhaben <u><b>nicht</b></u> funktioniert:
			</p>
			<br />
			<span class="code"><span class="schluesselwort">public abstract class</span> <span class="objekt">Singleton</span><br />
			{<br />
			&nbsp; <span class="schluesselwort">private static </span><span class="objekt">Singleton</span> _Instanz;<br />
			&nbsp; <br />
			&nbsp; <span class="schluesselwort">private</span> Singleton()<br />
			&nbsp; {<br />
			&nbsp;&nbsp;&nbsp; <span class="kommentar">// TODO: Implementieren Sie Ihren Konstruktor hier</span><br />
			&nbsp; }<br />
			&nbsp; <br />
			&nbsp; <span class="schluesselwort">public static</span> <span class="objekt">Singleton</span> GetInstance()<br />
			&nbsp; {<br />
			&nbsp;&nbsp; if (_Instanz == <span class="schluesselwort">null</span>)<br />
			&nbsp;&nbsp;&nbsp;&nbsp; <span class="kommentar">// Hier m&uuml;sste die Kindklasse instanziiert werden</span><br />
			&nbsp;&nbsp;&nbsp; _Instanz = <span class="schluesselwort">new</span> ?();<br />
			<br />
			&nbsp;&nbsp; <span class="schluesselwort">return</span> _Instanz;<br />
			&nbsp; }<br />
			}<br />
			</span><br />
			<p>
			Abgesehen von diesem Problem kann eine abgeleitete Klasse so nicht instanziiert werden, da die Basisklasse durch die Verwendung des Schl&uuml;sselwortes <span class="inline_code">private</span> den Konstruktor sch&uuml;tzt, ein Zugriff auf diesen Konstruktor durch Reflektion &uuml;ber die Basisklasse ist allerdings auch nicht m&ouml;glich<a href="front_content.php?idart=23#fussnoten"><sup>2</sup></a>.
			</p>
			<p>
			Das Zauberwort an dieser Stelle lautet Generika<a href="front_content.php?idart=23#fussnoten"><sup>3</sup></a>, denn generische Klassen erlauben es dem Entwickler, Typdefinitionen f&uuml;r ganze Klassen oder Methoden offen zu lassen. Wir entwickeln unser Singleton-Pattern also weiter zu einer statischen Klasse, also einer Klasse, die selbst nicht instanziiert werden kann, die aber unsere Singleton-Objekte verwaltet. Diese Klasse soll den Namen <span class="inline_code">SingletonProvider </span>bekommen. Damit k&uuml;nftig einfach entschieden werden kann, ob es sich um eine neue Instanz handelt oder nicht, erweitern wir gleich unsere Methode <span class="inline_code">GetInstance()</span> um einen boolschen Wert:
			</p>
			<br />
			<span class="code"><span class="schluesselwort">using </span>System;<br />
			<span class="schluesselwort">using </span>System.Collections.Generic;<br />
			<span class="schluesselwort">using </span>System.Text;<br />
			<span class="schluesselwort">using </span>System.Collections;<br />
			<span class="schluesselwort">using </span>System.Reflection;<br />
			<br />
			<span class="schluesselwort">
			public static class</span> <span class="objekt">SingletonProvider</span><br />
			{<br />
			&nbsp; <span class="kommentar">/*<br />
			&nbsp;&nbsp; * Die Hashtabelle Selfs h&auml;lt unsere Instanz-<br />
			&nbsp;&nbsp; * objekte intern im Speicher.<br />
			&nbsp;&nbsp; */</span><br />
			&nbsp; <span class="schluesselwort">private static</span> <span class="objekt">Hashtable </span>Selfs = <span class="schluesselwort">new </span>Hashtable();<br />
			&nbsp; <br />
			&nbsp; <span class="kommentar">// Dieses Objekt wird zur Threadsynchronisation verwendet</span><br />
			&nbsp; <span class="schluesselwort">private static object</span> Lock&nbsp;&nbsp;&nbsp;&nbsp; = <span class="schluesselwort">new </span>Object();<br />
			<br />
			&nbsp; <span class="schluesselwort">public static</span> T GetInstance&lt;T&gt;(<span class="schluesselwort">out bool</span> New)<br />
			&nbsp;&nbsp;&nbsp; <span class="schluesselwort">where </span>T: <span class="schluesselwort">new</span>()<br />
			&nbsp; {<br />
			&nbsp;&nbsp;&nbsp; <span class="kommentar">// Threadsynchronisation</span><br />
			&nbsp;&nbsp;&nbsp; <span class="schluesselwort">lock </span>(Lock) {<br />
			&nbsp;&nbsp;&nbsp; &nbsp; <span class="kommentar">/*<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * &Uuml;berpr&uuml;fen, ob bereits eine Instanz<br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; * des generischen Typen T existiert.<br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; * Als Schl&uuml;ssel f&uuml;r die Hashtabelle verwenden<br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; * wir die GUID des Typen.<br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; */</span><br />
			&nbsp;&nbsp;&nbsp; &nbsp; <span class="schluesselwort">if </span>(Selfs.ContainsKey(<span class="schluesselwort">typeof</span>(T).GUID))<br />
			&nbsp;&nbsp;&nbsp; &nbsp; {<br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span class="kommentar">// Instanz existiert bereits</span><br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; New = <span class="schluesselwort">false</span>;<br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span class="schluesselwort">return </span>(T)Selfs[<span class="schluesselwort">typeof</span>(T).GUID];<br />
			&nbsp;&nbsp;&nbsp; &nbsp; }<br />
			<br />
			&nbsp;&nbsp;&nbsp; &nbsp; <span class="kommentar">// Neue Instanz erstellen</span><br />
			&nbsp;&nbsp;&nbsp; &nbsp; Selfs.Add(<span class="schluesselwort">typeof</span>(T).GUID, <span class="schluesselwort">new </span>T());<br />
			&nbsp;&nbsp;&nbsp; &nbsp; New = <span class="schluesselwort">true</span>;<br />
			&nbsp;&nbsp;&nbsp; &nbsp; <br />
			&nbsp;&nbsp;&nbsp; &nbsp; <span class="schluesselwort">return </span>(T)Selfs[<span class="schluesselwort">typeof</span>(T).GUID];<br />
			&nbsp;&nbsp;&nbsp; }<br />
			&nbsp; }<br />
			}<br />
			</span><br />
			<p>
			Durch diese Klasse k&ouml;nnen nun auf einfachem Wege Singleton-Objekte erzeugt werden:
			</p>
			<br />
			<span class="code"><span class="schluesselwort">public static void</span> main(<span class="schluesselwort">string</span>[] args)<br />
			{<br />
			&nbsp;<span class="schluesselwort">bool</span> neueInstanz;<br />
			&nbsp;<span class="objekt">Beispiel</span> MeinBeispiel = <span class="objekt">SingletonProvider</span>.GetInstance&lt;<span class="objekt">Beispiel</span>&gt;(<span class="schluesselwort">out</span> neueInstanz);<br />
			} <br />
			</span><br />
			<p>
			Die Variable MeinBeispiel enth&auml;lt nun eine neue Instanz der Klasse Beispiel, die Variable neueInstanz ist wahr, falls der SingletonProvider ein neues Objekt erzeugt hat. Der Typ Beispiel ist genau der &quot;L&uuml;ckenf&uuml;ller&quot; f&uuml;r unseren generischen Typen T im Beispiel oben. Einzige Bedingung: Es muss sich um eine Klasse handeln, die einen parameterlosen, &ouml;ffentlichen Konstruktor besitzt (siehe <span class="inline_code">where T: new()</span>). Dies allerdings widerspricht wiederum dem Singleton-Gedanken, denn nun kann wieder eine Instanz der Klasse von Au&szlig;en erzeugt werden: <span class="inline_code">MeinBeispiel = new Beispiel();</span> Der Singleton ist somit ausgehebelt.
			</p>
			<p>
			Wir modifizieren an dieser Stelle unseren SingletonProvider, so dass ausschlie&szlig;lich Klassen mit gesch&uuml;tzten Konstruktoren verwendet werden k&ouml;nnen. Au&szlig;erdem &uuml;berladen wir unsere GetInstance-Methode der Einfachheit halber wie folgt:
			</p>
			<br />
			<span class="code"><span class="schluesselwort">using </span>System;<br />
			<span class="schluesselwort">using </span>System.Collections.Generic;<br />
			<span class="schluesselwort">using </span>System.Text;<br />
			<span class="schluesselwort">using </span>System.Collections;<br />
			<span class="schluesselwort">using </span>System.Reflection;<br />
			<br />
			<span class="schluesselwort">public static class</span> <span class="objekt">SingletonProvider</span><br />
			{<br />
			&nbsp; <span class="schluesselwort">private static</span> <span class="objekt">Hashtable </span>Selfs = <span class="schluesselwort">new</span> Hashtable();<br />
			&nbsp; <span class="schluesselwort">private static object</span> Lock&nbsp;&nbsp;&nbsp;&nbsp; = <span class="schluesselwort">new </span>Object();<br />
			<br />
			&nbsp; <span class="schluesselwort">public static </span>T GetInstance&lt;T&gt;(<span class="schluesselwort">out bool</span> New)<br />
			&nbsp;&nbsp;&nbsp; <span class="schluesselwort">where</span> T: <span class="schluesselwort">class </span><span class="kommentar">// Jede Klasse ist erlaubt</span><br />
			&nbsp; {<br />
			&nbsp;&nbsp;&nbsp; <span class="kommentar">// Threadsynchronisation</span><br />
			&nbsp;&nbsp;&nbsp; <span class="schluesselwort">lock </span>(Lock) {<br />
			&nbsp;&nbsp;&nbsp; &nbsp; <span class="schluesselwort">if </span>(Selfs.ContainsKey(<span class="schluesselwort">typeof</span>(T).GUID))<br />
			&nbsp;&nbsp;&nbsp; &nbsp; {<br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span class="kommentar">// Instanz existiert bereits</span><br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; New = <span class="schluesselwort">false</span>;<br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span class="schluesselwort">return </span>(T)Selfs[<span class="schluesselwort">typeof</span>(T).GUID];<br />
			&nbsp;&nbsp;&nbsp; &nbsp; }<br />
			<br />
			&nbsp;&nbsp;&nbsp; &nbsp; <span class="kommentar">// Neue Instanz &uuml;ber Reflektion erstellen</span><br />
			&nbsp; &nbsp;&nbsp;&nbsp; <span class="objekt">ConstructorInfo </span>ctorInfo;<br />
			&nbsp;&nbsp;&nbsp; &nbsp; <br />
			&nbsp;&nbsp;&nbsp; &nbsp; <span class="kommentar">// Gesch&uuml;tzte Konstruktoren auslesen</span><br />
			&nbsp;&nbsp;&nbsp; &nbsp; ctorInfo = <span class="schluesselwort">typeof</span>(T).GetConstructor(<br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="objekt">BindingFlags</span>.NonPublic | <br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; <span class="objekt">BindingFlags</span>.Instance,<br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; <span class="schluesselwort">null</span>,<br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; <span class="objekt">Type</span>.EmptyTypes,<br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; <span class="schluesselwort">null</span><br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; );<br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
			&nbsp;&nbsp;&nbsp; &nbsp; <span class="kommentar">// Konstruktor ohne Parameter aufrufen</span><br />
			&nbsp;&nbsp;&nbsp; &nbsp; T _Instanz = (T)ctorInfo.Invoke(<span class="schluesselwort">new object</span>[] { });<br />
			&nbsp;&nbsp;&nbsp; &nbsp; <br />
			&nbsp;&nbsp;&nbsp; &nbsp; <span class="kommentar">// Instanz der Hashtabelle zuf&uuml;hren</span><br />
			&nbsp;&nbsp;&nbsp; &nbsp; Selfs.Add(<span class="schluesselwort">typeof</span>(T).GUID, _Instanz);<br />
			&nbsp;&nbsp;&nbsp; &nbsp; New = <span class="schluesselwort">true</span>;<br />
			&nbsp;&nbsp;&nbsp; &nbsp; <br />
			&nbsp;&nbsp;&nbsp; &nbsp; <span class="schluesselwort">return </span>(T)Selfs[<span class="schluesselwort">typeof</span>(T).GUID];<br />
			&nbsp;&nbsp;&nbsp; }<br />
			&nbsp; }<br />
			&nbsp; <br />
			&nbsp; <span class="kommentar">/*<br />
			&nbsp;&nbsp; * F&uuml;r den Fall, dass es egal ist,<br />
			&nbsp;&nbsp; * ob es sich um ein neues Objekt handelt<br />
			&nbsp;&nbsp; */</span><br />
			&nbsp; <span class="schluesselwort">public static</span> T GetInstance&lt;T&gt;()<br />
			&nbsp;&nbsp;&nbsp; <span class="schluesselwort">where </span>T: <span class="schluesselwort">class</span><br />
			&nbsp; {<br />
			&nbsp;&nbsp;&nbsp; <span class="schluesselwort">bool </span>_Trash;<br />
			&nbsp;&nbsp;&nbsp; <span class="schluesselwort">return </span>GetInstance&lt;T&gt;(<span class="schluesselwort">out </span>_Trash);<br />
			&nbsp; }<br />
			}<br />
			</span><br />
			<p>
			Nun wird der private parameterlose Konstruktor zur Instanziierung verwendet. Als n&auml;chstes verbieten wir ausdr&uuml;cklich &ouml;ffentliche Konstruktoren und schmei&szlig;en andernfalls einen Fehler:
			</p>
			<br />
			<span class="code"><span class="schluesselwort">using </span>System;<br />
			<span class="schluesselwort">using </span>System.Collections.Generic;<br />
			<span class="schluesselwort">using </span>System.Text;<br />
			<span class="schluesselwort">using </span>System.Collections;<br />
			<span class="schluesselwort">using </span>System.Reflection;<br />
			<br />
			<span class="schluesselwort">public static class</span> <span class="objekt">SingletonProvider</span><br />
			{<br />
			&nbsp; <span class="schluesselwort">private static</span> <span class="objekt">Hashtable </span>Selfs = <span class="schluesselwort">new </span>Hashtable();<br />
			&nbsp; <span class="schluesselwort">private static object</span> Lock&nbsp;&nbsp;&nbsp;&nbsp; = <span class="schluesselwort">new </span>Object();<br />
			<br />
			&nbsp; <span class="schluesselwort">public static</span> T GetInstance&lt;T&gt;(<span class="schluesselwort">out bool</span> New)<br />
			&nbsp;&nbsp;&nbsp; <span class="schluesselwort">where </span>T: <span class="schluesselwort">class </span><span class="kommentar">// Jede Klasse ist erlaubt</span><br />
			&nbsp; {<br />
			&nbsp;&nbsp;&nbsp; <span class="kommentar">// Auf &ouml;ffentlichen Konstruktor pr&uuml;fen</span><br />
			&nbsp;&nbsp;&nbsp; <span class="objekt">ConstructorInfo </span>checkCtor = (<span class="schluesselwort">typeof</span>(T)).GetConstructor(<span class="objekt">Type</span>.EmptyTypes);<br />
			&nbsp;&nbsp;&nbsp; <br />
			&nbsp;&nbsp;&nbsp; <span class="kommentar">/*<br />
			&nbsp;&nbsp;&nbsp; &nbsp;* Falls es einen solchen Konstruktor gibt,<br />
			&nbsp;&nbsp;&nbsp; &nbsp;* schmei&szlig;en wir einen Fehler, da es dem <br />
			&nbsp;&nbsp;&nbsp; &nbsp;* Charakter eines Singleton widerspricht.<br />
			&nbsp;&nbsp;&nbsp; &nbsp;*/</span><br />
			&nbsp;&nbsp;&nbsp; <span class="schluesselwort">if </span>(checkCtor != <span class="schluesselwort">null</span>)<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="schluesselwort">throw new</span> InvalidOperationException(<span class="zeichenfolge">&quot;Singleton means that you don't have any public constructors&quot;</span>);<br />
			<br />
			&nbsp;&nbsp;&nbsp; <span class="kommentar">// Threadsynchronisation</span><br />
			&nbsp;&nbsp;&nbsp; <span class="schluesselwort">lock </span>(Lock) {<br />
			&nbsp;&nbsp;&nbsp; &nbsp; <span class="schluesselwort">if </span>(Selfs.ContainsKey(<span class="schluesselwort">typeof</span>(T).GUID))<br />
			&nbsp;&nbsp;&nbsp; &nbsp; {<br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span class="kommentar">// Instanz existiert bereits</span><br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; New = <span class="schluesselwort">false</span>;<br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span class="schluesselwort">return </span>(T)Selfs[<span class="schluesselwort">typeof</span>(T).GUID];<br />
			&nbsp;&nbsp;&nbsp; &nbsp; }<br />
			<br />
			&nbsp;&nbsp;&nbsp; &nbsp; <span class="kommentar">// Neue Instanz &uuml;ber Reflektion erstellen</span><br />
			&nbsp; &nbsp;&nbsp;&nbsp; <span class="objekt">ConstructorInfo </span>ctorInfo;<br />
			&nbsp;&nbsp;&nbsp; &nbsp; <br />
			&nbsp;&nbsp;&nbsp; &nbsp; <span class="kommentar">// Gesch&uuml;tzte Konstruktoren auslesen</span><br />
			&nbsp;&nbsp;&nbsp; &nbsp; ctorInfo = <span class="schluesselwort">typeof</span>(T).GetConstructor(<br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="objekt">BindingFlags</span>.NonPublic | <br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; <span class="objekt">BindingFlags</span>.Instance,<br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; <span class="schluesselwort">null</span>,<br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; <span class="objekt">Type</span>.EmptyTypes,<br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; <span class="schluesselwort">null</span><br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; );<br />
			&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
			&nbsp;&nbsp;&nbsp; &nbsp; <span class="kommentar">// Konstruktor ohne Parameter aufrufen</span><br />
			&nbsp;&nbsp;&nbsp; &nbsp; T _Instanz = (T)ctorInfo.Invoke(<span class="schluesselwort">new object</span>[] { });<br />
			&nbsp;&nbsp;&nbsp; &nbsp; <br />
			&nbsp;&nbsp;&nbsp; &nbsp; <span class="kommentar">// Instanz der Hashtabelle zuf&uuml;hren</span><br />
			&nbsp;&nbsp;&nbsp; &nbsp; Selfs.Add(<span class="schluesselwort">typeof</span>(T).GUID, _Instanz);<br />
			&nbsp;&nbsp;&nbsp; &nbsp; New = <span class="schluesselwort">true</span>;<br />
			&nbsp;&nbsp;&nbsp; &nbsp; <br />
			&nbsp;&nbsp;&nbsp; &nbsp; <span class="schluesselwort">return </span>(T)Selfs[<span class="schluesselwort">typeof</span>(T).GUID];<br />
			&nbsp;&nbsp;&nbsp; }<br />
			&nbsp; }<br />
			&nbsp; <br />
			&nbsp; <span class="schluesselwort">public static</span> T GetInstance&lt;T&gt;()<br />
			&nbsp;&nbsp;&nbsp; <span class="schluesselwort">where </span>T: <span class="schluesselwort">class</span><br />
			&nbsp; {<br />
			&nbsp;&nbsp;&nbsp; <span class="schluesselwort">bool </span>_Trash;<br />
			&nbsp;&nbsp;&nbsp; <span class="schluesselwort">return </span>GetInstance&lt;T&gt;(<span class="schluesselwort">out </span>_Trash);<br />
			&nbsp; }<br />
			}<br />
			</span><br />
			<p>
			Mit Hilfe der obigen Implementierung der SingletonProvider-Klasse lassen sich nun beliebige Singleton-Objekte verwalten:
			</p>
			<br />
			<span class="code"><span class="schluesselwort">public class</span> <span class="objekt">Beispiel</span><br />
			{<br />
			<br />
			<span class="schluesselwort">&nbsp;private </span>Beispiel()<br />
			&nbsp;{<br />
			&nbsp; <span class="objekt">Console</span>.WriteLine(<span class="zeichenfolge">&quot;Klasse instanziiert&quot;</span>);<br />
			&nbsp;}<br />
			&nbsp;<br />
			&nbsp;<span class="schluesselwort">public static void</span> main(<span class="schluesselwort">string</span>[] args)<br />
			&nbsp;{<br />
			&nbsp; <span class="objekt">Beispiel </span>MeinBeispiel&nbsp; = <span class="objekt">SingletonProvider</span>&lt;<span class="objekt">Beispiel</span>&gt;.GetInstance();<br />
			&nbsp; <span class="objekt">Beispiel </span>MeinBeispiel2 = <span class="objekt">SingletonProvider</span>&lt;<span class="objekt">Beispiel</span>&gt;.GetInstance();<br />
			&nbsp;}<br />
			}<br />
			</span><br />
			<p>
			Dieses Beispiel erzeugt auf der Konsole einmalig die Ausgabe &quot;Klasse instanziiert&quot;, da der erste Aufruf von <span class="inline_code">GetInstance()</span> eine Instanz erzeugt. Der zweite Aufruf hingegen liefert ganz im Sinne des Singleton das selbe Objekt. Eine Instanz von Au&szlig;en &uuml;ber <span class="inline_code">MeinBeispiel = new Beispiel();</span> ist durch den gesch&uuml;tzten Konstruktor &uuml;brigens nicht mehr m&ouml;glich.
			</p>
			<p>
			M&ouml;chte man nun eine Klasse schreiben, um andere Klassen von dieser &quot;Singleton-Basis&quot; erben zu lassen, bedienen wir uns der oben bereits implementierten Klasse SingletonProvider, der Singleton selbst soll hier allerdings nicht instanziiert werden und ist deshalb abstrakt:
			</p>
			<br />
			<span class="code"><span class="schluesselwort">public abstract class</span> <span class="objekt">SingletonBase</span>&lt;T&gt;<br />
			&nbsp; <span class="schluesselwort">where </span>T: <span class="objekt">SingletonBase</span>&lt;T&gt;<br />
			{<br />
			&nbsp; <span class="schluesselwort">public static</span> T GetInstance(<span class="schluesselwort">out bool</span> New)<br />
			&nbsp; {<br />
			&nbsp;&nbsp;&nbsp; <span class="schluesselwort">return </span><span class="objekt">SingletonProvider</span>.GetInstance&lt;T&gt;(<span class="schluesselwort">out </span>New);<br />
			&nbsp; }<br />
			&nbsp; <br />
			&nbsp; <span class="schluesselwort">public static</span> T GetInstance()<br />
			&nbsp; {<br />
			&nbsp;&nbsp;&nbsp; <span class="schluesselwort">bool </span>_Trash;<br />
			&nbsp;&nbsp;&nbsp; <span class="schluesselwort">return </span>GetInstance(<span class="schluesselwort">out </span>_Trash);<br />
			&nbsp; }<br />
			}<br />
			</span><br />
			<p>
			Da, wie oben bereits gesagt, die Elternklasse allerdings nicht auf die Kindklasse schlie&szlig;en kann, werwenden wir f&uuml;r die Anweisung <span class="inline_code">where T: SingletonBase&lt;T&gt;</span>, um den Typen zu &quot;ermitteln&quot;. Dies ist zwar in gewisser Hinsicht eine Redundanz, da eigentlich bereits durch die Vererbung klar ist, dass eine Instanz von &quot;Beispiel&quot; erzeugt werden soll, leider gibt es meiner Ansicht nach aber derzeit keine wesentlich elegantere L&ouml;sung dieses Problems. Das .NET Framework 3.5 l&auml;sst allerdings bereits heute auf sch&ouml;nere Ans&auml;tze hoffen...
			</p>
			<br />
			<span class="code"><span class="schluesselwort">public sealed class</span> <span class="objekt">Beispiel </span>: <span class="objekt">SingletonBase</span>&lt;<span class="objekt">Beispiel</span>&gt;<br />
			{<br />
			&nbsp;&nbsp;&nbsp; <span class="schluesselwort">private </span>Beispiel()<br />
			&nbsp;&nbsp;&nbsp; {<br />
			&nbsp;&nbsp;&nbsp; &nbsp;<span class="kommentar">// Konstruktor</span><br />
			&nbsp;&nbsp;&nbsp; }<br />
			}<br />
			</span><br />
			<p>
			Instanzen der Klasse k&ouml;nnen nun einfach via <span class="inline_code">Beispiel.GetInstance()</span> geholt werden, eine eigene Instanziierung durch Verwendung des Schl&uuml;sselwortes <span class="inline_code">new()</span> ist nicht mehr m&ouml;glich. Ein Haken allerdings bleibt: Die Klasse sollte versiegelt sein, so dass von ihr nicht weiter geerbt werden kann, denn
			</p>
			<br />
			<span class="code"><span class="schluesselwort">class </span><span class="objekt">GeerbtesBeispiel </span>: <span class="objekt">Beispiel</span><br />
			{ }<br />
			</span><br />
			<p>
			bietet nun auch die statische Methode <span class="inline_code">GetInstance()</span>, die allerdings nach wie vor die Basisklasse Beispiel instanziiert, nicht jedoch GeerbtesBeispiel.&nbsp;
			</p>
			<p>
			Damit nun dieser Artikel nicht noch l&auml;nger wird, als er bisher schon ist, m&ouml;chte ich dieses Beispiel beim n&auml;chsten Mal zu einem systemweiten Singleton ausbauen. Mit Hilfe dieser Methode l&auml;sst sich beispielsweise einfach realisieren, dass eine Anwendung nur einmal gestartet werden kann und jeder weitere Programmstart das bereits ge&ouml;ffnete Fenster in den Vordergrund holt. Dazu allerdings erst beim n&auml;chsten Mal mehr.
			</p>
			<p>
			Abschlie&szlig;end bleibt mir eigentlich nur noch zu sagen, dass es sich bei diesem Artikel lediglich um ein Beispiel einer M&ouml;glichkeit der Umsetzung handelt. Es gibt noch unz&auml;hlige weitere Implementierungen des Singleton, sehen Sie es also als eine Art Inspiration f&uuml;r Ihre Projekte, ich hoffe ich konnte Ihnen jedoch ein wenig bei der L&ouml;sung Ihres Problemes weiterhelfen.
			</p>
			<hr />
			<p>
			<a title="fussnoten" name="fussnoten" id="fussnoten"></a>
			</p>
			<div style="float: right">
			<a href="front_content.php?idart=37&amp;idcat=4&amp;lang=1&amp;client=1"><img src="upload/grafiken/gplv3-88x31.gif" alt="GPLv3" border="0" /></a>
			</div>
			<sup>1</sup> <a href="http://de.wikipedia.org/wiki/Singleton_%28Entwurfsmuster%29" target="_blank">Singleton (Entwurfsmuster): Wikipedia
			</a><br />
			<sup>2</sup> <a href="http://msdn2.microsoft.com/de-de/library/cs01xzbk%28VS.80%29.aspx#remarksToggle" target="_blank">Type.GetConstructor-Methode: Microsoft</a><br />
			<sup>3</sup> <a href="http://de.wikipedia.org/wiki/Generischer_Typ" target="_blank">Generische Typen: Wikipedia</a>
			<p>
			&nbsp;
			</p>
			<br />
			<p>
			<b>Siehe auch:</b><br />
			<a href="http://de.wikipedia.org/wiki/Sprachelemente_von_C-Sharp" target="_blank">Sprachelemente von C-Sharp (Wikipedia)</a>
			</p>
			 ]]></description>
		</item>
		<item>
			<title>Männer sind primitiv, aber glücklich</title>
			<link>http://www.josupeit.com/weblog~privat,mario-barth-maenner-sind-primitiv-aber-gluecklich.html</link>
			<guid>http://www.josupeit.com/front_content.php?lang=1&amp;idart=21</guid>
			<pubDate>Mon, 12 Nov 2007 16:17:55 +0100</pubDate>
			<author>webmaster@josupeit.com (Manuel Josupeit-Walter)</author>
			<description><![CDATA[ <p>
			Die Antwort auf die Frage, wieso Frauen nicht zugeben k&ouml;nnen, wenn Sie Deinen Hammer genommen haben, kann Mario in seinem aktuellen Programm &quot;M&auml;nner sind primitiv, aber gl&uuml;cklich&quot; auch nicht beantworten. Wohl aber zeigt er auf seine - wie immer - urkomische Berliner Art und Weise, wie man seine Freundin mit Flaschendrehen in den Wahnsinn treibt und animiert das Publikum dazu, Frau M&uuml;ller zum Diktat zu rufen.
			</p>
			<p>
			Diesen Samstag waren Gina und ich zum ersten Mal zu Gast bei einer von Marios Live-Shows in Oberhausen. Nachdem ich zu meinem letzten Geburtstag die DVD des vorigen Programmes &quot;M&auml;nner sind Schweine, Frauen aber auch&quot; geschenkt bekommen habe, stand der Entschluss bereits fest: Beim n&auml;chsten Mal bin ich dabei! Leider dachten das offensichtlich auch ein paar tausend andere Menschen, so dass die n&auml;chste Show, die nicht ausverkauft <b>und zugleich</b> in der N&auml;he war, leider fast ein Jahr auf sich warten lie&szlig;. Aber das Warten hat sich wirklich gelohnt: Die H&uuml;tte war brechend voll und es hat mordsm&auml;&szlig;ig viel Spa&szlig; gemacht. Ich kann jedem empfehlen, selbst live dabei zu sein. Allerdings solltet ihr fr&uuml;h buchen, denn es ist nicht leicht sich &uuml;ber einen so langen Zeitraum aller Gags zu entziehen: Ich durfte fast ein Jahr die CD nicht h&ouml;ren und habe jeden meiner Freunde abgew&uuml;rgt, der begonnen habt, mir die Witze schon vorher zu erz&auml;hlen. Vielen Dank jedenfalls, dass es zumindest einigerma&szlig;en geklappt hat...
			</p>
			<p>
			Zum Schluss noch zwei Dinge: Bitte schenkt mir weder zu Geburtstag noch Weihnachten die aktuelle DVD, die hab ich mir n&auml;mlich direkt im Anschluss an die Show am Fanshop gekauft und zweitens: Menne, wenn Deine Freundin keinen Ostdeutschen Dialekt hat... Harr harr harr... Viel Spa&szlig;! 
			</p>
			 ]]></description>
		</item>
		<item>
			<title>min-height im Internet Explorer</title>
			<link>http://www.josupeit.com/weblog~informatik-und-technik~web,min-height-im-internet-explorer.html</link>
			<guid>http://www.josupeit.com/front_content.php?lang=1&amp;idart=20</guid>
			<pubDate>Fri, 26 Oct 2007 14:56:31 +0200</pubDate>
			<author>webmaster@josupeit.com (Manuel Josupeit-Walter)</author>
			<description><![CDATA[ <p>
			Dass ich den Internet Explorer, zumindest in Versionen vor 7 nicht mag, ist f&uuml;r meine Arbeitskollegen kein Geheimnis und wenn man betrachtet, wie wenig sich Microsoft bei der Entwicklung dieses Browsers an geltende Standards vom <a href="http://www.w3c.org" target="_blank">W3C</a> h&auml;lt, ist dies sicherlich auch kein Wunder. An dieser Stelle aufzuz&auml;hlen sind beispielsweise der 3-Pixel Fehler, die pr&auml;gnante Miturheberschaft am Quirks-Mode oder die fehlerhafte Berechnung von Element-Dimensionen in Zusammenhang mit Innenabst&auml;nden, von nicht implementierten CSS Attributen, wie min-width oder min-height einmal ganz abgesehen.
			</p>
			<p>
			Im Job ist es teils eine wahre Qual, als letzten Schritt in der Umsetzung einer Webseite mit CSS Hacks (die das Stylesheet nat&uuml;rlich nicht valide machen) oder Conditional Comments das Layout den Fehlern des Internet Explorers anzupassen. F&uuml;r alle Leidensgenossen m&ouml;chte ich an dieser Stelle k&uuml;nftig Tipps und Kniffe beschreiben, die einem das Leben hinsichtlich dieser und anderer Probleme hoffentlich ein wenig leichter machen.
			</p>
			<p>
			Das CSS-Attribut &quot;<span class="inline_code">min-height</span>&quot; beispielsweise wird vom IE leider nicht unterst&uuml;tzt, kann allerdings simuliert werden, m&ouml;chte man auf oben angef&uuml;hrte CSS-Hacks oder Conditional Comments verzichten. Dies funktioniert auf einfachem Wege durch folgende Angaben im Stylesheet:
			</p>
			<p>
			<span class="code">
			height: auto !important; <span class="kommentar">/* Wird von modernen Browsern interpretiert */</span><br />
			height: 100%;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="kommentar">/* F&uuml;r den IE: wie min-height */</span><br />
			min-height: 100%;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="kommentar">/* min-height f&uuml;r alle anderen Browser */</span></span>
			</p>
			<p>
			Diese Zeilen funktionieren durch eine fehlerhafte Interpretation der Angabe <span class="inline_code">!important</span>, die validen Browsern mitteilt, dass die Angabe &quot;<span class="inline_code">auto</span>&quot; bez&uuml;glich der Element-H&ouml;he des Wertes &quot;<span class="inline_code">100%</span>&quot; vorgezogen wird, sprich, das Element soll bei &uuml;bergro&szlig;em Inhalt automatisch wachsen. Obwohl das Attribut <span class="inline_code">height</span> im eigentlichen Sinne eine H&ouml;he festlegt, l&auml;sst der IE dennoch eine dynamische Vergr&ouml;&szlig;erung des Bereiches zu, sollte der Inhalt wachsen. <span class="inline_code">height</span> wird demnach vom Internet Explorer generell als <span class="inline_code">min-height</span> interpretiert. In diesem Sinne existiert die Angabe <span class="inline_code">min-height</span> sowieso nur f&uuml;r Browser, die CSS zumindest in dieser Hinsicht valide interpretieren, die Angabe <span class="inline_code">height: auto !important</span> setzt nur die 100%-ige H&ouml;henangabe ausser Kraft.
			</p>
			<p>
			An dieser Stelle sei generell noch einmal auf <a href="http://de.selfhtml.org" target="_blank">SelfHTML</a> hingewiesen, denn dort lassen sich viele Attribute nachschlagen. Informationen bez&uuml;glich Conditional Comments und CSS-Hacks werden dort auch sehr gut erkl&auml;rt. 
			</p>
			 ]]></description>
		</item>
		<item>
			<title>Bundestrojaner und Vorratsdatenspeicherung</title>
			<link>http://www.josupeit.com/weblog~informatik-und-technik,bundestrojaner-und-vorratsdatenspeicherung.html</link>
			<guid>http://www.josupeit.com/front_content.php?lang=1&amp;idart=18</guid>
			<pubDate>Wed, 24 Oct 2007 22:09:02 +0200</pubDate>
			<author>webmaster@josupeit.com (Manuel Josupeit-Walter)</author>
			<description><![CDATA[ <p>
			An jeder Ecke h&ouml;rt und liest man momentan vom Bundestrojaner: einem trojanischen Pferd, einer Art Computervirus, der dem Staat unterst&uuml;tzend zur Seite stehen soll, wenn es darum geht PCs verd&auml;chtiger B&uuml;rger genauer unter die Lupe zu nehmen. Wer oder was so alles &quot;verd&auml;chtig&quot; ist und den leichtfertigen Einsatz eines solchen Trojaners rechtfertigt, wage ich an dieser Stelle allerdings nicht zu beurteilen.
			</p>
			<p>
			So langsam habe ich mich mit dem Thema Bundestrojaner abgefunden, Firewalls auf Lecks gecheckt, Festplatte verschl&uuml;sselt, automatische Updates ausgestellt (<a href="http://blog.markus-pachali.de/2007/09/14/kommt-der-bundestrojaner-uebers-windows-update/" target="_blank">kommt der Bundestrojaner etwa &uuml;ber Updates?</a>), Windows gel&ouml;scht und Linux installiert und zu guter Letzt den Weg zur Netzwerkdose schon einmal frei ger&auml;umt und den Plastikn&uuml;ppel am Stecker abgebrochen, um im Fall aller F&auml;lle auch aus Distanz das Kabel aus der Dose zupfen zu k&ouml;nnen und schon diskutiert man &uuml;ber das n&auml;chste Thema: <a href="http://kaffeeringe.de/module-article-viewpub-tid-9-pid-335.html" target="_blank">Vorratsdatenspeicherung</a>.
			</p>
			<p>
			Offenbar ist geplant, zum Jahreswelchsel 2007/08 generell einmal von jedermann die Telefonverbindungen bis zu sechs Monate lang zu speichern; auch SMS sollen dann protokolliert werden und zwar nicht blo&szlig; mit Empf&auml;nger und Zeitstempel, sondern auch mit geographischem Standort zum Zeitpunkt des Versands. Im Klartext hei&szlig;t das: selbst der Ort von dem aus ich am Montag um 12:39 Uhr eine SMS an meine heimliche Geliebte schicke wird gespeichert, selbst, wenn es das stille &Ouml;rtchen ist. Die Frage, die sich nun durchaus stellen l&auml;sst ist: Ab wann empfinde ich das alles als zu gro&szlig;en Einschnitt in meine Freiheit? Werde ich bei meiner Shopping-Tour durch die Innenstadt meiner Wahl nicht bereits oft genug gefilmt? Reicht es nicht, dass man angeblich via Satellit die Schlagzeilen einer Zeitung lesen kann, die ich gerade an einem herrlichen Sommertag im Park lese? Stimmt all das &uuml;berhaupt?
			</p>
			<p>
			Ich denke, ich werde in die USA auswandern, da wird so etwas wie der Mensch doch noch gesch&auml;tzt, oder?&nbsp;
			</p>
			 ]]></description>
		</item>
		<item>
			<title>Amsterdam 2007</title>
			<link>http://www.josupeit.com/weblog~privat,amsterdam-2007.html</link>
			<guid>http://www.josupeit.com/front_content.php?lang=1&amp;idart=16</guid>
			<pubDate>Fri, 19 Oct 2007 21:18:43 +0200</pubDate>
			<author>webmaster@josupeit.com (Manuel Josupeit-Walter)</author>
			<description><![CDATA[ <p>
			Nachgelegt: Nachdem sich der Ein oder Andere bereits &uuml;ber mein Gesicht auf einigen der Terschellinger Bilder am&uuml;siert hat, kommen jetzt direkt ein paar Bilder aus Amsterdam hinterher. In diesem Sinne: <a href="front_content.php?idart=15&amp;idcat=6&amp;lang=1&amp;client=1">hier</a> gibt's neues Futter! 
			</p>
			 ]]></description>
		</item>
		<item>
			<title>Terschelling 2007 - Eindrücke</title>
			<link>http://www.josupeit.com/weblog~privat,terschelling-2007.html</link>
			<guid>http://www.josupeit.com/front_content.php?lang=1&amp;idart=8</guid>
			<pubDate>Tue, 16 Oct 2007 19:38:35 +0200</pubDate>
			<author>webmaster@josupeit.com (Manuel Josupeit-Walter)</author>
			<description><![CDATA[ <p>
			Theoretisch kommt es ein bischen sp&auml;t, praktisch ist ja auch diese Webseite erst gestern online gegangen. In diesem Sinne: Besser sp&auml;t als nie gibt es seit eben <a href="front_content.php?idart=7&amp;idcat=6&amp;lang=1&amp;client=1">Fotos aus meinem Sommerurlaub auf Terschelling</a> zu sehen!
			</p>
			<p>
			Bei 18&deg;C war das Wasser zwar kalt, aber: Was ist schon ein Sommerurlaub ohne im Meer schwimmen zu gehen? Brrrrr. :-)
			</p>
			 ]]></description>
		</item>
		<item>
			<title>Application.Run(new Weblog());</title>
			<link>http://www.josupeit.com/weblog~privat,weblog-endlich-online.html</link>
			<guid>http://www.josupeit.com/front_content.php?lang=1&amp;idart=2</guid>
			<pubDate>Mon, 15 Oct 2007 19:20:17 +0200</pubDate>
			<author>webmaster@josupeit.com (Manuel Josupeit-Walter)</author>
			<description><![CDATA[ <p>
			Lange hat's gedauert, doch heute ist es soweit: Ich darf euch alle auf meinem neuen Blog willkommen hei&szlig;en. K&uuml;nftig wird an dieser Stelle jeder bel&auml;stigt, der freiwillig hier vorbeischneit mit netten Anekdoten und dem Leidensweg aus dem Leben eines Homo Informaticus. In diesem Sinne w&uuml;nsche ich allen viel Spa&szlig;.
			</p>
			<p>
			Manuel&nbsp;
			</p>
			 ]]></description>
		</item>
	</channel>
</rss>