<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>nospace</title>
	<atom:link href="http://nospace.de/feed" rel="self" type="application/rss+xml" />
	<link>http://nospace.de</link>
	<description>Programming in HD</description>
	<lastBuildDate>Sat, 25 Sep 2010 08:18:41 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Verdammt</title>
		<link>http://nospace.de/verdammt/115</link>
		<comments>http://nospace.de/verdammt/115#comments</comments>
		<pubDate>Tue, 21 Sep 2010 03:22:47 +0000</pubDate>
		<dc:creator>Tobias</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[JS]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://nospace.de/verdammt/115</guid>
		<description><![CDATA[Liebes Tagebuch, heute ist der 21. Tag hier in der Apokalyptischen Nekrose. Ich erinnere mich nicht an vieles von früher, aber ich glaube das ist die längste Zeit, die ich bis jetzt am Leben war. Die Heerscharen vor den Toren werden immer größer und ich weiß nicht, wie lange wir sie noch aufhalten können. Dank [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>Liebes Tagebuch,</p>
<p align="left">heute ist der 21. Tag hier in der Apokalyptischen Nekrose. Ich erinnere mich nicht an vieles von früher, aber ich glaube das ist die längste Zeit, die ich bis jetzt am Leben war. Die Heerscharen vor den Toren werden immer größer und ich weiß nicht, wie lange wir sie noch aufhalten können. Dank Grolnar haben wir die letzte Nacht gerade so überlebt. Er meinte, dass wir noch schnell ein paar Notfallkonstruktionen errichten und dass die Verbesserungen an unseren Wassergeschütztürmen sie stoppen können. Das hat uns wohl den nochmal den Arsch gerettet. Keiner der geschätzten 2800 Untoten hat unsere Verteidigung überwinden können, obwohl es kurzzeitig echt knapp aussah. </p>
<p align="left">Ich frage mich die ganze Zeit, wo die nur immer herkommen und woher sie wissen, wo wir sind. Besonders helle scheinen sie nicht zu sein. Wir haben uns auch bemüht tagsüber Ihre Reihen zu lichten. Ich habe eine alte AEG-Waschmaschine in der Wüste gefunden und sie zum Wurfgeschoss umfunktioniert. Ich bin so stolz auf mich, denn ich habe ganze acht dieser widerlichen Kreaturen damit umbringen können. “Umbringen” wirkt dabei echt ironisch: Ich glaube ja nicht, dass die wirklich leben. Jedenfalls hoffe ich, dass unsere Streifzüge so erfolgreich bleiben und ihre Anzahl nicht weiter steigt, sonst haben wir bald keine Chance mehr.</p>
</blockquote>
<p> <span id="more-115"></span>
<p align="justify">So, oder so ähnlich muss man sich fühlen, wenn das Browserspiel, das ich derzeit spiele, Realität wäre. Das Spiel heißt <a href="http://www.dieverdammten.de?ref=tobster" target="_blank">Die Verdammten</a>, was dem Ungläubigen den Titel dieses Eintrages erklären sollte. Es stammt von dem Hersteller <a href="http://www.motion-twin.com/german" target="_blank">Motion-Twin</a>, der für außergewöhnliche Spielkonzepte bekannt ist.</p>
<p align="justify"><a href="http://nospace.de/wp-content/uploads/2010/09/dieverdammten.jpg" rel="lightbox[115]"><img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="Die Verdammten - Login" border="0" alt="Die Verdammten - Login" src="http://nospace.de/wp-content/uploads/2010/09/dieverdammten_thumb.jpg" width="324" height="194" /></a> </p>
<p align="justify">OK, ein weiteres Browserspiel unter Vielen wird der Eine oder Andere jetzt sagen, aber weit gefehlt: Dieses Spiel ist nicht wie jedes x-beliebige Andere. Hier ist Kooperation gefragt. So befindet man sich mit 39 Weiteren Spielern in einer Stadt innerhalb einer postapokalyptischen und lebensfeindlichen Umwelt, die weigehend von Zombies bevölkert wird. Diese gilt es Tag für Tag, besser gesagt Nacht für Nacht abzuwehren. Denn zu jeder Mitternachtsstunde erfolgt der Angriff der Horden.</p>
<p align="justify">Um den Kooperationscharakter zu forcieren, stehen dem einzelnen Spieler pro Tag nur eine sehr begrenzte Anzahl von Aktionspunkten zur Verfügung (6 pro Person). Mit diesen muss man durch Expeditionen in der Wüste Gegenstände finden, die einem helfen, die Stadtverteidigung zu erhöhen oder es einfach erlauben die Stadt auszubauen, wofür wiederum Aktionspunkte investiert werden müssen. Zusammenhalt ist dabei wichtig, damit alle an einem Strang ziehen um die teilweise absurd wirkenden Projekte, die über 500 dieser Aktionspunkte benötigen errichten zu können.</p>
<p align="justify"><a href="http://nospace.de/wp-content/uploads/2010/09/dieverdammten_ingame.jpg" rel="lightbox[115]"><img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="Die Verdammten - Stadtansicht" border="0" alt="Die Verdammten - Stadtansicht" src="http://nospace.de/wp-content/uploads/2010/09/dieverdammten_ingame_thumb.jpg" width="324" height="194" /></a> </p>
<p align="justify">Die am Anfang überwältigenden Möglichkeiten, die dieses Spiel bietet, kann man zunächst gar nicht überblicken. Zudem lässt sich Vieles auch nur nach und nach entdecken, was nicht zuletzt dem begrenzten Handlungsspielraum durch die wenigen Aktionspunkte pro Person geschuldet ist. Diese lassen sich aber mit entsprechenden Utensilien, wie Nahrung und Wasser wiederherstellen. Dieses sollte man mindestens alle zwei Tage zu sich nehmen, um nicht zu dehydrieren. Dabei stehen aber der Gemeinschaft nur eine begrenzte Anzahl an Wasserrationen in einem Brunnen zur Verfügung. Weitere Aktionspunktelieferanten sind Drogen oder Alkohol, wobei man von Ersteren abhängig werden kann und Letztere einen Kater verursachen, welcher es verhindert, dass man am nächsten Tag wieder Alkohol zu sich nehmen kann. Auch dieses Maß an Realismus macht dieses Spiel echt faszinierend.</p>
<p align="justify">Zum Koordinieren der gemeinschaftlichen Aktionen stehen dabei Foren zur Verfügung. Hier kann und muss diskutiert werden, wie die jedes Mal meist zufällig zusammengewürfelte Gruppe das Überleben so lange wie möglich sichern kann.</p>
<p align="justify"><a href="http://nospace.de/wp-content/uploads/2010/09/dieverdammten_foren.jpg" rel="lightbox[115]"><img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="Die Verdammten - Foren" border="0" alt="Die Verdammten - Foren" src="http://nospace.de/wp-content/uploads/2010/09/dieverdammten_foren_thumb.jpg" width="324" height="194" /></a> </p>
<p align="justify">Soweit zum kostenlosen Umfang des Spieles. Natürlich möchte der Hersteller auch Geld verdienen. Hierfür gibt es die Helden. Für einen bestimmten Betrag kann man sich eine Handvoll Heldentage kaufen. Helden haben zu den bereits umfangreichen Funktionen des Spiels noch weitere Fähigkeiten. So gibt es verschiedene Berufe, die ein Held ausübt. So kann ein Aufklärer von den Untoten unbemerkt die Wüste durchkämmen, ein Buddler besser Gegenstände im Wüstensand ausfindig machen und ein Wächter sich und seine Mitmenschen gegen mehr Zombies verteidigen. Zudem wachsen die Fähigkeiten eines Helden noch mit der Anzahl der gespielten Heldentage.</p>
<p align="justify">Jedoch früher oder später müssen alle sterben. Aber Sterben gehört zum Spiel dazu. Mit der eigenen unsterblichen Seele ist die Reinkarnation in einer neuen Stadt sicher.</p>
<p align="justify">Warum schreibe ich hier diesen artfremden Eintrag? Nun, ich habe in den letzen Monaten eine externe Anwendung basierend auf PHP/MySQL und JavaScript/AJAX geschrieben, die mittlerweile die meisten der Verdammten bei Ihrem täglichen Überlebenskampf unterstützt. Es handelt sich um <a href="http://dvmap.nospace.de" target="_blank">Die verdammte Karte</a>, die hier auf einer Subdomäne bereitgestellt ist. Um sie allerdings betrachten und nutzen zu können, benötigt man ein Konto im Spiel. Und warum man sich mal anmelden sollte, habe ich versucht darzustellen.</p>
<p align="justify"><a href="http://nospace.de/wp-content/uploads/2010/09/dvkarte_shot.jpg" rel="lightbox[115]"><img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="Die verdammte Karte - Screenshot" border="0" alt="Die verdammte Karte - Screenshot" src="http://nospace.de/wp-content/uploads/2010/09/dvkarte_shot_thumb.jpg" width="324" height="195" /></a></p>
<p>Direkt zum Spiel kann man mit der folgenden Bildverknüpfung gelangen:</p>
<p><a href="http://www.dieverdammten.de?ref=tobster"><img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" alt="" src="http://data.dieverdammten.de/gfx/loc/de/88x31.gif" /> </a></p>
<div class="al2fb_like_button"><div id="fb-root"></div><script src="http://connect.facebook.net/de_DE/all.js#appId=298028736874081&amp;xfbml=1" type="text/javascript"></script>
<fb:like href="http://nospace.de/verdammt/115" layout="standard" show_faces="true" width="450" action="like" font="arial" colorscheme="light" ref="AL2FB"></fb:like></div>]]></content:encoded>
			<wfw:commentRss>http://nospace.de/verdammt/115/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Visual Studio &#8211; Quelltext in Subversion einstellen</title>
		<link>http://nospace.de/visual-studio-quelltext-in-subversion-einstellen/95</link>
		<comments>http://nospace.de/visual-studio-quelltext-in-subversion-einstellen/95#comments</comments>
		<pubDate>Sat, 03 Apr 2010 17:39:15 +0000</pubDate>
		<dc:creator>Tobias</dc:creator>
				<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[OpenSource]]></category>
		<category><![CDATA[Subversion]]></category>
		<category><![CDATA[SVN]]></category>
		<category><![CDATA[Visual Studio]]></category>

		<guid isPermaLink="false">http://preview.nospace.de/visual-studio-quelltext-in-subversion-einstellen/95</guid>
		<description><![CDATA[Eine Versionsverwaltung ist eine feine Sache, wenn man ein Projekt mit einem Team realisiert. Eine sinnvolle Anwendung ist auch, seinen Quellcode im Sinne des Allgemeinwohles der OpenSource-Gemeinde zur Verfügung zu stellen. Hier setzt auch der Service der Webseite SourceForge an. Diese bietet kostenlos Speicherplatz und Verwaltungsdienste für OpenSource-Projekte an. Zunächst benötigt man natürlich ein entsprechendes [...]]]></description>
			<content:encoded><![CDATA[<p align="justify">Eine Versionsverwaltung ist eine feine Sache, wenn man ein Projekt mit einem Team realisiert. Eine sinnvolle Anwendung ist auch, seinen Quellcode im Sinne des Allgemeinwohles der OpenSource-Gemeinde zur Verfügung zu stellen. Hier setzt auch der Service der Webseite <a href="http://sourceforge.net" target="_blank">SourceForge</a> an. Diese bietet kostenlos Speicherplatz und Verwaltungsdienste für OpenSource-Projekte an.</p>
<p> <span id="more-95"></span>
<p align="justify">Zunächst benötigt man natürlich ein entsprechendes Werkzeug, um die Verbindung mit dem SVN-Server herzustellen und seine Quelltexte zu verwalten. Auf Dateiebene bietet sich für Windows das frei verfügbare Programm <a href="http://tortoisesvn.net/" target="_blank">TortoiseSVN</a> an. Dieses integriert sich in das Kontextmenü des Windows Explorers. Dies sei aber nur als weitere Information genannt.</p>
<p align="justify">Aber auch direkt für Visual Studio gibt es ein feines Programm, das sich perfekt in die Oberfläche integriert und ebenfalls kostenlos erhältlich ist. Auf der <a href="http://ankhsvn.open.collab.net/" target="_blank">Homepage von Collabnet</a> findet man <a href="http://ankhsvn.net/downloads/" target="_blank">AnkhSVN</a>. </p>
<p align="justify">Zunächst muss man dieses natürlich herunterladen und installieren. Zusätzlich ist es auch praktisch, etwas an Quelltext zu haben, der veröffentlich werden soll und jemand anderen auch interessieren könnte. Aber das liegt im Ermessen von jeden selbst und hat mit diesem Artikel wenig zu tun.</p>
<p align="justify">Wenn man sein Projekt an einem Stand hat, der veröffentlicht werden soll, benötigt man ein entsprechendes Repository, in dem es eingestellt werden kann. Wie bereits erwähnt, bietet SourceForge für OpenSource-Projekte diesen Service kostenlos an. Dazu muss man das entsprechende Projekt auf der Homepage zunächst anlegen. Ist dies geschehen, findet man in dem angelegten Projekt einen Menüpunkt “SVN” unter dem man in etwa folgende Abbildung wiederfindet, wobei es sich hier beispielhaft um eines meiner Projekte handelt.</p>
<p><a href="http://preview.nospace.de/wp-content/uploads/2010/04/sourceforge.png" target="_blank" rel="lightbox[95]"><img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="SourceForge SVN Adresse" border="0" alt="SourceForge SVN Adresse" src="http://preview.nospace.de/wp-content/uploads/2010/04/sourceforge_thumb1.png" width="464" height="116" /></a></p>
<p align="justify">Wichtig ist dabei für die Verwendung mit AnkhSVN lediglich die Serveradresse “https://*.svn.sourceforge.net/svnroot/*”. Diese wird im folgenden benötigt und kann direkt von dieser Seite kopiert werden. Den Rest des Befehls benötigt man nicht.</p>
<p align="justify">Hat man AnkhSVN erfolgreich installiert, erweitert dieses die Menüs von Visual Studio und fügt zusätzliche anzeigbare Fenster hinzu. Für den aktuellen Zweck benötigt man den “Repository Explorer”, dem man im Menü “Ansicht” bzw. “View” findet.</p>
<p><img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="Repository Explorer Menü" border="0" alt="Repository Explorer Menü" src="http://preview.nospace.de/wp-content/uploads/2010/04/repositoryexplorer.png" width="267" height="146" /></p>
<p align="justify">Wählt man den Menüpunkt aus, öffnet sich folgendes Fenster. Hier ist im Normalfall noch nichts eingetragen. Über die einzige aktive Schaltfläche (Die Weltkugel mit dem kleinen Pluszeichen) lässt sich ein neues Repository anlegen.</p>
<p><img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="Repository Explorer Fenster" border="0" alt="Repository Explorer Fenster" src="http://preview.nospace.de/wp-content/uploads/2010/04/repositoryexplorerwindow.png" width="350" height="175" /></p>
<p align="justify">In dem sich öffnenden Dialogfenster gibt man einfach die Adresse des SVN-Servers an. In diesem Beispiel die Adresse, die auf der SourceForge-Seite angegeben wurde.</p>
<p><img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="Neues Repository Dialog" border="0" alt="Neues Repository Dialog" src="http://preview.nospace.de/wp-content/uploads/2010/04/image.png" width="466" height="165" /></p>
<p align="justify">Nach kurzer Zeit, die dafür verwendet wird, den Server entsprechend abzufragen, wird das Repository in etwa wie folgt im Repository Explorer eingetragen. Selbiges Fenster kann man dann auch wieder schließen, da es nun nicht mehr benötigt wird.</p>
<p><img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="Repository Explorer Fenster" border="0" alt="Repository Explorer Fenster" src="http://preview.nospace.de/wp-content/uploads/2010/04/repositoryexplorerwindow2.png" width="351" height="158" /> </p>
<p align="justify">Als Nächstes wählt man im “Solution Explorer” bzw. der “Projektmappe” diejenigen Projekte oder besser gleich die gesamte Solution aus, die veröffentlich werden sollen. Im Kontextmenü findet sich der Menüpunkt, mit dem Ihr Projekt unter Versionskontrolle gestellt werden kann.</p>
<p><img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="Add to Subversion Menü" border="0" alt="Add to Subversion Menü" src="http://preview.nospace.de/wp-content/uploads/2010/04/addtosubversion1.png" width="267" height="146" /></p>
</p>
</p>
</p>
</p>
<p align="justify">Es öffnet sich das folgende Fenster, in dem das eben erstellte Repository in dem Mehrfachauswahlfeld mit der Bezeichnung “Repository URL” ausgewählt werden muss. Weiterhin selektiert man das entsprechende Verzeichnis, so dass sich in dem Textfeld am unteren Ende wieder genau die Adresse des SourceForge-SVN-Servers ergibt.</p>
<p><a href="http://preview.nospace.de/wp-content/uploads/2010/04/image3.png" target="_blank" rel="lightbox[95]"><img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="SVN Server Dialog" border="0" alt="SVN Server Dialog" src="http://preview.nospace.de/wp-content/uploads/2010/04/image_thumb3.png" width="226" height="244" /></a></p>
<p align="justify">Beim Bestätigen mit der Schaltfläche OK dauert es ein wenig. Dies bedeutet aber nicht, dass man bereits fertig ist. Das Programm fragt zunächst, ob die gewählte Projekte mit Symbolen markiert werden sollen, die deren Status über die Versionskontrolle angeben. Dies kann man beruhigt mit “Ja” beantworten.</p>
<p><img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="Managed Dialog" border="0" alt="Managed Dialog" src="http://preview.nospace.de/wp-content/uploads/2010/04/image4.png" width="446" height="178" /></p>
</p>
<p align="justify">Nun wurde der Quelltext aber immer noch nicht veröffentlich. Dafür existiert das Fenster “Pending Changes”, das ebenfalls im Menü “Ansicht” (“View”) gefunden werden kann. Hier sieht man alle Dateien, die man selbst seit der letzten Veröffentlichung verändert hat. Am Anfang beinhaltet dies natürlich alle sich im Projekt befindlichen Dateien.</p>
<p><a href="http://preview.nospace.de/wp-content/uploads/2010/04/pendingchanges1.png" target="_blank" rel="lightbox[95]"><img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="Pending Changes Fenster" border="0" alt="Pending Changes Fenster" src="http://preview.nospace.de/wp-content/uploads/2010/04/pendingchanges_thumb1.png" width="454" height="195" /></a></p>
<p align="justify">Über die Schaltfläche “Commit” lassen sich diese Änderungen übertragen. Dazu werden noch Nutzername und Passwort für den Zugriff auf den Server abgefragt. Diese sind dieselben, die für den Zugang auf SourceForge verwendet werden.</p>
<p><a href="http://preview.nospace.de/wp-content/uploads/2010/04/image5.png" target="_blank" rel="lightbox[95]"><img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="Dialog Zugangsdaten" border="0" alt="Dialog Zugangsdaten" src="http://preview.nospace.de/wp-content/uploads/2010/04/image_thumb4.png" width="244" height="233" /></a></p>
<p align="justify">Hat man alles richtig eingegeben erfolgt nach Bestätigung mit “OK” die Übertragung der Quellen auf den Server.</p>
<div class="al2fb_like_button"><div id="fb-root"></div><script src="http://connect.facebook.net/de_DE/all.js#appId=298028736874081&amp;xfbml=1" type="text/javascript"></script>
<fb:like href="http://nospace.de/visual-studio-quelltext-in-subversion-einstellen/95" layout="standard" show_faces="true" width="450" action="like" font="arial" colorscheme="light" ref="AL2FB"></fb:like></div>]]></content:encoded>
			<wfw:commentRss>http://nospace.de/visual-studio-quelltext-in-subversion-einstellen/95/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CSharp Programmkonfigurationen speichern</title>
		<link>http://nospace.de/csharp-programmkonfigurationen-speichern/56</link>
		<comments>http://nospace.de/csharp-programmkonfigurationen-speichern/56#comments</comments>
		<pubDate>Wed, 31 Mar 2010 08:31:34 +0000</pubDate>
		<dc:creator>Tobias</dc:creator>
				<category><![CDATA[CSharp]]></category>
		<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[code]]></category>

		<guid isPermaLink="false">http://preview.nospace.de/?p=56</guid>
		<description><![CDATA[Einführung Bei einer Anwendung müssen im Regelfall bestimmte Einstellungen, die ein Nutzer innerhalb des Programmes macht, gespeichert werden. Bei einem Neustart des Programms sollen die Einstellungen dann wieder eingelesen werden. Am besten sollte es so sein, als hätte der Nutzer das Programm nicht geschlossen. Nun, der letzte Punkt ist nicht ganz so einfach, aber bei [...]]]></description>
			<content:encoded><![CDATA[<h1>Einführung</h1>
<p>Bei einer Anwendung müssen im Regelfall bestimmte Einstellungen, die ein Nutzer innerhalb des Programmes macht, gespeichert werden. Bei einem Neustart des Programms sollen die Einstellungen dann wieder eingelesen werden. Am besten sollte es so sein, als hätte der Nutzer das Programm nicht geschlossen. Nun, der letzte Punkt ist nicht ganz so einfach, aber bei den anderen beiden braucht man sich als Entwickler nicht mehr allzu viele Gedanken machen. C# unterstützt Einen auch hier.</p>
<p> <span id="more-56"></span>
<p>1. Zunächst muss man im Solution Explorer in seiner Solution nach der Datei “Settings.settings” suchen. </p>
<p><img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="solution_settings" border="0" alt="solution_settings" src="http://preview.nospace.de/wp-content/uploads/2010/03/solution_settings1.png" width="314" height="224" /></p>
<p>2. Mittels Doppelklick öffnet sich ein Einstellungsfenster, indem man angeben kann, wie die Konfigurationseigenschaften heißen und welche Typen sie haben sollen. Wenn diese festgelegt wurden, können zusätzlich noch die Standardwerte angegeben werden.</p>
<p><img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="settings_values" border="0" alt="settings_values" src="http://preview.nospace.de/wp-content/uploads/2010/03/settings_values1.png" width="471" height="175" /> </p>
<p>Visual Studio legt dabei automatisch entsprechende Klassen an, über die auf die angelegten Eigenschaften zugegriffen werden kann. </p>
<p>3. Der folgende Codeausschnitt zeigt, wie man die Einstellungen zum Beispiel beim Starten des Programms laden kann.</p>
<pre class="brush:csharp">private void LoadSettings()
{
    int value = Properties.Settings.Default.WindowX;
    if (value &gt; -1)
    {
        this.Left = value;
    }
    value = Properties.Settings.Default.WindowY;
    if (value &gt; -1)
    {
        this.Top = value;
    }
    menuItem_English.Checked = Properties.Settings.Default.Language.Equals(Language.EnglishCulture.Name);
    if (menuItem_English.Checked)
    {
        System.Threading.Thread.CurrentThread.CurrentUICulture = Language.EnglishCulture;
    }
    menuItem_German.Checked = Properties.Settings.Default.Language.Equals(Language.GermanCulture.Name);
    if (menuItem_German.Checked)
    {
        System.Threading.Thread.CurrentThread.CurrentUICulture = Language.GermanCulture;
    }
    ApplyLanguage();
    //...
}</pre>
<p>4. Das Speichern von veränderten Einstellungen erfolgt einfach über das umgekehrte zuweisen von Werten an die Settings-Klasse. In dem folgenden Beispiel erfolgt das Sichern der letzten Position des Formulars beim Schließen desselben:</p>
<pre class="brush:csharp">
        private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            Properties.Settings.Default.WindowX = this.Left;
            Properties.Settings.Default.WindowY = this.Top;
            Properties.Settings.Default.Save();
        }</pre>
<p>Wichtig dabei ist, dass die Save-Methode abschließend aufgerufen wird, damit die veränderten Einstellungen auch persistent gemacht werden, also in Dateiform auf die Festplatte geschrieben werden.</p>
<div class="al2fb_like_button"><div id="fb-root"></div><script src="http://connect.facebook.net/de_DE/all.js#appId=298028736874081&amp;xfbml=1" type="text/javascript"></script>
<fb:like href="http://nospace.de/csharp-programmkonfigurationen-speichern/56" layout="standard" show_faces="true" width="450" action="like" font="arial" colorscheme="light" ref="AL2FB"></fb:like></div>]]></content:encoded>
			<wfw:commentRss>http://nospace.de/csharp-programmkonfigurationen-speichern/56/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Internet Time Widget</title>
		<link>http://nospace.de/internet-time-widget/27</link>
		<comments>http://nospace.de/internet-time-widget/27#comments</comments>
		<pubDate>Sun, 21 Feb 2010 17:50:21 +0000</pubDate>
		<dc:creator>Tobias</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Download]]></category>
		<category><![CDATA[widget]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://preview.nospace.de/?p=27</guid>
		<description><![CDATA[Bei dem Versuch meine hübsche Flash-Uhr auch unter WordPress effizient einzubinden, ist auch gleich ein entsprechendes Widget entstanden. Für jene, die sich dafür interessieren und es in Ihrer eigenen WordPress-Installation einzubinden, stelle ich es gleich mal zur Verfügung. widget_inettime.zip 5.09 KB - 8. March 2010]]></description>
			<content:encoded><![CDATA[<p>Bei dem Versuch meine hübsche Flash-Uhr auch unter WordPress effizient einzubinden, ist auch gleich ein entsprechendes Widget entstanden. Für jene, die sich dafür interessieren und es in Ihrer eigenen WordPress-Installation einzubinden, stelle ich es gleich mal zur Verfügung.</p>
<p><code>
<div class="download">
	<table class="download" style="border:hidden">
		<tr style="border:hidden">
			<td><a rel="nofollow" title="Download version 0.1 of widget_inettime.zip" href="http://nospace.de/http//preview.nospace.de/downloads/widget_inettime.zip"><img src="http://nospace.de/wp-content/plugins/drain-hole/icons/download.png" alt="download" width="93" height="94"/></a></td>
			<td style="vertical-align:middle">	
            	<p><a class="button" href="http://nospace.de/http//preview.nospace.de/downloads/widget_inettime.zip"><a rel="nofollow" title="Download version 0.1 of widget_inettime.zip" href="http://nospace.de/http//preview.nospace.de/downloads/widget_inettime.zip">widget_inettime.zip</a></a><br/>
				<small>5.09 KB - 8. March 2010</small></p>
			</td>
		</tr>
	</table>
</div>
</code></p>
<div class="al2fb_like_button"><div id="fb-root"></div><script src="http://connect.facebook.net/de_DE/all.js#appId=298028736874081&amp;xfbml=1" type="text/javascript"></script>
<fb:like href="http://nospace.de/internet-time-widget/27" layout="standard" show_faces="true" width="450" action="like" font="arial" colorscheme="light" ref="AL2FB"></fb:like></div>]]></content:encoded>
			<wfw:commentRss>http://nospace.de/internet-time-widget/27/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>CSharp XML-Serialisierung</title>
		<link>http://nospace.de/csharp-xml-serialisierung/12</link>
		<comments>http://nospace.de/csharp-xml-serialisierung/12#comments</comments>
		<pubDate>Sun, 21 Feb 2010 13:41:42 +0000</pubDate>
		<dc:creator>Tobias</dc:creator>
				<category><![CDATA[CSharp]]></category>
		<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://preview.nospace.de/?p=12</guid>
		<description><![CDATA[Einführung Unter Serialisierung versteht man in der Softwareentwicklung die Abbildung von Objekten auf eine externe Darstellungsform, um diese persistent zu machen. Im Allgemeinen könnte man die Eigenschaften der Objekte händisch in einem selbst definierten Format in Dateien schreiben. Die Serialisierung macht es dem Programmierer aber einfacher, indem dieser einfach komplette Objekte übergibt und das System [...]]]></description>
			<content:encoded><![CDATA[<h1>Einführung</h1>
<p>Unter Serialisierung versteht man in der Softwareentwicklung die Abbildung von Objekten auf eine externe Darstellungsform, um diese persistent zu machen. Im Allgemeinen könnte man die Eigenschaften der Objekte händisch in einem selbst definierten Format in Dateien schreiben. Die Serialisierung macht es dem Programmierer aber einfacher, indem dieser einfach komplette Objekte übergibt und das System übernimmt die strukturierte Ablage.<span id="more-12"></span> C# bietet neben binärer Serialisierung Ihrer Objekte auch die Möglichkeit, Objekte in eine XML-Struktur zu serialisieren. Dies hat den Vorteil, dass die erzeugten Dateien in einem bestimmten Maße noch menschenlesbar sind. Dies wird allerdings dadurch erkauft, dass die Strukturierung durch XML im Verhältnis zur gepseicherten Menge vergleichsweise viel Speicherplatz verschwendet.</p>
<h1>Vorbereitung</h1>
<p>Betrachten wir eine einfache Klasse Mitarbeiter. Wie Sie sehen, speichert jedes Objekt dieser Klasse nur den Namen und den Vornamen einen Mitarbeiters, wobei diese Werte im Konstruktor gesetzt werden. Über die Properties ist der Zugriff auf die Eigenschaften nachträglich möglich.</p>
<pre class="brush:csharp">public class Mitarbeiter
{
    private string _name;
    private string _vorname;

    public string Name
    {
        get
        {
            return _name;
        }
        set
        {
            _name = value;
        }
    }

    public string Vorname
    {
        get
        {
            return _vorname;
        }
        set
        {
            _vorname = value;
        }
    }

    public Mitarbeiter(string name, string vorname)
    {
        this._name = name;
        this._vorname = vorname;
    }
}</pre>
<p>Der öffentlich Zugriff ist zum Serialiseren wichtig. Nur öffentliche Eigenschaften oder Properties können serialisiert werden. Für einfache Datenklassen könnte man also auch auf die Properties verzichten und die Eigenschaft veröffentlichen. Bevor Objekte dieser Klasse aber in XML serialisiert werden können, müssen die öffentlichen Mitglieder entsprechent markiert werden, damit das System &#8216;weiß&#8217;, in welcher Form diese schließlich in der XML-Datei abgelegt werden. Als wichtige Deklarationen sind dabei &#8220;XmlAttribute&#8221; und &#8220;XmlElement&#8221; zu nennen. Nicht zu serialisierende öffentliche Mitglieder können mit &#8220;XmlIgnore&#8221; gekennzeichnet werden. Um diese nutzen zu können, muss der namespace &#8220;System.Xml.Serialization&#8221; eingebunden werden. Für die Deserialisierung, also das Wiedereinlesen der XML-Datei ist ein parameterloser Konstruktor Pflicht, da dieser dabei aufgerufen wird. Die Werte der Attribute werden anschließend über die Property-Setter bzw. über direkt in die öffentlichen Eigenschaften gesetzt.</p>
<pre class="brush:csharp">public class Mitarbeiter
{
    //[...]

    [XmlAttribute]
    public string Name
    {
        //[...]
    }

    [XmlAttribute]
    public string Vorname
    {
        //[...]
    }

    //[...]

    ///
    /// Konstruktor für Deserialisierung
    ///
    public Mitarbeiter()
    {
    }
}</pre>
<h1>Serialisieren</h1>
<p>Wenn Sie nun ein Objekt der Klasse Mitarbeiter serialisieren möchten, reichen diese wenigen Zeilen Quelltext bereits aus:</p>
<pre class="brush:csharp">Mitarbeiter ma = new Mitarbeiter("Max","Mustermann");
XmlSerializer serializer = new XmlSerializer(typeof(Mitarbeiter));
FileStream fs = new FileStream("mitarbeiter.xml", FileMode.Create);
serializer.Serialize(fs, ma);
fs.Close();</pre>
<p>Die resultierende XML-Datei sieht dann in etwa folgendermaßen aus (unwichtige Details ausgelassen). Da die Eigenschaften des Mitarbeiters als &#8220;XmlAttribute&#8221; serialisiert werden, erfolgt die Speicherung direkt im Mitarbeiter-Tag.</p>
<pre class="brush:xml">
&lt;?xml version="1.0"?&gt;
&lt;Mitarbeiter xmlns:xsi="..." xmlns:xsd="..." Name="Max" Vorname="Mustermann"/&gt;
</pre>
<p>Verwendet man anstelle von &#8220;XmlAttribute&#8221; die Deklaration &#8220;XmlElement&#8221; erhält man dagegen folgendes Ergebnis:</p>
<pre class="brush:xml">
&lt;?xml version="1.0"?&gt;
&lt;Mitarbeiter xmlns:xsi="..." xmlns:xsd="..."&gt;
  &lt;Name&gt;Max&lt;/Name&gt;
  &lt;Vorname&gt;Mustermann&lt;/Vorname&gt;
&lt;/Mitarbeiter&gt;
</pre>
<p>Nun ist das ausgewählt Beispiel sehr trivial gewählt und es wird in Realität eher nicht der Fall sein, dass solch ein einzelnes kleines Objekt serialisiert werden soll. Viel wahrscheinlicher ist die Speicherung von Listen von Objekten oder gar Aggregationen oder Kompositionen von verschiedenen Objekten. Wenn Sie die bisherigen Ausführen soweit verstanden haben, stellt das aber auch kein größeres Problem dar. Wir passen den Code zunächst auf die Speicherung von Listen von Mitarbeitern an:</p>
<pre class="brush:csharp">List&lt;Mitarbeiter&gt; malist = new List&lt;Mitarbeiter&gt;();
malist.Add(new Mitarbeiter("Max","Mustermann"));
malist.Add(new Mitarbeiter("Martina","Musterfrau"));

XmlSerializer serializer = new XmlSerializer(typeof(List&lt;Mitarbeiter&gt;));
FileStream fs = new FileStream("mitarbeiter.xml", FileMode.Create);
serializer.Serialize(fs, malist);
fs.Close();</pre>
<p>Wie man schön sieht, ändert sich der eigentliche Quelltext für das Serialisieren nur unwesentlich. Einzig der übergebene Typ und das konkrete zu serialisierende Objekt wurden verändert. Die resultende XML-Datei schaut dann ungefähr so aus:</p>
<pre class="brush:xml">
&lt;?xml version="1.0"?&gt;
&lt;ArrayOfMitarbeiter xmlns:xsi="..." xmlns:xsd="..."&gt;
  &lt;Mitarbeiter Name="Max" Vorname="Mustermann"/&gt;
  &lt;Mitarbeiter Name="Martina" Vorname="Musterfrau"/&gt;
&lt;/ArrayOfMitarbeiter&gt;
</pre>
<p>Schauen wir uns nun an, wie sich Aggregationen serialisieren lassen. Dazu erstellen wir eine Klasse Abteilung. In einer Abteilung arbeiten für gewöhnlich mehrere Mitarbeiter. Das Listing ist diesmal bereits mit den nötigen XML-Deklarationen. Ich möchte an dieser Stelle darauf hinweisen, das die dargestellte Klasse kein gutes Beispiel für Objektorientierung ist. Für die Verdeutlichung der XML-Serialisierung sollte es aber ausreichend sein.</p>
<pre class="brush:csharp">public class Abteilung
{
    [XmlAttribute("Abteilungsname")]
    public string Bezeichnung;

    [XmlArray("Angestellte")]
    [XmlArrayItem("Mitarbeiter", Type = typeof(Mitarbeiter))]
    public Mitarbeiter[] Mitarbeiter;

    public Abteilung(string bezeichnung)
    {
        this.Bezeichnung = bezeichnung;
    }

    public Abteilung()
    {
    }
}</pre>
<p>Der Quelltext zum Serialisieren ist nun natürlich wieder entsprechend anzupassen. Es ist darauf zu achten, dass alle aggregierten Typen ebenfalls serialisiert werden können. In unserem Fall haben wir die Klasse Mitarbeiter bereits vorher behandelt und dies ist sichergestellt.</p>
<p>Existieren verschiedene Unterklassen der Klasse Mitarbeiter, so lassen sich die verschiedenen möglichen Objekte die die Klasse Abteilung führen kann folgendermaßen erweitern:</p>
<pre class="brush:csharp">[XmlArray("Angestellte")]
[XmlArrayItem("Mitarbeiter", Type = typeof(Mitarbeiter)),
 XmlArrayItem("Abteilungsleiter", Type = typeof(Abteilungsleiter))]
public Mitarbeiter[] Mitarbeiter;
</pre>
<p>Ein mögliches Resultat für eine serialisierte Abteilung mit entsprechenden aggregierten Objekten könnte dann folgendermaßen aussehen. Man beachte, wie für die XML-Elemente und XML-Attribute die Zeichenketten verwendet wurde, die bei der Deklaration zusätzlich angegeben wurden.</p>
<pre class="brush:xml">
&lt;?xml version="1.0"?&gt;
&lt;Abteilung xmlns:xsi="..." xmlns:xsd="..." Abteilungsname="Buchhaltung"&gt;
  &lt;Angestellte&gt;
    &lt;Abteilungsleiter Name="Klaus" Vorname="Freundlich"/&gt;
    &lt;Mitarbeiter Name="Max" Vorname="Mustermann"/&gt;
    &lt;Mitarbeiter Name="Martina" Vorname="Musterfrau"/&gt;
  &lt;/Angestellte&gt;
&lt;/Abteilung&gt;
</pre>
<h1>Deserialisieren</h1>
<p>Nachdem die Serialisierung ziemlich umfangreich erörtert wurde, braucht man evtl. noch eine kleine Information, wenn man die entsprechenden XML-Daten später wieder einlesen möchte. Hierzu genügen, ähnlich wie es beim Serialisieren der Fall ist, nur wenige Zeilen Quelltext. Dieser kurze Ausschnitt passt zu dem ersten Quelltext der Serialisierung, bei dem nur die einfache Mitarbeiter-Klasse gespeichert wurde:</p>
<pre class="brush:csharp">string filename = "mitarbeiter.xml";
if (File.Exists(filename))
{
    XmlSerializer serializer = new XmlSerializer(typeof(Mitarbeiter));
    FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read);
    Mitarbeiter ma = (Mitarbeiter)serializer.Deserialize(fs);
    fs.Close();
}</pre>
<p>Wie man unschwer erkennen kann, könnte man für das Serialisieren und Deserialisieren dasselbe XmlSerializer-Objekt verwenden. Zum Deserialisieren der anderen beiden Beispiele müsste man ähnlich verfahren. Die Typen und der Cast sind dabei entsprechend anzupassen. Der Quelltext für das Serialisieren und Deserialisieren ist stets äquivalent zu betrachten.</p>
<div class="al2fb_like_button"><div id="fb-root"></div><script src="http://connect.facebook.net/de_DE/all.js#appId=298028736874081&amp;xfbml=1" type="text/javascript"></script>
<fb:like href="http://nospace.de/csharp-xml-serialisierung/12" layout="standard" show_faces="true" width="450" action="like" font="arial" colorscheme="light" ref="AL2FB"></fb:like></div>]]></content:encoded>
			<wfw:commentRss>http://nospace.de/csharp-xml-serialisierung/12/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Hallo Internet!</title>
		<link>http://nospace.de/hello-world/1</link>
		<comments>http://nospace.de/hello-world/1#comments</comments>
		<pubDate>Fri, 19 Feb 2010 19:44:28 +0000</pubDate>
		<dc:creator>Tobias</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[blafasel]]></category>

		<guid isPermaLink="false">http://preview.nospace.de/?p=1</guid>
		<description><![CDATA[Ich habe diese Internetpräsenz mal wieder aktualisiert. Dabei habe ich Joomla den Rücken gekehrt und probiere diesmal WordPress aus. Wenn du als Besucher etwas von der alten Seite vermissen solltest (z.B. einen der vielen Downloads), dann teile dies doch einfach mit. Dazu kannst du unter anderem die Kommentarfunktion nutzen. Ich werde dann den entsprechenden Inhalt [...]]]></description>
			<content:encoded><![CDATA[<p>Ich habe diese Internetpräsenz mal wieder aktualisiert. Dabei habe ich Joomla den Rücken gekehrt und probiere diesmal WordPress aus. Wenn du als Besucher etwas von der alten Seite vermissen solltest (z.B. einen der vielen Downloads), dann teile dies doch einfach mit. Dazu kannst du unter anderem die Kommentarfunktion nutzen. Ich werde dann den entsprechenden Inhalt wieder zur Verfügung stellen.</p>
<p>Die Ausrichtung der Seite wird sich auch etwas ändern. Ich versuche, demnächst einige Kniffe in Sachen Programmierung hier festzuhalten. Alle Besucher und nicht zuletzt ich selbst kann dann ab und zu hier nachschlagen.</p>
<p><img class="aligncenter" title="Daumen hoch!" src="http://series60dotca.files.wordpress.com/2010/01/thumbs_up2.jpg" alt="" width="230" height="230" /></p>
<div class="al2fb_like_button"><div id="fb-root"></div><script src="http://connect.facebook.net/de_DE/all.js#appId=298028736874081&amp;xfbml=1" type="text/javascript"></script>
<fb:like href="http://nospace.de/hello-world/1" layout="standard" show_faces="true" width="450" action="like" font="arial" colorscheme="light" ref="AL2FB"></fb:like></div>]]></content:encoded>
			<wfw:commentRss>http://nospace.de/hello-world/1/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

