<?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>Niklas Rother - XNA, Computer &#38; mehr &#187; Programmieren</title>
	<atom:link href="http://niklas-rother.de/kategorien/programmieren/feed/" rel="self" type="application/rss+xml" />
	<link>http://niklas-rother.de</link>
	<description>Ein Blog über XNA, C#, Software, und anderes...</description>
	<lastBuildDate>Tue, 24 Jan 2012 15:35:27 +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>Dropbox-Backup ohne Client</title>
		<link>http://niklas-rother.de/artikel/dropbox-backup-ohne-client/</link>
		<comments>http://niklas-rother.de/artikel/dropbox-backup-ohne-client/#comments</comments>
		<pubDate>Tue, 24 Jan 2012 15:35:27 +0000</pubDate>
		<dc:creator>Niklas</dc:creator>
				<category><![CDATA[Betriebsyteme]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[Tipps & Tricks]]></category>
		<category><![CDATA[backup]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[dropbox]]></category>
		<category><![CDATA[skripting]]></category>

		<guid isPermaLink="false">http://niklas-rother.de/?p=1561</guid>
		<description><![CDATA[Der offizielle Dropbox Client unter Linux hat ja ein paar kleine Speicherprobleme (und auch andere Probleme), daher hab ich mich nach einer anderen Lösung umgesehen, meine Backups in die Dropbox zu schieben. Den ersten Ansatz habe ich auf der Seite &#8230; <a href="http://niklas-rother.de/artikel/dropbox-backup-ohne-client/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Der offizielle Dropbox Client unter Linux <a title="Warum ich Dropbox für Linux nicht mag" href="http://niklas-rother.de/artikel/warum-ich-dropbox-fur-linux-nicht-mag/">hat ja ein paar kleine Speicherprobleme</a> <a title=".dropbox-dist/dropbox not found" href="http://niklas-rother.de/artikel/dropbox-distdropbox-not-found/">(und auch andere Probleme)</a>, daher hab ich mich nach einer anderen Lösung umgesehen, meine Backups in die Dropbox zu schieben. Den ersten Ansatz habe ich auf der <a href="http://www.andreafabrizi.it/?dropbox_uploader">Seite von Andrea Fabrizi</a> gefunden: Dort gibt es ein Script, mit dem Uploads in die Dropbox auch ohne Client möglich sind.</p>
<p>Das Script lädt die Datei mit cURL über die offzielle Website hoch. Nicht wirklich eine saubere Lösung, funktioniert aber perfekt. Naja, fast: Über die Website sind nur Uploads bis 150MB möglich, meine Backup-Zips sind aber inzwischen schon 188MB groß (ich blogge zu viel <img src='http://niklas-rother.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> ). Daher habe ich mir ein kleines Script gebastelt, das die Dateien durchgeht, und alle die größer als 100MB sind, mit Hilfe von split in Teile á 100MB schneidet. Dabei wird dann einfach ein fortlaufender Buchstabe an den Dateinamen angehängt. Dazu habe ich das Upload Script noch so modifiziert, das es Dateien, die größer als 100MB sind, gar nicht erst hoch lädt (da sie eh nicht verarbeitet werden).</p>
<p><span id="more-1561"></span></p>
<p>Als drittes im Bunde habe ich dann noch ein kleines Script das einen Dump der Datenbank erstellt, und zu guter Letzt noch ein Script, das alle die kleinen anderen Scripte der Reihe nach aufruft (und dabei noch ein VERBOSE Option zum testen durchreicht).</p>
<p>Mit diesem System habe ich jetzt meine Backups hoffentlich im Griff <img src='http://niklas-rother.de/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  Bash-Scripting ist nicht wirklich mein Lieblingsthema&#8230; Aber ich hatte jetzt auch keine Lust das in C++ zu machen <img src='http://niklas-rother.de/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<p>Soviel zur Theorie, hier sind die ganzen Skripte:</p>
<p>Der Dump der Datenbank:</p>
<pre class="brush: bash; title: ; notranslate">

/usr/bin/mysqldump --all-databases --user=backup --password=verratichnicht &gt; /var/backup/sqldump/backup_full_`date &quot;+%y_%m_%d&quot;`.sql
</pre>
<p>Das Zerteilen der Dateien in kleine Stücke:</p>
<pre class="brush: bash; title: ; notranslate">

#!/bin/bash

function split_dir
{
for i in *; do
if [ -f &quot;$i&quot; ]; then
FILESIZE=$(stat -c%s &quot;$i&quot;)
if [ $FILESIZE -gt &quot;104857600&quot; ]; then
if [ $VERBOSE -eq 1 ]; then
echo &quot;$1 is too big, splitting&quot;
fi
split -a 1 -b 100M $i `basename $i`_
fi
fi

if [ -d &quot;$i&quot; ]; then
local OLD_PWD=$(pwd)
cd &quot;$i&quot;
split_dir &quot;$1/$i&quot;
cd &quot;$OLD_PWD&quot;
fi
done
}

cd $1
split_dir $1
</pre>
<p>Mein modifizierter Dropbox-Uploader: (Nur als Diff, sonst ist das ewig viel Text, das Original gibst <a href="https://github.com/andreafabrizi/Dropbox-Uploader">hier</a>)</p>
<pre class="brush: diff; title: ; notranslate">

26,27c26,27
&lt; LOGIN_EMAIL=&quot;ich@ich.de&quot;
&lt; LOGIN_PASSWD=&quot;supergeheim&quot;
---
&gt; LOGIN_EMAIL=&quot;&quot;
&gt; LOGIN_PASSWD=&quot;&quot;
90c90
&lt;
---
&gt;
101,107c101,102
&lt;     FILESIZE=$(stat -c%s &quot;$UPLOAD_FILE&quot;)
&lt;
&lt;     if [ $FILESIZE -gt 104857800 ]; then #file to big for upload (slighly more than 100M
&lt;          print  &quot;$UPLOAD_FILE is too big, ignoring.&quot;
&lt;     else
&lt;         curl $CURL_PARAMETERS -i -b $COOKIE_FILE -o $RESPONSE_FILE -F &quot;plain=yes&quot; -F &quot;dest=$DEST_FOLDER&quot; -F &quot;t=$TOKEN&quot; -F &quot;file=@$UPLOAD_FILE&quot;  &quot;$UPLOAD_URL&quot;
&lt;         grep &quot;HTTP/1.1 302 FOUND&quot; &quot;$RESPONSE_FILE&quot; &gt; /dev/null
---
&gt;     curl $CURL_PARAMETERS -i -b $COOKIE_FILE -o $RESPONSE_FILE -F &quot;plain=yes&quot; -F &quot;dest=$DEST_FOLDER&quot; -F &quot;t=$TOKEN&quot; -F &quot;file=@$UPLOAD_FILE&quot;  &quot;$UPLOAD_URL&quot;
&gt;     grep &quot;HTTP/1.1 302 FOUND&quot; &quot;$RESPONSE_FILE&quot; &gt; /dev/null
109,116c104,108
&lt;         if [ $? -ne 0 ]; then
&lt;             print &quot; Failed!\n&quot;
&lt;             if [ $END_ON_UPLOAD_ERROR -eq 1 ]; then
&lt;                 remove_temp_files
&lt;                 exit 1
&lt;             fi
&lt;         else
&lt;             print &quot; OK\n&quot;
---
&gt;     if [ $? -ne 0 ]; then
&gt;         print &quot; Failed!\n&quot;
&gt;         if [ $END_ON_UPLOAD_ERROR -eq 1 ]; then
&gt;             remove_temp_files
&gt;             exit 1
117a110,111
&gt;     else
&gt;         print &quot; OK\n&quot;
</pre>
<p>Und jetzt noch das eigentliche Skript, das alle aufruft, und dabei die -v Option durchreicht:</p>
<pre class="brush: bash; title: ; notranslate">

#!/bin/bash

#Helper scripts that calls all the backupscripts.
#-dumps all MySQL DBs
#-split big zip files in /backup
#-uploads all to dropbox

VERBOSE=0

#if the first argument is -v, the verbose mode for this scritp, and all scripts called is enable
if [ &quot;$1&quot; == &quot;-v&quot; ]; then
VERBOSE=1
fi

#create the MySQL dump
if [ $VERBOSE -eq 1 ]; then
echo &quot;Doing DB Dump...&quot;
fi
./backup_db.sh

#split big files
if [ $VERBOSE -eq 1 ]; then
echo &quot;Splitting files...&quot;
fi
env VERBOSE=$VERBOSE ./split_files.sh /var/backup

#upload all
if [ $VERBOSE -eq 1 ]; then
echo &quot;Starting upload...&quot;
./dropbox_uploader.sh -f /var/backup -d /ServerBackup -v
else
./dropbox_uploader.sh -f /var/backup -d /ServerBackup
fi

#done
if [ $VERBOSE -eq 1 ]; then
echo &quot;Done!&quot;
fi
</pre>
<p>Die Krönung wäre jetzt noch ein kleines Programm, das die Dateien auf meinem Rechner erkennt, wieder zusammensetzt, und in die Dropbox schiebt. Aber das kann ich immer noch machen, wenn ich das Backup mal brauche <img src='http://niklas-rother.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Mal sehen, wie sich mein Sammelsurium von Skripten so macht!</p>
<br /><a href="http://niklas-rother.de/?p=1561#comments" title="Comments on &quot;Dropbox-Backup ohne Client&quot;"><img src="http://niklas-rother.de/wp-content/plugins/feed-comments-number/image.php?1561" alt="Comments" /></a>]]></content:encoded>
			<wfw:commentRss>http://niklas-rother.de/artikel/dropbox-backup-ohne-client/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Warnung vor func_instance_origin</title>
		<link>http://niklas-rother.de/artikel/warnung-vor-func_instance_origin/</link>
		<comments>http://niklas-rother.de/artikel/warnung-vor-func_instance_origin/#comments</comments>
		<pubDate>Thu, 10 Nov 2011 11:43:47 +0000</pubDate>
		<dc:creator>Niklas</dc:creator>
				<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[Spiele]]></category>
		<category><![CDATA[Tipps & Tricks]]></category>
		<category><![CDATA[func_instance_origin]]></category>
		<category><![CDATA[hammer]]></category>
		<category><![CDATA[portal2]]></category>
		<category><![CDATA[source]]></category>
		<category><![CDATA[vbsp]]></category>

		<guid isPermaLink="false">http://niklas-rother.de/?p=1513</guid>
		<description><![CDATA[Nur ein kleiner Tipp für alle Portal 2 Mapper, die mit Hammer (dem Editor) eigene Instances bauen wollen: Laut dem Wiki soll man ein func_instance_origin benutzen, um die Mitte der Instance anzugeben. Offensichtlich beachtet aber entweder Hammer oder VBSP (der &#8230; <a href="http://niklas-rother.de/artikel/warnung-vor-func_instance_origin/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Nur ein kleiner Tipp für alle Portal 2 Mapper, die mit Hammer (dem Editor) eigene Instances bauen wollen: Laut dem Wiki soll man ein <a href="http://developer.valvesoftware.com/wiki/Func_instance_origin">func_instance_origin</a> benutzen, um die Mitte der Instance anzugeben. Offensichtlich beachtet aber entweder Hammer oder VBSP (der Compiler), das Ding nicht richtig, wodurch die Instance im Spiel dann gegenüber der Anzeige in Hammer verschoben ist. Kann ziemlich nervig sein <img src='http://niklas-rother.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><strong>Lösung:</strong> Einfach alle so verschieben, dass der Koordinatenursprung in der Instance da ist, wo man ihn haben will&#8230;</p>
<br /><a href="http://niklas-rother.de/?p=1513#comments" title="Comments on &quot;Warnung vor func_instance_origin&quot;"><img src="http://niklas-rother.de/wp-content/plugins/feed-comments-number/image.php?1513" alt="Comments" /></a>]]></content:encoded>
			<wfw:commentRss>http://niklas-rother.de/artikel/warnung-vor-func_instance_origin/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DynamicLua</title>
		<link>http://niklas-rother.de/artikel/dynamiclua/</link>
		<comments>http://niklas-rother.de/artikel/dynamiclua/#comments</comments>
		<pubDate>Fri, 28 Oct 2011 14:10:38 +0000</pubDate>
		<dc:creator>Niklas</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Meine Programme]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[.Net]]></category>
		<category><![CDATA[dynamiclua]]></category>
		<category><![CDATA[lua]]></category>
		<category><![CDATA[luainterface]]></category>
		<category><![CDATA[wrapper]]></category>

		<guid isPermaLink="false">http://niklas-rother.de/?p=1479</guid>
		<description><![CDATA[So, ich denke es ist Zeit, die Katze aus dem Sack zu lassen, und mein neues Projekt vorzustellen: DynamicLua Kurz ein paar Worte zum Hintergrund: Mit .NET 4.0 wurde die sog. Dynamic Language Runtime (DLR) eingeführt. Die dient zum einen &#8230; <a href="http://niklas-rother.de/artikel/dynamiclua/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://niklas-rother.de/wp-content/uploads/2011/10/dynamiclua_logo.png" rel="shadowbox[sbpost-1479];player=img;" title="dynamiclua_logo"><img style=' float: left; padding: 4px; margin: 0 7px 2px 0;'  class="alignleft size-full wp-image-1482" title="dynamiclua_logo" src="http://niklas-rother.de/wp-content/uploads/2011/10/dynamiclua_logo.png" alt="" width="244" height="261" /></a>So, ich denke es ist Zeit, die Katze aus dem Sack zu lassen, und mein neues Projekt vorzustellen: <span style="font-size: large;"><strong>DynamicLua</strong></span></p>
<p>Kurz ein paar Worte zum Hintergrund: Mit .NET 4.0 wurde die sog. Dynamic Language Runtime (DLR) eingeführt. Die dient zum einen dazu, es Entwicklern einfacher zu machen, neue Sprache auf .NET Basis zu entwickeln (wie <a href="http://ironpython.net">IronPython</a>/<a title="Die eigene Certificate Authority (CA)" href="http://ironruby.net">IronRuby</a>), hat aber auch ein paar tolle andere Features zu bieten. Eines davon ist das neue Schlüsselwort &#8220;dynamic&#8221;. Es funktioniert ähnlich wie &#8220;var&#8221; kann also jeden Typ annehmen. Wenn man darin aber ein Objekt speichert, das von System.Dynamic.DynamicObject abgeleitet ist, kann man bestimmen was passiert, wenn etwas &#8220;nicht erlaubtes&#8221; passiert, also wenn z.B. eine Methode aufgerufen wird, die es gar nicht gibt. Solche Aufrufe landen dann bei der Methode TryInvokeMember, und die kann dann entscheiden, was passieren soll.</p>
<p>Dieses Konzept habe ich jetzt genutzt, um einen Wrapper für das <a href="http://code.google.com/p/luainterface/">LuaInterface </a>zu schreiben. Das Lua Interface ist eine Library für .NET, die es erlaubt, <a href="http://lua.org">Lua </a>in C# zu benutzen. Dabei kümmert sie sich auch darum, .NET Objekte in Lua abzubilden und vieles mehr. Diese Library ist wirklich unglaublich, man denkt wirklich, Lua hätte was mit Objekten am Hut.</p>
<p><span id="more-1479"></span></p>
<p>Meine Idee war es jetzt, über das LuaInterface eine neue Hülle zu stecken, die es zusammen mit der DLR ermöglicht, Lua noch einfacher in C# (und anderen .NET Sprachen zu benutzen). Hier ein kleines Beispiel:</p>
<pre class="brush: csharp; title: ; notranslate">
// Start a new Lua interpreter
dynamic lua = new DynamicLua.DynamicLua(); //Namespace and class name are the same!
// Run Lua chunks
lua(&quot;num = 2&quot;); //no DoString()!
lua(&quot;str = ’a string’&quot;);
// Read global variables ’num’ and ’str’
double num = lua.num; //No explicit casting, no index operator!
string str = lua.str;
// Write to global variable ’str’
lua.str = &quot;another string&quot;; //No index operator
//Increase a global value
lua.num += 10; //A LOT cleaner
</pre>
<p>Wie man sehen kann wird eine neue Instanz des Interpreters erzeugt, wenn man ihn aufruft wie eine Funktion wird der Lua Code ausgeführt. Variablen aus Lua sind einfach als Eigenschaften des Objektes vorhanden. Es ist kein Problem, .NET Klasse an Lua zu schicken, eine einfache Zuweisung reicht. Noch ein paar der Features:</p>
<ul>
<li>Einfacher Zugriff auf Lua-Variablen</li>
<li>Aufruf von Lua-Funktionen aus C#</li>
<li>C#-Funktionen können in Lua Variablen gespeichert werden</li>
<li>Lua-Table können in C# Variablen gespeichert werden</li>
<li>Lua Metatables können in C# benutzt werden</li>
<li>Open-Source (Apache Lizenz 2.0)</li>
<li>Unit-Tests</li>
</ul>
<p>Ich denke, mit DynamicLua ist es wirklich einfach Lua in C# einzubinden, weil vieles genau so funktioniert, wie man es erwarten würde. Das war zumindest mein Design-Ziel.</p>
<p>Genug der lobenden Worte, alles weitere ist auf der Codeplex-Seite zu finden: <a href="http://dynamiclua.codeplex.com">DynamicLua bei Codeplex</a>. Momentan ist dort die Beta der Version 1.0 zu finden.</p>
<br /><a href="http://niklas-rother.de/?p=1479#comments" title="Comments on &quot;DynamicLua&quot;"><img src="http://niklas-rother.de/wp-content/plugins/feed-comments-number/image.php?1479" alt="Comments" /></a>]]></content:encoded>
			<wfw:commentRss>http://niklas-rother.de/artikel/dynamiclua/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Fischertecknik mit C# steuern</title>
		<link>http://niklas-rother.de/artikel/fischertecknik-mit-c-steuern/</link>
		<comments>http://niklas-rother.de/artikel/fischertecknik-mit-c-steuern/#comments</comments>
		<pubDate>Sun, 09 Oct 2011 09:44:04 +0000</pubDate>
		<dc:creator>Niklas</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Hardware]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[fischertechnik]]></category>
		<category><![CDATA[interface]]></category>
		<category><![CDATA[messkarte]]></category>
		<category><![CDATA[usb]]></category>

		<guid isPermaLink="false">http://niklas-rother.de/?p=1462</guid>
		<description><![CDATA[Im Zuge eines Schulprojektes muss ich mit einem PC die Spannungswerte eines Helligkeitssensors aufzeichnen. Also brauche ich in irgendeiner Form eine Messkarte mit Verbindung zum PC. Meine erste Idee war das mein altes Fischertechnik ROBO-Interface, dass mir früher immer treue &#8230; <a href="http://niklas-rother.de/artikel/fischertecknik-mit-c-steuern/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Im Zuge eines Schulprojektes muss ich mit einem PC die Spannungswerte eines Helligkeitssensors aufzeichnen. Also brauche ich in irgendeiner Form eine Messkarte mit Verbindung zum PC. Meine erste Idee war das mein altes Fischertechnik ROBO-Interface, dass mir früher immer treue Dienste geleistet hat. Natürlich wollte ich es jetzt nicht in ROBO-Pro programmieren, der grafischen Sprache von Fischertechnik (auch wenn die <em>wirklich</em> gut ist!), denn die hat keine Möglichkeit Daten auf dem PC dauerhaft zu speichern.</p>
<p>Also habe ich mich mal etwas im Netz umgesehen, und bin auf der Seite von Ulrich Müller gelandet, der sich die Mühe gemacht hat, allen möglichen Sprachen Bibliotheken zu schreiben. So gibt es auch ein in C#. Leider ist die Benutzung grade mit Windows 7 etwas kompliziert, daher will ich hier mal kurz erklären, wie es funktioniert. An dieser Stelle noch mal einen Dank an Ulrich Müller, der mit per Mail weiter geholfen hat.</p>
<p><span id="more-1462"></span></p>
<p>Als erstes brauchen wir die USB-Treiber für das Interface, sonst ist gar keine Kommunikation möglich. Alternativ ist auch der Betrieb über COM möglich, aber so richtig ist das ja auch nichts&#8230; Die Treiber werden zusammen mit ROBO Pro installiert, wer die CD aber nicht findet, kann auch auf der Fischertechnik-Seite eine ZIP-Datei mit verschiedenen Hilfemitteln herunterladen, im Ordner /Driver sind dann die Treiber zu finden. Den Download gibt es hier: <a href="http://www.fischertechnik.de/de/home/downloads/Computing.aspx">Fischertechnik Download-Seite</a> (Treibersoftware KeLib).</p>
<p>Jetzt brauchen wir noch eine DLL, die die eigentliche Kommunikation übernimmt, und einen Wrapper in der passenden Sprache. Beides gibt auf der <a href="http://www.ftcomputing.de/sprachen.htm">Seite von Ulrich Müller</a>. Weil die Downloads etwas schwer zu finden sind, erlaube ich mir mal Deep-Links:</p>
<ul>
<li><a href="http://www.ftcomputing.de/zip/umFish40V77.zip">umFish.dll</a></li>
<li><a href="http://www.ftcomputing.de/zip/cs2005fish40setup.exe">FischFace.dll</a></li>
</ul>
<p>Die beiden oben angegebenen Dateien brauchen wir für die Kommunikation. Die Downloads enthalten noch etwas mehr, hauptsächlich Dokumentation. Davon ist auch auf der oben verlinkten Seite einiges zu finden.</p>
<p>Die umFish.dll ist die eigentliche Bibliothek zum steuern des Interfaces, die FishFace.dll nur der Wrapper für C#.</p>
<p>Wir fügen also beide Dateien einem neuen C# Projekt hinzu, und fügen einen Verweis auf die FishFace.dll hinzu. Mit folgendem Code stellen wir eine Verbindung zum Interface her:</p>
<pre class="brush: csharp; title: ; notranslate">using System;
using System.Collections.Generic;
using System.Text;
using FishFace40;

namespace ftTest
{
class Program
{
static void Main(string[] args)
{
FishFace ft = new FishFace();
ft.OpenInterface(IFTypen.ftROBO_first_USB, 0);
}
}
}
</pre>
<p>Mit den Parametern von OpenInterface() kann man die Schnittstelle auswählen, und über die Seriennummer auch mehr als ein Interface ansteuern. Am Ende des Programms sollte dann natürlich auch noch eine CloseInterface() stehen. Die restliche Steuerung ist ziemlich selbst erklärend, darum gehe ich da nicht weiter drauf ein.</p>
<p>Ich persönlich habe jetzt auch ein anderes Interface umgeschwenkt, dass ich von der Schule gestellt bekomme, weil ich die Verbindung zum Fischertechnik-Interface erst nicht hinbekommen habe (falsche Version der umFish.dll). Ist aber trotzdem praktisch, wenn man mal wieder was in der Richtung machen will&#8230;</p>
<p>Wenn ihr noch Fragen habt, einfach in die Kommentare damit.</p>
<br /><a href="http://niklas-rother.de/?p=1462#comments" title="Comments on &quot;Fischertecknik mit C# steuern&quot;"><img src="http://niklas-rother.de/wp-content/plugins/feed-comments-number/image.php?1462" alt="Comments" /></a>]]></content:encoded>
			<wfw:commentRss>http://niklas-rother.de/artikel/fischertecknik-mit-c-steuern/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Spiel den Profi Coder! [Update]</title>
		<link>http://niklas-rother.de/artikel/spiel-den-profi-coder/</link>
		<comments>http://niklas-rother.de/artikel/spiel-den-profi-coder/#comments</comments>
		<pubDate>Sat, 24 Sep 2011 10:46:32 +0000</pubDate>
		<dc:creator>Niklas</dc:creator>
				<category><![CDATA[Ideen & Gedanken]]></category>
		<category><![CDATA[Interressantes]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[brainfuck]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[grub]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://niklas-rother.de/?p=1453</guid>
		<description><![CDATA[Uhh&#8230; Schon wieder langen nichts geschrieben. Ich habe wirklich zu viel zu tun Naja, etwas kleines neues gibt es doch: Ein Freund fragte mich, ob ich noch diese Website kenne, wo man beliebigen Text eingeben kann, und er dann zum &#8230; <a href="http://niklas-rother.de/artikel/spiel-den-profi-coder/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Uhh&#8230; Schon wieder langen nichts geschrieben. Ich habe wirklich zu viel zu tun <img src='http://niklas-rother.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Naja, etwas kleines neues gibt es doch: Ein Freund fragte mich, ob ich noch diese Website kenne, wo man beliebigen Text eingeben kann, und er dann zum Linux Quelltext würde. Scheinbar hat er das was verwechselt, ich kann mich jedenfalls nicht daran erinnern eine solche Seite gekannt zu haben <img src='http://niklas-rother.de/wp-includes/images/smilies/icon_eek.gif' alt='8-O' class='wp-smiley' /> </p>
<p>Jedenfalls hat er mich auf die Idee gebracht sowas mal zu programmieren, und das ist dabei herausgekommen:</p>
<p><a href="http://niklas-rother.de/wp-content/uploads/2011/09/screenshot.png" rel="shadowbox[sbpost-1453];player=img;" title="screenshot"><img style=' display: block; margin-right: auto; margin-left: auto;'  class="aligncenter size-large wp-image-1454" title="screenshot" src="http://niklas-rother.de/wp-content/uploads/2011/09/screenshot-1024x499.png" alt="" width="640" height="311" /></a>Geht einfach auf diese Website, und zeigt allen, dass ihr den Linux Kernel aus dem Kopf schreiben könnt:</p>
<p><a href="http://niklas-rother.de/wp-content/uploads/2011/09/linux_coding.html"><strong>Update:</strong> </a><a href="http://niklas-rother.de/wp-content/uploads/2011/09/linux_coding1.html">Neue Version: Be a Pro Coder/Hacker</a></p>
<p><a href="http://niklas-rother.de/wp-content/uploads/2011/09/linux_coding.html">Be a Linux Coder/Hacker</a></p>
<p><span id="more-1453"></span></p>
<p>Der Quelltext den ihr da schreibt stammt aus dem Linux Kernel, aus /kernel/irq/irqdesc.c. Ihr könnt die Seite gerne speichern und den Text ändern, aber er muss vorher für JavaScript escaped werden, und alle Zeilenumbrüche müssen natürlich durch ein &lt;br&gt; ersetzt werden.</p>
<p>Vorschläge für noch &#8220;schlimmere&#8221; Quelldateien im Kernel werden gerne angenommen, aber das Ding ist sauber geschrieben, ich musste schon richtig nach einer &#8220;komplizierten&#8221; Datei suchen. Ach: Der Kernel ist nicht auf kernel.org sondern auf <a href="https://github.com/torvalds/linux">GitHub</a> zu finden!</p>
<p><strong>UPDATE:</strong> Jetzt könnt ihr euch auch an dem FAT-Treiber aus GRUB oder der 99 Bottles of Beer Version in Brainfuck versuchen <img src='http://niklas-rother.de/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  Und der Bug der in den Kommentaren angesprochen wurde, ist auch weg&#8230;</p>
<br /><a href="http://niklas-rother.de/?p=1453#comments" title="Comments on &quot;Spiel den Profi Coder! [Update]&quot;"><img src="http://niklas-rother.de/wp-content/plugins/feed-comments-number/image.php?1453" alt="Comments" /></a>]]></content:encoded>
			<wfw:commentRss>http://niklas-rother.de/artikel/spiel-den-profi-coder/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Zufälliges Wort mit .NET</title>
		<link>http://niklas-rother.de/artikel/zufalliges-wort-mit-net/</link>
		<comments>http://niklas-rother.de/artikel/zufalliges-wort-mit-net/#comments</comments>
		<pubDate>Tue, 30 Aug 2011 14:24:49 +0000</pubDate>
		<dc:creator>Niklas</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[Tipps & Tricks]]></category>
		<category><![CDATA[proxy]]></category>
		<category><![CDATA[webclient]]></category>
		<category><![CDATA[wikitionary]]></category>
		<category><![CDATA[wort]]></category>
		<category><![CDATA[zufall]]></category>

		<guid isPermaLink="false">http://niklas-rother.de/?p=1437</guid>
		<description><![CDATA[Für eine kleine Spielidee brauchte ich ein rein zufälliges Wort. Klingt im ersten Moment etwas trivial, doch woher soll man die Wörter nehmen? Es geht nicht um zufällige Buchstabenkombinationen, sondern um sinnvolle Wörter, am besten Substantive. Die Lösung war dann &#8230; <a href="http://niklas-rother.de/artikel/zufalliges-wort-mit-net/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Für eine kleine Spielidee brauchte ich ein rein zufälliges Wort. Klingt im ersten Moment etwas trivial, doch woher soll man die Wörter nehmen? Es geht nicht um zufällige Buchstabenkombinationen, sondern um sinnvolle Wörter, am besten Substantive.</p>
<p>Die Lösung war dann das <a href="http://de.wikitionary.org">Wikitionary</a>: Das hat, wie jedes auf MediaWiki basierendes Wiki eine API. Dort kann man zwar auch eine zufällige Seite (=Wort) abrufen, aber eben nicht aus einer bestimmten Kategorie. Ich wollte nun aber nur deutsche Substantive. Durch etwas rumsurfen bin dann auch folgende Lösung gekommen:</p>
<p><span id="more-1437"></span></p>
<pre class="brush: csharp; title: ; notranslate">
private static string GetRandomNoun()
{
StringBuilder sb = new StringBuilder(3);
for (int i = 0; i &lt; 3; i++)
{
sb.Append(alphabet[random.Next(26)]);
}

WebClient wc = new WebClient();
wc.Proxy = null;
wc.Headers.Add(HttpRequestHeader.UserAgent, &quot;info@niklas-rother.de&quot;);
string response = wc.DownloadString(String.Format(&quot;http://de.wiktionary.org/w/api.php?action=query&amp;list=categorymembers&amp;cmtitle=Category:Substantiv_%28Deutsch%29&amp;cmsort=sortkey&amp;cmstartsortkey={0}&amp;cmlimit=1&amp;format=xml&quot;, sb.ToString()));

XmlDocument doc = new XmlDocument();
doc.LoadXml(response);

return doc[&quot;api&quot;][&quot;query&quot;][&quot;categorymembers&quot;][&quot;cm&quot;].Attributes[&quot;title&quot;].InnerText;
}
</pre>
<p>Das wichtigste ist dabei DownloadString(), hier wird eine Abfrage an die Wikitionary API gestellt. Dabei wird eine Liste der Kategoriemember abgefragt, doch mit einem kleinen Trick: <em>cmstartsortkey</em> wird auf ein zufälliges Buchstaben-Trippel gesetzt, und dadurch wird nur der Eintrag zurückgegeben, der diesen drei Buchstaben lexikographisch folgt. Man kann auch noch mehr Buchstaben benutzten, aber mit drei Buchstaben sollte man schon viele Wörter erwischen.</p>
<p>Kurze Rechnung: Die Kategorie Substantiv (Deutsch) hat 34.390 Seiten. Aus 3 mal 26 Buchstaben kann man 26<sup>3</sup> = 17.576 Kombinationen machen. Das sind 51%. Man erwischt also theoretisch die Hälfte der Wörter, das sollte reichen. (Ja, ich mag Mathe <img src='http://niklas-rother.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> )</p>
<p>Ein paar kleine Fallstricke gibt es noch: Die Wikitionary API will <strong>unbedingt einen UserAgent</strong> haben, also muss man einen setzen, wie oben gesehen. Dort sollte am besten eine Adresse für Beschwerden drin sein, falls sich ein Programm mal selbständig macht&#8230;</p>
<p>Und auch .NET hat noch eine kleine Eigenheit: Wenn man eine neue Instanz von WebClient das erste Mal benutzt, wird versucht einen Proxy zu finden. Das kann bis zu 30sec dauern. Will man nicht warten, setzt man die Eigenschaft Proxy einfach auf null, und verscherzt es sich mit Leuten, die einen Proxy nutzen&#8230;</p>
<p>Und zum Abschluss gibt es noch ein schönes Zufälliges Wort: <em>Presslufthammer</em>! <img src='http://niklas-rother.de/wp-includes/images/smilies/icon_rolleyes.gif' alt=':roll:' class='wp-smiley' /> </p>
<br /><a href="http://niklas-rother.de/?p=1437#comments" title="Comments on &quot;Zufälliges Wort mit .NET&quot;"><img src="http://niklas-rother.de/wp-content/plugins/feed-comments-number/image.php?1437" alt="Comments" /></a>]]></content:encoded>
			<wfw:commentRss>http://niklas-rother.de/artikel/zufalliges-wort-mit-net/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Freien Speicher mit Munin überwachen</title>
		<link>http://niklas-rother.de/artikel/freien-speicher-mit-munin-uberwachen/</link>
		<comments>http://niklas-rother.de/artikel/freien-speicher-mit-munin-uberwachen/#comments</comments>
		<pubDate>Fri, 12 Aug 2011 13:45:12 +0000</pubDate>
		<dc:creator>Niklas</dc:creator>
				<category><![CDATA[Betriebsyteme]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[free]]></category>
		<category><![CDATA[munin]]></category>
		<category><![CDATA[Plugin]]></category>
		<category><![CDATA[speicher]]></category>

		<guid isPermaLink="false">http://niklas-rother.de/?p=1417</guid>
		<description><![CDATA[So, zurück aus dem Urlaub, da kann es ja weitergehen mit dem bloggen Wer Munin zum überwachen seine(r/s) Server(s) benutzt (wie ich) kennt wahrscheinlich auch den Graph, der die Speicherauslastung anzeigt. Der sieht ungefähr so aus: Aber ganz ehrlich: Ich &#8230; <a href="http://niklas-rother.de/artikel/freien-speicher-mit-munin-uberwachen/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>So, zurück aus dem Urlaub, da kann es ja weitergehen mit dem bloggen <img src='http://niklas-rother.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Wer <a href="http://munin-monitoring.org/">Munin</a> zum überwachen seine(r/s) Server(s) benutzt (wie ich) kennt wahrscheinlich auch den Graph, der die Speicherauslastung anzeigt. Der sieht ungefähr so aus:</p>
<p><a href="http://niklas-rother.de/wp-content/uploads/2011/08/memory-month.png" rel="shadowbox[sbpost-1417];player=img;" title="memory-month"><img style=' float: left; padding: 4px; margin: 0 7px 2px 0;'  class="size-medium wp-image-1418 alignleft" title="memory-month" src="http://niklas-rother.de/wp-content/uploads/2011/08/memory-month-300x255.png" alt="" width="300" height="255" /></a>Aber ganz ehrlich: Ich steige da nicht durch&#8230; Zum einen ist der Graph blöd skaliert (ich habe nur 200MB RAM, aber er geht bis 25GB), und man kann auch nicht wirklich erkennen, ob man nun noch Speicher hat oder nicht.</p>
<p>Also dachte ich mir, bauen ich doch mein <a title="These points of data make a beautifull line… Speicherverbrauch von Debian überwachen und als Diagramm darstellen" href="http://niklas-rother.de/artikel/these-points-of-data-make-a-beautifull-line-speicherverbrauch-von-debian-uberwachen-und-als-diagramm-darstellen/">altes Skript</a> etwas um, und integriere es in Munin. Das ist gar nicht schwer, denn es gibt natürlich eine passende <a href="http://munin-monitoring.org/wiki/HowToWritePlugins">Anleitung</a>.</p>
<p><span id="more-1417"></span></p>
<p>Also das Skript ein bisschen umgeschrieben, und fertig ist das Ding. Um es in Munin zu integrieren muss es natürlich ausführbar gemacht werden (<em>chmod a+x file</em>) und unter <em>/etc/munin/plugins</em> ein Link auf die Datei angelegt werden. Danach noch <em>munin-node</em> neustarten, und fertig ist das eigene Plugin.</p>
<p>Überwacht werden der vorhandene und benutzte RAM und Swap. Die Daten werden aus der Ausgabe von free gewonnen. Ein Bild kann ich leider noch nicht zeigen, ich habe das ja selber erst seit 30min laufen&#8230; Aber ich hoffe doch auf ein besseres Bild als das da oben. Hier ist also der komplette Code:</p>
<pre class="brush: bash; title: ; notranslate">

#!/bin/sh

#Munin Plugin to monitor the ouput of free
#Written by Niklas Rother 2011

case $1 in
config)
cat &lt;&lt;'EOM'
graph_title Memory ussage
graph_vlabel Vytes
RAM_total.label Total RAM
RAM_used.label Used RAM
Swap_total.label Total Swap
Swap_used.label Used Swap
graph_args --base 1024 -l 0
graph_scale yes
graph_category other
graph_info This graph shows some values of the output of &quot;free&quot;. The buffer/cache adjusted values are used.
RAM_total.info The total ammount of build in RAM (free total colum)
RAM_used.info The ammount of RAM currently used by processes (excluding buffers and caches)
Swap_total.info The total ammount of availible available Swap
Swap_used.info The ammount of Swap currently used by processes
EOM
exit 0;;
esac

echo -n &quot;RAM_total.value &quot;
free|grep Mem:|awk '{ print $2 }'

echo -n &quot;RAM_used.value &quot;
free|grep cache:|awk '{ print $3 }'

echo -n &quot;Swap_total.value &quot;
free|grep Swap:|awk '{ print $2 }'

echo -n &quot;Swap_used.value &quot;
free|grep Swap:|awk '{ print $3 }'
</pre>
<br /><a href="http://niklas-rother.de/?p=1417#comments" title="Comments on &quot;Freien Speicher mit Munin überwachen&quot;"><img src="http://niklas-rother.de/wp-content/plugins/feed-comments-number/image.php?1417" alt="Comments" /></a>]]></content:encoded>
			<wfw:commentRss>http://niklas-rother.de/artikel/freien-speicher-mit-munin-uberwachen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Statusupdate 2</title>
		<link>http://niklas-rother.de/artikel/statusupdate-2/</link>
		<comments>http://niklas-rother.de/artikel/statusupdate-2/#comments</comments>
		<pubDate>Fri, 24 Jun 2011 15:05:44 +0000</pubDate>
		<dc:creator>Niklas</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Ideen & Gedanken]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[XNA]]></category>
		<category><![CDATA[.Net]]></category>
		<category><![CDATA[key-mon]]></category>
		<category><![CDATA[lua]]></category>
		<category><![CDATA[nKF]]></category>
		<category><![CDATA[projekte]]></category>
		<category><![CDATA[yame]]></category>

		<guid isPermaLink="false">http://niklas-rother.de/?p=1392</guid>
		<description><![CDATA[Mal wieder ein paar Dinge, an denen ich grade so arbeite: Zum einen ist da YaME: Yet another Minecraft Engine. Hier ein kleines Video: Ich wollte mal etwas in 3D mit XNA machen, und habe aus Spaß dieses Projekt angefangen. &#8230; <a href="http://niklas-rother.de/artikel/statusupdate-2/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://niklas-rother.de/artikel/statusbericht/">Mal wieder</a> ein paar Dinge, an denen ich grade so arbeite:</p>
<p>Zum einen ist da <strong>YaME</strong>: Yet another Minecraft Engine. Hier ein kleines Video:</p>
<p><object width="640" height="505"><param name="movie" value="http://www.youtube.com/v/1zJohMZ1IJo?version=3"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/1zJohMZ1IJo?version=3" type="application/x-shockwave-flash" width="640" height="505" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p>Ich wollte mal etwas in 3D mit XNA machen, und habe aus Spaß dieses Projekt angefangen. Momentan gibt es schon endlose Landschaften (zumindest bis der Speicher voll ist <img src='http://niklas-rother.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> ), und die Framerate ist noch akzeptabel. Ich werde wohl zumindest noch bessere Grafiken und etwas Physik einbauen, zusammen mit einem besseren Renderer (Octrees und Occlusion Culling wäre super)</p>
<p>Dann bin ich grade dabei das <strong><a href="http://code.google.com/p/luainterface/">LuaInterface</a> um die Fähigkeiten der DLR zu erweitern</strong>. Microsoft hat mit .NET 4 eine bessere Interoperabilität mit Scriptsprachen eingebaut: Mit dem Schlüsselwort &#8220;dynamic&#8221; kann man Objekte definieren, die z.B deren genaues &#8220;Aussehen&#8221; erst zu Laufzeit festgelegt wird. Außerdem ist es damit möglich viele expliziete Konvertierungen wegzulassen. Das passt natürlich wunderbar zu Lua, und dem LuaInterface, mit dem man schon jetzt sehr elegant aus .NET auf Lua zugreifen kann. Kleines Code-Beispiel gefällig?</p>
<p><span id="more-1392"></span></p>
<pre class="brush: csharp; title: ; notranslate">

dynamic lua = new DynamicLua();
lua(&quot;function test() return 'hello from lua' end&quot;);
lua.test2 = new Action(() =&gt; return &quot;hello from c#&quot;);
Console.WriteLine(lua.test());
Console.WriteLine(lua.test2());
</pre>
<p>Aus lua.DoString(&#8220;bla&#8221;) wird ein einfaches lua(&#8220;bla&#8221;), Variablen lassen sich einfach als Eigenschaften von lua verwenden, und die Zuweisung sowie der Aufruf von C#-Methoden ist einfach möglich. Obwohl jeder Aufruf einer Lua Method immer ein object-Array zurückgibt, ist eine einfache Verwendung in WriteLine() möglich, es wird automatisch in einen String umgewandelt.</p>
<p>Der größte Teil der &#8220;Magie&#8221; wird dabei vom LuaInterface übernommen, ich habe dem ganzen nur ein modernes Gewand in Form eines &#8220;dynamischen&#8221; Objektes übergestülpt. Momentan arbeite ich noch daran ein paar Fehler auszumerzen. Ich habe das <strong>LuaInterface überings auch mit dem .Net Framework 4 kompatibel gemacht</strong>. Je nachdem wie hartnäckig die Fehler noch sind, dürfte das Projekt bald fertig sein.</p>
<p><a href="http://niklas-rother.de/wp-content/uploads/2011/06/2x-no-mouse-meta1.png" rel="shadowbox[sbpost-1392];player=img;" title="2x-no-mouse-meta"><img style=' float: right; padding: 4px; margin: 0 0 2px 7px;'  class="alignright size-medium wp-image-1393" title="2x-no-mouse-meta" src="http://niklas-rother.de/wp-content/uploads/2011/06/2x-no-mouse-meta1-300x50.png" alt="" width="300" height="50" /></a>Als drittes überlege ich grade, so etwas wie <strong><a href="http://code.google.com/p/key-mon/">key-mon</a> für Windows</strong> zu schreiben. Die Linux Version ist sicher für Screencast ziemlich praktisch&#8230; Mit dem <a href="http://nkreipke.wordpress.com/projekte/nkf/">nKF</a> und dem <a href="http://nkreipke.wordpress.com/projekte/keyboardbuttonselector/">KeyboardButton Selektor</a> sollte sich da was machen lassen&#8230; Ich bin echt schockiert, das es sowas für Windows nicht gibt?!</p>
<p>Ich habe mir irgendwie zu viel vorgenommen <img src='http://niklas-rother.de/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' />  Naja, bald sind ja Ferien, da habe ich dann genug Zeit mich darum mal zu kümmern.</p>
<br /><a href="http://niklas-rother.de/?p=1392#comments" title="Comments on &quot;Statusupdate 2&quot;"><img src="http://niklas-rother.de/wp-content/plugins/feed-comments-number/image.php?1392" alt="Comments" /></a>]]></content:encoded>
			<wfw:commentRss>http://niklas-rother.de/artikel/statusupdate-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Würfel mit nur 12 Vertices texturieren</title>
		<link>http://niklas-rother.de/artikel/wurfel-mit-nur-12-vertices-texturieren/</link>
		<comments>http://niklas-rother.de/artikel/wurfel-mit-nur-12-vertices-texturieren/#comments</comments>
		<pubDate>Fri, 03 Jun 2011 12:23:41 +0000</pubDate>
		<dc:creator>Niklas</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[XNA]]></category>
		<category><![CDATA[3D]]></category>
		<category><![CDATA[textur]]></category>
		<category><![CDATA[vertex]]></category>
		<category><![CDATA[würfel]]></category>

		<guid isPermaLink="false">http://niklas-rother.de/?p=1363</guid>
		<description><![CDATA[Hat mich grade etwas nachdenken gekostet: Wie muss man die Texturkoordinaten eines Würfels setzen, damit auf allen Seiten die gleiche Textur zu sehen ist? Mit nur acht Vertices geht es nicht (für jede Ecke einer), aber mit 12 geht es: &#8230; <a href="http://niklas-rother.de/artikel/wurfel-mit-nur-12-vertices-texturieren/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Hat mich grade etwas nachdenken gekostet:</p>
<p>Wie muss man die Texturkoordinaten eines Würfels setzen, damit auf allen Seiten die gleiche Textur zu sehen ist?</p>
<p>Mit nur acht Vertices geht es nicht (für jede Ecke einer), aber mit 12 geht es:</p>
<p><a href="http://niklas-rother.de/wp-content/uploads/2011/06/cube.png" rel="shadowbox[sbpost-1363];player=img;" title="cube"><img style=' display: block; margin-right: auto; margin-left: auto;'  class="aligncenter size-medium wp-image-1364" title="cube" src="http://niklas-rother.de/wp-content/uploads/2011/06/cube-300x265.png" alt="" width="300" height="265" /></a>Man verzeihe meine Paint-Künste&#8230; Die hinteren Vertices müssen doppelt vorhanden sein, die obere und untere Seite wird dann mit diesen Vertices generiert. Die Farben geben die Texturkoordinaten an, die Zahlen an den Ecken sind die Nummern der Vertices. Weil ich ja so nett bin, gibt es die passenden Indices jetzt auch noch dazu:</p>
<pre class="brush: csharp; title: ; notranslate">

&lt;span id=&quot;more-1363&quot;&gt;&lt;/span&gt;

int[] indices = new int[] {
 0, 1, 2, 2, 3, 0, //vorne
 1 ,8 ,9 ,9 ,2 ,1, //oben
 2 ,6 ,7 ,7 ,3 ,2, //rechts
 10 ,0 ,3 ,3 ,11 ,10, //unten
 4 ,5 ,1 ,1 ,0 ,4, //links
 7 ,6 ,5 ,5 ,4 ,7  //hinten
 };
</pre>
<p>Das ganze ist effizienter, als den Würfel mit 24 oder gar 36 Vertices zu definieren, grade wenn man <em>viele </em>davon braucht <img src='http://niklas-rother.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Bald gibts auch einen Post darüber, was ich mit vielen Würfeln will&#8230;</p>
<br /><a href="http://niklas-rother.de/?p=1363#comments" title="Comments on &quot;Würfel mit nur 12 Vertices texturieren&quot;"><img src="http://niklas-rother.de/wp-content/plugins/feed-comments-number/image.php?1363" alt="Comments" /></a>]]></content:encoded>
			<wfw:commentRss>http://niklas-rother.de/artikel/wurfel-mit-nur-12-vertices-texturieren/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Neues Projekt: XNA FAQ</title>
		<link>http://niklas-rother.de/artikel/neues-projekt-xna-faq/</link>
		<comments>http://niklas-rother.de/artikel/neues-projekt-xna-faq/#comments</comments>
		<pubDate>Wed, 11 May 2011 15:49:57 +0000</pubDate>
		<dc:creator>Niklas</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[Interressantes]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[XNA]]></category>
		<category><![CDATA[faq]]></category>
		<category><![CDATA[projekt]]></category>

		<guid isPermaLink="false">http://niklas-rother.de/?p=1350</guid>
		<description><![CDATA[Fast hätte ich vergessen, darüber zu bloggen: Ich habe einen neue Website gestartet, das XNA FAQ. Ich zitiere mal von der Startseite: Nach dem im XNA.mag immer mal wieder die Frage nach einer FAQ Sammlung laut wurde, da die gleichen &#8230; <a href="http://niklas-rother.de/artikel/neues-projekt-xna-faq/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Fast hätte ich vergessen, darüber zu bloggen: Ich habe einen neue Website gestartet, das <a href="http://xnafaq.niklas-rother.de/">XNA FAQ</a>. Ich zitiere mal von der Startseite:</p>
<div>
<blockquote><p>Nach dem im<a href="http://www.xnamag.de/"> XNA.mag</a> immer mal wieder die Frage nach einer FAQ Sammlung laut wurde, da die  gleichen Fragen immer wieder gestellt werden, habe ich mich jetzt  entschieden, einfach mal einen Versuch zu starten, und habe diese  Website gestartet.</p>
<p>Momentan ist hier noch nicht besonders viel zu lesen, was auch daran  liegt, dass ich noch alleine bin. Wer also hier mithelfen will, kann  mich gerne fragen (s. <a href="http://xnafaq.niklas-rother.de/contact.html">Kontakt</a>).</p>
<p>Ich hoffe mit diesem Projekt eine Sammlung von relativ kurzen  Antworten zu bieten, die häufig gestellte Fragen kurz beantworten, oder,  sollte dies nicht möglich sein, einen Anhaltspunkt bieten in welche  Richtung man die Lösung findet. Das ist aber auch nur ein grobes  Konzept, das ich auch gerne nach Bedarf anpassen werde.</p>
<p><span id="more-1350"></span></p>
<p>Ich hoffe im Grunde, dass ich hier nicht besonders aktiv sein muss  (dafür ist meine Zeit nämlich reichlich knapp), sondern ich will hier  nur einen Grundstein legen, und hoffe das sich dieses Projekt im  weiteren Verlauf von selbst, also durch eine Community trägt.</p></blockquote>
<p><a href="http://niklas-rother.de/wp-content/uploads/2011/05/xnafaq.png" rel="shadowbox[sbpost-1350];player=img;" title="xnafaq"><img style=' display: block; margin-right: auto; margin-left: auto;'  class="aligncenter size-large wp-image-1352" title="xnafaq" src="http://niklas-rother.de/wp-content/uploads/2011/05/xnafaq-1024x475.png" alt="" width="640" height="296" /></a></p>
<p>Es ist also nur ein Versuch, und momentan mangelt es auch noch an aktiven Autoren, aber ich hoffe doch, dass ich Anfängern damit ein paar Fragen beantworten kann, und Fortgeschrittenen ein paar Stichworte geben kann, mit denen man einen Einstieg in bestimmte Themen findet.</p>
<p>Wer also etwas Ahnung von XNA hat, und gerne FAQs schreiben will: Einfach anmelden, ich schalte euch dann frei. Auch C# Fragen (die aber im weitesten Sinne mit Spielprogrammierung zu tun haben) können gerne aufgenommen werden. Und auch, wer keine Ahnung von XNA hat, kann gerne eine &#8220;Frage stellen&#8221;, ich bzw. die anderen Autoren werden sie dann beantworten. <strong>Auch diese Arbeit ist ein große Hilfe!</strong> Denn wer weiß besser, welche Fragen Anfänger haben, als die Anfänger selber?</p>
<p>Noch mal ein großes Danke für das Theme an &#8220;<a href="http://blog.dannz.net/">dannz</a>&#8220;, und der Aufruf, Feedback hier als Kommentar zu hinterlassen <img src='http://niklas-rother.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
</div>
<br /><a href="http://niklas-rother.de/?p=1350#comments" title="Comments on &quot;Neues Projekt: XNA FAQ&quot;"><img src="http://niklas-rother.de/wp-content/plugins/feed-comments-number/image.php?1350" alt="Comments" /></a>]]></content:encoded>
			<wfw:commentRss>http://niklas-rother.de/artikel/neues-projekt-xna-faq/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Snoopy und der Refresh-Header</title>
		<link>http://niklas-rother.de/artikel/snoopy-und-der-refresh-header/</link>
		<comments>http://niklas-rother.de/artikel/snoopy-und-der-refresh-header/#comments</comments>
		<pubDate>Wed, 16 Feb 2011 17:02:07 +0000</pubDate>
		<dc:creator>Niklas</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[Bug]]></category>
		<category><![CDATA[refresh]]></category>
		<category><![CDATA[snoopy]]></category>

		<guid isPermaLink="false">http://niklas-rother.de/?p=1238</guid>
		<description><![CDATA[Nein, um diesen Snoopy geht es nicht. (Aber ich wollte mal wieder ein Bild einbauen Sondern um die PHP Klasse mit dem gleichen Namen, die einen Webbrowser in simuliert. Damit kann man z.B. in PHP den Inhalt einer anderen Seite &#8230; <a href="http://niklas-rother.de/artikel/snoopy-und-der-refresh-header/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a title="Snoopy pompiere von Gianfranco Goria bei Flickr" href="http://www.flickr.com/photos/gianfrancogoria/5033589271/"><img style=' float: left; padding: 4px; margin: 0 7px 2px 0;'  class="alignleft" src="http://farm5.static.flickr.com/4109/5033589271_bf3d4ff443.jpg" alt="Snoopy pompiere" width="243" height="300" /></a>Nein, um diesen Snoopy geht es nicht. (Aber ich wollte mal wieder ein Bild einbauen <img src='http://niklas-rother.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  Sondern um die PHP Klasse mit dem gleichen Namen, die einen Webbrowser in simuliert. Damit kann man z.B. in PHP den Inhalt einer anderen Seite abrufen, ohne sich um die Implementierung zu kümmern. Zusätzlich werden z.B. Weiterleitungen auch verfolgt, und Cookies gesetzt.</p>
<p>Und genau da liegt das Problem: Snoopy beachtet nur die beiden Weiterleitungsheader &#8220;Location&#8221; und &#8220;URI&#8221;. Location ist der quasi-Standard, was anderes habe ich noch nicht gesehen.</p>
<p><span id="more-1238"></span></p>
<p>Leider musste Netscape mal wieder sein eigenes Süppchen kochen und hat den <a href="http://en.wikipedia.org/wiki/URL_redirection#Refresh_Meta_tag_and_HTTP_refresh_header">&#8220;Refresh&#8221;-Header</a> erfunden. Dieser Header ermöglicht noch ein paar mehr Sachen, wie Verzögerungen, wird aber fast nicht mehr eingesetzt.</p>
<p>Leider verwenden ihn einige Webanwendungen noch, wenn sie auf einem IIS laufen. Dieser hat nämlich in der Version 5.1 ein Problem mit dem Loacation-Header&#8230; So eine Anwendung ist der Bugtracker Mantis. Und mein Plugin WP-Mantis benutzt eben Snoopy um die Changelogs und Roadmaps abzurufen. Jetzt hat mich vor einiger Zeit ein Benutzer des IIS angeschrieben, und nach einiger Fehlersuche haben wir dann den Fehler in Snoopy gefunden.</p>
<p>Leider hat sich WordPress <a href="http://core.trac.wordpress.org/ticket/16139">geweigert</a>, meinen Fix zu akzeptierten, (Naja, Snoopy ist dort auch veraltet) darum will ich ihn hier noch mal publizieren.</p>
<p>Die Sachen ist ziemlich einfach: Für WordPress muss die wp-includes/class-snoopy.php geändert werden:</p>
<p>Zeile 867 muss so geändert werden:</p>
<pre class="brush: php; title: ; notranslate">
if(preg_match(&quot;/^(Location:|URI:|Refresh:)/i&quot;,$currentHeader))
</pre>
<p>Und Zeile 870 muss wie folgt lauten:</p>
<pre class="brush: php; title: ; notranslate">
preg_match(&quot;/^(Location:|URI:|Refresh:[ ]+[0-9]+;[ ]*url=)[ ]*(.*)/i&quot;,chop($currentHeader),$matches);
</pre>
<p>Wer also WP Mantis auf einem IIS System einsetzt sollte diese Änderung berücksichtigen. So 100%ig sicher bin ich mir bei dem RegEx nicht, er sollte aber funktionieren <img src='http://niklas-rother.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /><br />
Bild © by <a href="http://www.flickr.com/photos/gianfrancogoria/5033589271/">Gianfranco Goria on Flickr</a></p>
<br /><a href="http://niklas-rother.de/?p=1238#comments" title="Comments on &quot;Snoopy und der Refresh-Header&quot;"><img src="http://niklas-rother.de/wp-content/plugins/feed-comments-number/image.php?1238" alt="Comments" /></a>]]></content:encoded>
			<wfw:commentRss>http://niklas-rother.de/artikel/snoopy-und-der-refresh-header/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WP Month Calendar</title>
		<link>http://niklas-rother.de/artikel/wp-month-calendar/</link>
		<comments>http://niklas-rother.de/artikel/wp-month-calendar/#comments</comments>
		<pubDate>Wed, 26 Jan 2011 16:34:42 +0000</pubDate>
		<dc:creator>Niklas</dc:creator>
				<category><![CDATA[Meine Programme]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[Plugin]]></category>
		<category><![CDATA[widget]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[wp month calendar]]></category>

		<guid isPermaLink="false">http://niklas-rother.de/?p=1225</guid>
		<description><![CDATA[Mal wieder ein neues Plugin von mir: WP Month Calendar. Macht was der Name sagt: Es ist eine modifizierte Version des Kalender Widgets, das WordPress schon an Bord hat. Die Version von WordPress stellt immer einen Monat dar, meine ein &#8230; <a href="http://niklas-rother.de/artikel/wp-month-calendar/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Mal wieder ein neues Plugin von <img src="file:///D:/xampp/htdocs/wp/wp-content/plugins/wp-month-calendar/screenshot-1.png" alt="" />mir: <strong>WP Month Calendar</strong>. Macht was der Name sagt: Es ist eine modifizierte Version des Kalender Widgets, das WordPress schon an Bord hat. Die Version von WordPress stellt immer einen Monat dar, meine ein ganzes Jahr, immer mit einem Link pro Mo<a href="http://niklas-rother.de/wp-content/uploads/2011/01/screenshot-1.png" rel="shadowbox[sbpost-1225];player=img;" title="screenshot-1"><img style=' float: left; padding: 4px; margin: 0 7px 2px 0;'  class="alignleft size-medium wp-image-1227" title="screenshot-1" src="http://niklas-rother.de/wp-content/uploads/2011/01/screenshot-1-300x195.png" alt="" width="300" height="195" /></a>nat. Im Tooltip sieht man dann die Beiträge aus diesem Monat.</p>
<p>Das ganze wurde aus Eigenbedarf geschrieben, ich wollte das Widget einsetzen, aber ich schreiben zu wenige Artikel um es zu füllen <img src='http://niklas-rother.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><span id="more-1225"></span></p>
<p>Es ist ganz unten auf der Seite zu sehen. Wenn noch jemand einen Vorschlag hat, immer her damit&#8230; Wäre auch gut, wenn sich jemand den HTML Code anschauen könnte, ich muss die Breite auf 25% setzen, sonst sieht es bescheuert aus, das Original funktioniert aber auch ohne solche Hacks. Leider finde ich den Fehler nicht&#8230;</p>
<p>Wer es benutzen will findet es im WordPress Plugin Directory als <a href="http://wordpress.org/extend/plugins/wp-month-calendar/">WP Month Calendar</a>.</p>
<p>BTW: Shotty, du hast meinen Mauszeiger nicht richtig aufgenommen, ich hovere doch grade über einem Link&#8230;</p>
<br /><a href="http://niklas-rother.de/?p=1225#comments" title="Comments on &quot;WP Month Calendar&quot;"><img src="http://niklas-rother.de/wp-content/plugins/feed-comments-number/image.php?1225" alt="Comments" /></a>]]></content:encoded>
			<wfw:commentRss>http://niklas-rother.de/artikel/wp-month-calendar/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tileset Packer: Details zum Code</title>
		<link>http://niklas-rother.de/artikel/tileset-packer-details-zum-code/</link>
		<comments>http://niklas-rother.de/artikel/tileset-packer-details-zum-code/#comments</comments>
		<pubDate>Wed, 05 Jan 2011 16:49:24 +0000</pubDate>
		<dc:creator>Niklas</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[Tipps & Tricks]]></category>
		<category><![CDATA[bitmap]]></category>
		<category><![CDATA[unsafe]]></category>

		<guid isPermaLink="false">http://niklas-rother.de/?p=1207</guid>
		<description><![CDATA[Wie versprochen gibt es jetzt ein paar Details zum Code des Tileset Packers. Das Programm hat (meiner Meinung nach) ein paar interessante Stellen, die dem einen oder anderen .Net-Coder bestimmt helfen können. Im Grunde hat der Packer drei Probleme zu &#8230; <a href="http://niklas-rother.de/artikel/tileset-packer-details-zum-code/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Wie versprochen gibt es jetzt ein paar Details zum Code des <a href="http://niklas-rother.de/artikel/tilesets-packen/">Tileset Packers</a>. Das Programm hat (meiner Meinung nach) ein paar interessante Stellen, die dem einen oder anderen .Net-Coder bestimmt helfen können.</p>
<p>Im Grunde hat der Packer drei Probleme zu lösen:</p>
<ol>
<li>Das Tileset muss verschnitten werden</li>
<li>Doppelte Tiles müssen aussortiert werden</li>
<li>Das Tileset muss effektiv wieder zusammen gesetzt werden</li>
</ol>
<p>Dazu sollte das Programm natürlich eine gewisse Geschwindigkeit an den Tag legen. Das verschneiden kann man relativ einfach mit <a href="http://msdn.microsoft.com/en-us/library/ms141944.aspx">Bitmap.Clone</a> erledigen, doch das ist sehr langsam, und dazu nimmt die Geschwindigkeit auch noch mit zunehmender Größe der Bitmap ab. (Große Bitmap = langsamer Code). Es musste also eine Alternative her. Durch einen Tipp in einem Forum bin ich dann auf <a href="http://msdn.microsoft.com/en-us/library/5ey6h79d.aspx">Bitmap.LockBits</a> gestoßen, eine Methode die direkt (unsafe) auf die Bitmap zugreift und dadurch sehr schnell ist. Von dieser Methode bekommt man ein BitmapData Objekt, mit dem man über einen Pointer auf die Daten im Arbeitsspeicher zugreifen kann.</p>
<p>Diese Daten verwendet dann die Methode GetHash, die aus den Bitmapdaten einen Hash generiert, mit dem doppelte Tiles aussortiert werden können.</p>
<p><span id="more-1207"></span></p>
<pre class="brush: csharp; title: ; notranslate">

static string GetHash(BitmapData data)
 {
 using (Bitmap tmp = new Bitmap(data.Width, data.Height, data.Stride, data.PixelFormat, data.Scan0))
 {
 using (MemoryStream ms = new MemoryStream())
 {
 tmp.Save(ms, ImageFormat.Bmp);
 rawData = ms.ToArray();
 }
 }

 for (int i = 54; i &lt; rawData.Length; i++) //the first 54 byte are the bitmap header
 {
 rawData[i] &amp;= 252; //1111 1100 letzden bits auf null setzen
 }

 return BitConverter.ToString(md5.ComputeHash(rawData, 54, rawData.Length - 54));
 }
</pre>
<p>Dazu wird zunächst direkt aus den Daten (auf die der Pointer Scan0 zeigt) eine neue Bitmap erstellt (sehr praktisch, dieser Konstruktor <img src='http://niklas-rother.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> ), die dann in einem Memory-Stream geschrieben wird. Zwar kann man auch direkt auf die Daten in Scan0 zugreifen, aber diese sind scheinbar mit Nullen aufgefüllt. Das Array, auf das Scan0 zeigt ist zumindest viel zu groß und enthält extrem viele Nullen (neben den richtigen Daten).</p>
<p>Eine Bitmap hat leider eine 54 Byte großen Header, der im nächsten Schritt übersprungen werden muss. Normalerweise existiert dafür das Format ImageFormat.MemoryBitmap, das sich aber zum speichern scheinbar nicht benutzen lässt (Null-Exception). Laut <a href="http://de.wikipedia.org/wiki/Windows_Bitmap">Wikipedia</a> kann der Header auch größer sein, was bei mir aber nie der Fall war.</p>
<p>In der Schleife wird dann schließlich das gesamte Array durchlaufen und bei allen Einträgen die beiden unteren Bits auf 0 gesetzt. Dadurch werden die Zahlen &#8220;gerundet&#8221; und minimaler Abweichungen, die durch Kompression werden nicht mehr als unterschiedliche Tiles gezählt. Danach wird der md5-Hash der Daten als String zurück gegeben.</p>
<p>Danach werden die Bitmapdaten wieder freigegeben. Man beachte, dass die erstellte Bitmap wieder zerstört wird. Stattdessen wird nur das Rectangle, das den Ausschnitt darstellt gespeichert. Das nicht nicht unbedingt das schnellste, aber es ist so relativ einfach, und die Geschwindigkeit ist auch so noch sehr hoch.</p>
<p>Das letzte Problem, das noch gelöst werden muss, ist das effektive packen der Tiles. Nick Gravelyn hat ein wunderbares <a href="http://de.wikipedia.org/wiki/Windows_Bitmap">Programm </a>zu diesem Zweck geschrieben, das ich auch erst verwendet habe. Dazu musste ich aber alle Tiles in Dateien schreiben, was relativ langsam ist, dazu ist das Programm mehr für unterschiedlich große Bilder gedacht. Nach etwas nachdenken bin ich dann auf eine Lösung gekommen, mit der man ausrechnen kann, wie viele Bilder man in eine Reihe packen muss, damit die Seitenlängen des fertigen Bildes minimal ist: Perfekt wäre √(TileCount), doch die Tiles sollen ja nicht abgeschnitten werden <img src='http://niklas-rother.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> . Also wird die Zahl aufgerundet. Dadurch muss die andere Seite etwas kürzer werden. Das fertige Bild hat dann folgende Seitenlängen:</p>
<pre class="brush: csharp; title: ; notranslate">

int packedXCount = (int)Math.Ceiling(Math.Sqrt(IDToRectangle.Count)); //IDToRectangle.Count = Anzahl der unterschiedlichen Tiles
 int packedYCount = (int)Math.Ceiling((double)(IDToRectangle.Count) / packedXCount);
</pre>
<p>Auch wenn mir kein Beweis einfällt würde ich vermuten, das diese Lösung perfekt ist, also immer das optimale Ergebnis liefert.</p>
<p>Jetzt müssen die Tiles nur noch kopiert werden (vom alten zum neuen Tileset):</p>
<pre class="brush: csharp; title: ; notranslate">

foreach (KeyValuePair&lt;int, Rectangle&gt; kvp in IDToRectangle)
 {
 //crop rectangle and copy it to the output
 BitmapData tileSetData = TileSetImage.LockBits(kvp.Value, ImageLockMode.ReadOnly, TileSetImage.PixelFormat);
 using (currTile = new Bitmap(tileSetData.Width, tileSetData.Height, tileSetData.Stride, tileSetData.PixelFormat, tileSetData.Scan0))
 {
 packedGraphics.DrawImage(currTile, 32 * packedRowCount, 32 * packedColCount);
 }
 TileSetImage.UnlockBits(tileSetData);

 //PackedRow/Col zählen
 packedRowCount++;
 if (packedRowCount &gt;= packedXCount)
 {
 packedRowCount = 0;
 packedColCount++;
 }

 }
</pre>
<p>Hier wird wieder eine Bitmap erstellt, in dem das Tileset gelocked wird, danach wird die Bitmap auf das neue Tileset gemalt. Dabei werden intern wohl nur die Daten kopiert, sodass das ziemlich schnell funktioniert.</p>
<p>Das waren alle interessanten Stellen, der Rest ist mehr oder weniger Standard. Mir hat das ganze gezeigt, das man auch mit C# Bilder schnell bearbeiten kann, obwohl alles managed ist, also z.B. immer gelocked werden muss. Wem das ganze immer noch zu langsam ist, der kann auch unsafe Code verwenden, bei dem er dann mit den Daten machen kann, was er will.</p>
<br /><a href="http://niklas-rother.de/?p=1207#comments" title="Comments on &quot;Tileset Packer: Details zum Code&quot;"><img src="http://niklas-rother.de/wp-content/plugins/feed-comments-number/image.php?1207" alt="Comments" /></a>]]></content:encoded>
			<wfw:commentRss>http://niklas-rother.de/artikel/tileset-packer-details-zum-code/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Der tKoD Map Editor</title>
		<link>http://niklas-rother.de/artikel/der-tkod-map-editor/</link>
		<comments>http://niklas-rother.de/artikel/der-tkod-map-editor/#comments</comments>
		<pubDate>Wed, 22 Dec 2010 13:42:32 +0000</pubDate>
		<dc:creator>Niklas</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Meine Programme]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[The Kingdom of Darkness]]></category>
		<category><![CDATA[Tipps & Tricks]]></category>
		<category><![CDATA[XNA]]></category>
		<category><![CDATA[editor]]></category>
		<category><![CDATA[weihnachten]]></category>

		<guid isPermaLink="false">http://niklas-rother.de/?p=1170</guid>
		<description><![CDATA[Jetzt sind ja Ferien, und da hat man wenigstens mal Zeit an seinem Hobbyprojekt weiterzuarbeiten Ich habe die Zeit dazu genutzt dem Editor zu meinem Spiel mal ein paar neue Features zu verpassen: Es gibt einen Scripteditor der auf ScintillaNet &#8230; <a href="http://niklas-rother.de/artikel/der-tkod-map-editor/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Jetzt sind ja Ferien, und da hat man wenigstens mal Zeit an seinem Hobbyprojekt weiterzuarbeiten <img src='http://niklas-rother.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  Ich habe die Zeit dazu genutzt dem Editor zu meinem Spiel mal ein paar neue Features zu verpassen:</p>
<p><a href="http://niklas-rother.de/wp-content/uploads/2010/12/Screenshot133.png" rel="shadowbox[sbpost-1170];player=img;" title="Screenshot133"><img style=' float: left; padding: 4px; margin: 0 7px 2px 0;'  class="alignleft size-medium wp-image-1171" title="Screenshot133" src="http://niklas-rother.de/wp-content/uploads/2010/12/Screenshot133-300x240.png" alt="" width="300" height="240" /></a>Es gibt einen Scripteditor der auf <a href="http://scintillanet.codeplex.com/">ScintillaNet </a>basiert, und den Inhalt auch an einen externen Editor senden kann. Dazu gibt es eine ComboBox für die Hintergrundmusik und ein DataGridView, das an ein Dictionary gebunden ist, wodurch man eigene Schlüssel-Wert-Paare festlegen kann.</p>
<p>Das ganze kann auch in eine Datei geschrieben werden und wird auch korrekt wieder ausgelesen.</p>
<p><span id="more-1170"></span></p>
<p>Um die Karte in das Spiel zu bringen, kann man sie als xml-Datei exportieren. Leider ist der Renderer des Spiels noch etwas instabil, so dass man die Karte nicht direkt laden kann, da sie kleiner als der Bildschirm ist&#8230;</p>
<p>Als nächstes muss ich wohl mal einen ContentImporter für die xmap-Dateien schreiben, die der Editor ausspuckt. Da fände ich es noch super, wenn man aus dem Spiel direkt die Ansicht an den Editor schicken kann, und von dort die bearbeitete Version zurück in die Engine senden kann. Mal sehen, wie man das machen kann. Und auch sonst fehlen dem Editor leider noch ein paar Funktionen, die die Engine schon unterstützt wie NPCs und Tile Events&#8230;</p>
<p>Damit jetzt keiner denkt, ich wollte nur mit meinem Editor angeben oder müsste mal wieder einen Post schreiben obwohl es eigentlich nichts wichtiges gibt, (Was natürlich in keinster Weise stimmt <img src='http://niklas-rother.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> ) gibt es jetzt auch noch einen Tipp:</p>
<p>Mein Editor basiert auf dem Unterbau von <a href="http://nandosoft.com/downloads.html">EvilNando</a>, wer also auf der Suche nach einem sehr guten, erweiterbaren Editor auf C#/XNA Basis ist, wird dort fündig werden. Leider verwendet der Editor noch XNA 3.1, doch mit etwas Arbeit kann man ihn auf XNA 4 portieren. Wenn daran Interesse besteht kann ich auch darüber mal einen Post schreiben <img src='http://niklas-rother.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Ich wünsche jedenfalls allen Lesern schon mal ein <strong>entspanntes Weihnachtsfest</strong> und gebe noch einen Ratschlag meines Lehrers zu Silvester auf den Weg: <em>&#8220;Erst knallen, dann saufen!&#8221;</em> <img src='http://niklas-rother.de/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<br /><a href="http://niklas-rother.de/?p=1170#comments" title="Comments on &quot;Der tKoD Map Editor&quot;"><img src="http://niklas-rother.de/wp-content/plugins/feed-comments-number/image.php?1170" alt="Comments" /></a>]]></content:encoded>
			<wfw:commentRss>http://niklas-rother.de/artikel/der-tkod-map-editor/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>XNA 4: Probleme mit WinForms</title>
		<link>http://niklas-rother.de/artikel/xna-4-probleme-mit-winforms/</link>
		<comments>http://niklas-rother.de/artikel/xna-4-probleme-mit-winforms/#comments</comments>
		<pubDate>Tue, 14 Dec 2010 17:37:23 +0000</pubDate>
		<dc:creator>Niklas</dc:creator>
				<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[Tipps & Tricks]]></category>
		<category><![CDATA[XNA]]></category>
		<category><![CDATA[lösungen]]></category>
		<category><![CDATA[probleme]]></category>
		<category><![CDATA[texture]]></category>
		<category><![CDATA[xna 4.0]]></category>

		<guid isPermaLink="false">http://niklas-rother.de/?p=1160</guid>
		<description><![CDATA[Nachdem mein anderer Beitrag über Probleme und Lösungen bei XNA 4.0 Upgrade ja scheinbar ein paar Leuten geholfen hat, gibt es jetzt das gleiche nochmal für XNA in Kombination mit Windows Forms, wie es ja oft bei Editoren zu finden &#8230; <a href="http://niklas-rother.de/artikel/xna-4-probleme-mit-winforms/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Nachdem mein anderer Beitrag über <a href="http://niklas-rother.de/artikel/hurden-fur-das-upgrade-auf-xna-4-0-und-wie-man-sie-umgeht/">Probleme und Lösungen bei XNA 4.0 Upgrade</a> ja scheinbar ein paar Leuten geholfen hat, gibt es jetzt das gleiche nochmal für XNA in Kombination mit Windows Forms, wie es ja oft bei Editoren zu finden ist. Ich baue meinen Editor auf <a href="http://nandosoft.com/downloads.html">diesem soliden Gerüst</a> auf, und wollte jetzt auch hier langsam mal auf XNA 4 wechseln. Was gab es also für Probleme?</p>
<p><strong>Die Klasse <em>Color</em> befindet sich jetzt nicht mehr unter XNA.Framework.Graphics, </strong>sonder nur noch unter XNA.Framework. Das für u.U. zu Problemen mit den usings, da es ja auch Windows.Forms.<em>Color</em> gibt. Hier ist der Trick, das man bei using auch einen alternative Namen angeben kann:</p>
<p><span id="more-1160"></span></p>
<pre class="brush: csharp; title: ; notranslate">
using XNA = Microsoft.XNA.Framework
</pre>
<p>Damit kann man jetzt z.B. mit XNA.Color auf die richtige Klasse zugreifen.</p>
<p><strong>Das alte GraphicsDeviceSample funktioniert nicht mehr.</strong> Viele werden ihre WinForms Integration auf <a href="http://create.msdn.com/en-US/education/catalog/sample/winforms_series_1">diesem</a> Sample aus dem AppHub aufbauen, doch durch die Änderungen muss auch hier einiges geändert werden. Glücklicherweise hat Microsoft das schon gemacht, es reicht das Sample nochmal runterzuladen und die jeweiligen Dateien zu ersetzen.</p>
<p><strong>Texure2D.FromFile heißt jetzt Texture2D.FromStream.</strong> Das war auch praktisch schon die gesamte Änderung&#8230; Ist nur eine Änderung des Namens, die Methode hat vorher auch schon Streams akzeptiert&#8230; Jetzt werden aber keine Dateinamen mehr angenommen, diese muss man in ein new FileStream() einbetten.</p>
<p><strong>Texture2D.FromStream skaliert Texturen, die über 2048px groß sind.</strong> Dieses Problem hat mich ein paar Stunden gekostet: Ohne Änderung (s.u.) ist das GraphicsDevice auf das Reach-Profil eingestellt, was ja (wegen dem Windows-Phone) keine Texture zulässt, die größer als 2048px sind (in Höhe oder Breite). Leider werden größere Texturen, wenn man sie über OpenStream lädt nicht einfach mit einem Fehler abgewiesen sondern <em>skaliert</em>. Das führt dann natürlich zu sehr eigenartigen Effekten, wenn man weiterhin mit Pixelkoordinaten darauf zugreift. Mit Shadern gibt es keine Probleme, bei denen gehen die Koordinaten ja immer von 0-1. Eine direkte Lösung gibt es nicht, aber man kann das Profil ändern, wie ich jetzt beschreibe:</p>
<p><strong>Das GraphicsProfil lässt sich nicht auf HiDef ändern.</strong> Bei normalen XNA Games kann man das GraphicsProfil ja in den Eigenschaften ändern, mit der WinForms-Integration fehlt diese Möglichkeit. Die Lösung findet sich in den <a href="http://forums.create.msdn.com/forums/p/65491/401141.aspx#401141">App Hub Foren</a>: In der Datei &#8220;GraphicsDeviceService&#8221; findet man folgenden Code (Z. 65):</p>
<pre class="brush: csharp; highlight: [2]; title: ; notranslate">
graphicsDevice = new GraphicsDevice(GraphicsAdapter.DefaultAdapter,
GraphicsProfile.Reach,
parameters);
</pre>
<p>Dort kann man das Profil wechseln. <img src='http://niklas-rother.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><strong>Das neue Premultiplied-Alpha führt zu Darstellungsproblemen.</strong> Diese Probleme habe noch nicht ganz behoben, aber es sollte da keine große Probleme geben, da ich ja auch schon mal in meinem <a href="http://niklas-rother.de/artikel/hurden-fur-das-upgrade-auf-xna-4-0-und-wie-man-sie-umgeht/">anderem Post</a> beschrieben hatte, was sich geändert hat. Diese Änderung führt momentan bei mir nur zu ein paar weißen &#8220;Schatten&#8221;, was schon aber eigentlich ganz gut aus sieht <img src='http://niklas-rother.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Auch hier muss ich wieder sagen: Gute Arbeit, XNA Team! Gute Änderungen eingebaut, aber trotzdem die API nicht elementar geändert. Nur der ärgerliche Effekt mit den Texturen ist meiner Meinung nach blöd gelöst.</p>
<br /><a href="http://niklas-rother.de/?p=1160#comments" title="Comments on &quot;XNA 4: Probleme mit WinForms&quot;"><img src="http://niklas-rother.de/wp-content/plugins/feed-comments-number/image.php?1160" alt="Comments" /></a>]]></content:encoded>
			<wfw:commentRss>http://niklas-rother.de/artikel/xna-4-probleme-mit-winforms/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Captchas für anonyme Mantis Benutzer</title>
		<link>http://niklas-rother.de/artikel/captchas-fur-anonyme-mantis-benutzer/</link>
		<comments>http://niklas-rother.de/artikel/captchas-fur-anonyme-mantis-benutzer/#comments</comments>
		<pubDate>Sun, 14 Nov 2010 16:39:14 +0000</pubDate>
		<dc:creator>Niklas</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[Tipps & Tricks]]></category>
		<category><![CDATA[bugtracker]]></category>
		<category><![CDATA[captcha]]></category>
		<category><![CDATA[mantis]]></category>
		<category><![CDATA[Spam]]></category>

		<guid isPermaLink="false">http://niklas-rother.de/?p=1108</guid>
		<description><![CDATA[Ich habe ja für meine Projekte einen Bugtracker, der mit MantisBT läuft. Den benutze ich vor allem als Notizzettel für Featureideen (aber ich freue mich auch über Bugreports). Damit dort jeder einen Fehler melden kann, habe ich den anonymen Zugriff &#8230; <a href="http://niklas-rother.de/artikel/captchas-fur-anonyme-mantis-benutzer/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Ich habe ja für meine Projekte einen <a href="http://bugs.niklas-rother.de">Bugtracker</a>, der mit <a href="http://mantisbt.org">MantisBT</a> läuft. Den benutze ich vor allem als Notizzettel für Featureideen (aber ich freue mich auch über Bugreports). Damit dort jeder einen Fehler melden kann, habe ich den anonymen Zugriff aktiviert. Dummerweise hat das wohl ein Spambot mitgekriegt und hat im 30min Takt immer längere Kommentare hinterlassen. Nachdem ich das dann (am nächsten Morgen) auf meinem iPod gesehen hatte (WAS? 20 Emails???) habe ich erst mal die anonymen Kommentare deaktiviert, doch auf längere Sich musste eine andere Lösung her: Capchas.</p>
<p>Leider hat Mantis das ganze nicht eingebaut, so dass ich selber aktiv werden musste. Natürlich hat auch Mantis einen Bugtracker, und dort hat auch schon jemand einen <a href="http://www.mantisbt.org/bugs/view.php?id=7741">Featurewunsch</a> geäußert. Jemand anderes hat dann festgestellt, das Mantis doch schon Captchas unterstützt: Wenn man einen neues Account erstellt muss man Buchstaben erraten.</p>
<p><span id="more-1108"></span></p>
<p>Genug der Vorrede: <strong>Wie baut man nun Captchas für Kommentare und Bugreports ein?</strong></p>
<p>Kurze Antwort: Man wendet den Patch an, den ich zu dem Featurewunsch <a href="http://www.mantisbt.org/bugs/view.php?id=7741#c27334">gepostet</a> habe.</p>
<p>Lange Antwort: Es müssen 4 Dateien geändert werden: In zwei muss die Eingabemaske eingefügt werden, in die anderen zwei die Validierungslogik. Wie fangen mit der Datei &#8220;bug_report.php&#8221; an. (Alle Dateien finden sich im direkt im Mantis-Ordner) Hier wird nach Zeile 80 der folgende Code eingefügt:</p>
<pre class="brush: php; title: ; notranslate">

// begin stone captcha check for anon user
if (current_user_is_anonymous())
{
$f_captcha = gpc_get_string( 'captcha', '' );
$f_public_key = gpc_get_int( 'public_key', '' );
$f_captcha = strtolower( trim( $f_captcha ) );
$t_key = strtolower( substr( md5( config_get( 'password_confirm_hash_magic_string' ) . $f_public_key ), 1, 5) );

if ( $t_key != $f_captcha ) {
trigger_error( ERROR_SIGNUP_NOT_MATCHING_CAPTCHA, ERROR );
}
}
// end of stone captcha check for anon user
</pre>
<p>Noch mal zur Kontrolle: Der Code muss an die Stelle des Kommentars (nur falls sich die Datei in einer neuen Version mal ändert&#8230;)</p>
<pre class="brush: php; title: ; notranslate">

if ( access_has_project_level( config_get( 'roadmap_update_threshold' ), $t_bug_data-&amp;amp;gt;project_id ) ) {
$t_bug_data-&amp;amp;gt;target_version = gpc_get_string( 'target_version', '' );
}

//Hier kommt der Code hin

# if a profile was selected then let's use that information
if ( 0 != $t_bug_data-&amp;amp;gt;profile_id ) {
if ( profile_is_global( $t_bug_data-&amp;amp;gt;profile_id ) ) {
</pre>
<p>Weiter geht es mit der Datei &#8220;bugnote_add.php&#8221;. Hier kommt der gleich Code in die Zeile 40:</p>
<pre class="brush: php; title: ; notranslate">

$f_time_tracking    = gpc_get_string( 'time_tracking', '0:00' );
$f_bugnote_text    = trim( gpc_get_string( 'bugnote_text', '' ) );

//Und auch hier kommt der Code hin

$t_bug = bug_get( $f_bug_id, true );
if( $t_bug-&amp;amp;gt;project_id != helper_get_current_project() ) {
</pre>
<p>Jetzt fehlt nur noch folgender Code, der das Eingabefeld ausgibt:</p>
<pre class="brush: php; html-script: true; title: ; notranslate">

&lt;?php //begin stone's captcha for anon login
    if (current_user_is_anonymous())
    {
    ?&gt;
    &lt;tr class=&quot;row-1&quot;&gt;
    &lt;td class=&quot;category&quot;&gt;
        &lt;span class=&quot;required&quot;&gt; * &lt;/span&gt;&lt;?php echo lang_get( 'signup_captcha_request' ) ?&gt;:
    &lt;/td&gt;
    &lt;td&gt;
        &lt;?php print_captcha_input( 'captcha', '' )
		$t_key = mt_rand( 0,99999 ); ?&gt;
        &lt;img src=&quot;make_captcha_img.php?public_key=&lt;?php echo $t_key ?&gt;&quot;&gt;
        &lt;input type=&quot;hidden&quot; name=&quot;public_key&quot; value=&quot;&lt;?php echo $t_key ?&gt;&quot;&gt;
    &lt;/td&gt;
	&lt;/tr&gt;
    &lt;?php
    }
    //end of stone's captcha for anon login?&gt;
</pre>
<p>Der kommt in der Datei &#8220;bug_report_page.php&#8221; in die Zeile 515:</p>
<pre class="brush: php; html-script: true; title: ; notranslate">
		&lt;label&gt;&lt;input &lt;?php echo helper_get_tab_index() ?&gt; type=&quot;checkbox&quot; id=&quot;report_stay&quot; name=&quot;report_stay&quot; &lt;?php check_checked( $f_report_stay ) ?&gt; /&gt; &lt;?php echo lang_get( 'check_report_more_bugs' ) ?&gt;&lt;/label&gt;
		&lt;/td&gt;
	&lt;/tr&gt;

//Auch hier kommt Code hin

	&lt;tr&gt;
		&lt;td class=&quot;left&quot;&gt;
			&lt;span class=&quot;required&quot;&gt; * &lt;?php echo lang_get( 'required' ) ?&gt;&lt;/span&gt;
</pre>
<p>Und zu guter Letzt kommt das ganze auch noch mal in der &#8220;bugnote_add_inc.php&#8221; in die Zeile 74:</p>
<pre class="brush: php; html-script: true; title: ; notranslate">
&lt;/tr&gt;

&lt;?php } ?&gt;

//... (ich muss nichts mehr schreiben, oder?)

&lt;?php if ( config_get('time_tracking_enabled') ) { ?&gt;
&lt;?php if ( access_has_bug_level( config_get( 'time_tracking_edit_threshold' ), $f_bug_id ) ) { ?&gt;
</pre>
<p>Wichtig: Unbedingt hinter &lt;?php } ?&gt; einfügen!</p>
<p>Jetzt sollten die anonymen Benutzer erst das Captcha lösen müssen, bevor sie Bugs melden oder Kommentare abgeben können. Seit dieser Änderung habe ich keinen Spam mehr. Wer möchte, das diese Patch in die nächste Mantisversion kommt kann sich gerne im Bugtracker dafür <a href="http://www.mantisbt.org/bugs/view.php?id=7741">aussprechen</a> (oder das Feature sponsern) <img src='http://niklas-rother.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<br /><a href="http://niklas-rother.de/?p=1108#comments" title="Comments on &quot;Captchas für anonyme Mantis Benutzer&quot;"><img src="http://niklas-rother.de/wp-content/plugins/feed-comments-number/image.php?1108" alt="Comments" /></a>]]></content:encoded>
			<wfw:commentRss>http://niklas-rother.de/artikel/captchas-fur-anonyme-mantis-benutzer/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>E-Münzbrett.NET</title>
		<link>http://niklas-rother.de/artikel/e-munzbrett-net/</link>
		<comments>http://niklas-rother.de/artikel/e-munzbrett-net/#comments</comments>
		<pubDate>Tue, 02 Nov 2010 19:31:33 +0000</pubDate>
		<dc:creator>Niklas</dc:creator>
				<category><![CDATA[Betriebsyteme]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[.Net]]></category>
		<category><![CDATA[gtk#]]></category>
		<category><![CDATA[mono]]></category>
		<category><![CDATA[münzbrett]]></category>

		<guid isPermaLink="false">http://niklas-rother.de/?p=1101</guid>
		<description><![CDATA[Nachdem Nico ein virtuelles Münzbrett für Mac OS geschrieben hat, habe ich leichtsinnigerweise behauptet, ich würde eine .NET Variante mit MonoDevelop unter Ubuntu machen. Was soll ich sagen schreiben? Ich bin froh, das ich mein Visual Studio habe MonoDevelop ist &#8230; <a href="http://niklas-rother.de/artikel/e-munzbrett-net/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Nachdem Nico ein <a href="http://nkreipke.wordpress.com/2010/10/11/e-munzbrett/">virtuelles Münzbrett für Mac OS</a> geschrieben hat, habe ich leichtsinnigerweise <a href="http://nkreipke.wordpress.com/2010/10/11/e-munzbrett/#comment-405">behauptet</a>, ich würde eine .NET Variante mit MonoDevelop unter Ubuntu machen. Was soll ich <span style="text-decoration: line-through;">sagen</span> schreiben? Ich bin froh, das ich mein Visual Studio habe <img src='http://niklas-rother.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>MonoDevelop ist ansich ein tolle Software, die sogar VisualStudio 2008 kompatible Solution-Dateien schreibt. Leider wird unter Linux normalerweise das GTK# Toolkit verwendet, was sowas wie WinForms ist. Das funktioniert aber nur, wenn unter Windows die passende DLL vorhanden ist. Ich hatte mir aber vorgenommen, ein Programm zu schreiben, das unter Linux <strong>und</strong> Windows läuft, und dass ohne neu kompilieren oder zusätzliche Binaries.</p>
<p>Also musste ich WinForms verwenden, was in Mono auch relativ implementiert ist. Nur leider fehlt MonoDevelop der Designer dafür, sodass ich alles per Hand schreiben muss. Mit einem Designer würde man z.B. die Textboxen einfach ausrichten, ohne muss man das mit einem TableLayoutPanel machen. Und bis man das so konfiguriert hat, wie man sich das vorstellt wünscht man sich den Designer mehr als einmal zurück, glaubt mir. (Ich habe überings nicht bis jetzt daran gearbeitet, ich habe nur vergessen, darüber zu bloggen. Aber etwas mehr als die 20min hat es schon gedauert&#8230;)</p>
<p><span id="more-1101"></span></p>
<p>Wenn man dann aber alles konfiguriert hat, hat man ein tolles Münzbrett, dass <strong>ohne jede Änderung</strong> auch auf Windows startet. Leider hat man da aber immer noch ein Konsole im Hintergrund&#8230;</p>
<p>Jetzt noch zwei Screenshots zum Vergleich zwischen Windows und Ubuntu:</p>
<p><a href="http://niklas-rother.de/wp-content/uploads/2010/11/E-Münzbrett-Ubuntu.png" rel="shadowbox[sbpost-1101];player=img;" title="E-Münzbrett-Ubuntu"><img class="size-medium wp-image-1102 alignnone" title="E-Münzbrett-Ubuntu" src="http://niklas-rother.de/wp-content/uploads/2010/11/E-Münzbrett-Ubuntu-300x258.png" alt="" width="300" height="258" /></a><a href="http://niklas-rother.de/wp-content/uploads/2010/11/Screenshot126.png" rel="shadowbox[sbpost-1101];player=img;" title="Screenshot126"><img class="size-medium wp-image-1103 alignnone" title="Screenshot126" src="http://niklas-rother.de/wp-content/uploads/2010/11/Screenshot126-300x250.png" alt="" width="300" height="250" /></a></p>
<p>Wenn man bei der Einstellung der FormBorderStyle nicht aufpasst hat man dieses tolle Ergebnis:<a href="http://niklas-rother.de/wp-content/uploads/2010/11/windows98.png" rel="shadowbox[sbpost-1101];player=img;" title="windows98"><img style=' float: left; padding: 4px; margin: 0 7px 2px 0;'  class="alignleft size-medium wp-image-1104" title="windows98" src="http://niklas-rother.de/wp-content/uploads/2010/11/windows98-300x240.png" alt="" width="300" height="240" /></a> Windows 98 Style!</p>
<p><strong>Ergebnis:</strong> Man kann auch unter Linux Windows/portable Programme schreiben, aber wenn man mit WinForms arbeiten will empfehle ich ganz klar ein Visual Studio. Trotzdem finde ich es beeindruckend, das das Programm <span style="text-decoration: line-through;">&#8220;einfach so&#8221;</span> ohne neukompilieren auch auf Windows (und Mac OS?) läuft!</p>
<p>Wer selber testen will: <a href="http://niklas-rother.de/downloads/E-M%C3%BCnzbrett.NET">E-Münzbrett.Net zum Download</a></p>
<br /><a href="http://niklas-rother.de/?p=1101#comments" title="Comments on &quot;E-Münzbrett.NET&quot;"><img src="http://niklas-rother.de/wp-content/plugins/feed-comments-number/image.php?1101" alt="Comments" /></a>]]></content:encoded>
			<wfw:commentRss>http://niklas-rother.de/artikel/e-munzbrett-net/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>XNA 4.0 in Deutsch &amp; Performance Tools</title>
		<link>http://niklas-rother.de/artikel/xna-4-0-in-deutsch-performance-tools/</link>
		<comments>http://niklas-rother.de/artikel/xna-4-0-in-deutsch-performance-tools/#comments</comments>
		<pubDate>Tue, 19 Oct 2010 08:42:05 +0000</pubDate>
		<dc:creator>Niklas</dc:creator>
				<category><![CDATA[Interressantes]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[XNA]]></category>
		<category><![CDATA[console]]></category>
		<category><![CDATA[debug]]></category>
		<category><![CDATA[deutsch]]></category>
		<category><![CDATA[Performance]]></category>

		<guid isPermaLink="false">http://niklas-rother.de/?p=1046</guid>
		<description><![CDATA[Gleich zwei super Neuigkeiten heute: XNA gibt es jetzt auch auf Deutsch! Das betrifft auch die komplette Dokumentation, also auch die IntelliSense Tipps. Eine super Sachen, finde ich, nicht weil ich Probleme mit der englischen Version hatte, sondern, weil es &#8230; <a href="http://niklas-rother.de/artikel/xna-4-0-in-deutsch-performance-tools/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Gleich zwei super Neuigkeiten heute:</p>
<ol>
<li>XNA gibt es jetzt auch <a href="http://blogs.msdn.com/b/astebner/archive/2010/10/18/10077455.aspx">auf Deutsch</a>! Das betrifft auch die komplette Dokumentation, also auch die IntelliSense Tipps. Eine super Sachen, finde ich, nicht weil ich Probleme mit der englischen Version hatte, sondern, weil es immer gestört hat, wenn im <em>deutschen</em> VisualStudio an und an <em>englische</em> Tooltipps erschienen</li>
<li>Es gibt von Microsoft ein &#8220;<a href="http://create.msdn.com/en-US/education/catalog/utility/performance_utility">Performance Utility</a>&#8220;. Das ist eine Overlaykomponente, mit der die Update und Draw Zeit angezeigt wird, eine FPS Anzeige, ein Overlay, dass einfach beliebige Werte anzeigt, und eine <strong>Ingame-Console</strong>.</li>
</ol>
<p>Besonders freut mich die Console (wenn sie gut ist <img src='http://niklas-rother.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> ), denn nachdem meine &#8220;alte&#8221; Console, nicht mehr für XNA 4.0 geupdatet wurde, musste ich mir was neues suchen. Für gewöhnlich sind die Sachen von Microsoft ja ziemlich gut (weil sie sie selber brauchen <img src='http://niklas-rother.de/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> ), evtl. bleibt mir da noch Arbeit erspart. (<a href="http://blog.nickgravelyn.com/2010/03/know-when-to-be-lazy/">Know when to be lazy</a>)</p>
<p><span id="more-1046"></span></p>
<p>Der Test kommt, wenn ich wieder Windows gestartet habe.</p>
<br /><a href="http://niklas-rother.de/?p=1046#comments" title="Comments on &quot;XNA 4.0 in Deutsch &#038; Performance Tools&quot;"><img src="http://niklas-rother.de/wp-content/plugins/feed-comments-number/image.php?1046" alt="Comments" /></a>]]></content:encoded>
			<wfw:commentRss>http://niklas-rother.de/artikel/xna-4-0-in-deutsch-performance-tools/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hürden für das Upgrade auf XNA 4.0 und wie man sie umgeht</title>
		<link>http://niklas-rother.de/artikel/hurden-fur-das-upgrade-auf-xna-4-0-und-wie-man-sie-umgeht/</link>
		<comments>http://niklas-rother.de/artikel/hurden-fur-das-upgrade-auf-xna-4-0-und-wie-man-sie-umgeht/#comments</comments>
		<pubDate>Tue, 21 Sep 2010 17:06:15 +0000</pubDate>
		<dc:creator>Niklas</dc:creator>
				<category><![CDATA[Meine Programme]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[The Kingdom of Darkness]]></category>
		<category><![CDATA[XNA]]></category>
		<category><![CDATA[lösungen]]></category>
		<category><![CDATA[probleme]]></category>
		<category><![CDATA[upgrade]]></category>
		<category><![CDATA[xna 4.0]]></category>

		<guid isPermaLink="false">http://niklas-rother.de/?p=1009</guid>
		<description><![CDATA[Nachdem am 16. September ja nun endlich XNA 4.0 erschienen ist, habe ich natürlich auch meine Projekt auf die neue Version aktualisiert. Das ganze hat erstaunlich wenig Probleme gemacht, und nur eine Sachen bereit mir ernsthafte Probleme. Alte XACT Dateien &#8230; <a href="http://niklas-rother.de/artikel/hurden-fur-das-upgrade-auf-xna-4-0-und-wie-man-sie-umgeht/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Nachdem am 16. September ja nun endlich XNA 4.0 <a href="http://blogs.msdn.com/b/shawnhar/archive/2010/09/16/xna-game-studio-4-0-released.aspx">erschienen</a> <a href="http://blogs.msdn.com/b/nicgrave/archive/2010/09/16/i-helped-ship-xna-game-studio-4-0.aspx">ist</a>, habe ich natürlich auch meine Projekt auf die neue Version aktualisiert. Das ganze hat erstaunlich wenig Probleme gemacht, und nur eine Sachen bereit mir ernsthafte Probleme.</p>
<p><strong>Alte XACT Dateien können nicht gelesen werden.</strong> Das Problem lässt sich sehr einfach beheben: Mit dem neuen Game Studio kommt auch ein neues XACT (auch Version 3.0, aber vom Februar 2010). Die alte Datei damit öffnen, Hinweis abnicken und wieder speichern, Problem behoben.</p>
<p><strong>DisplayMode.RefreshRate fehlt.</strong> Eines der Probleme, die ich nicht wirklich beheben konnte. Um das Ruckeln von Animationen zu beheben hatte ich die FPS Rate an die Wiederhohlrate des Monitors angepasst. Da die entsprechende Eigenschaft jetzt einfach fehlt, kann ich das so einfach nicht mehr machen.</p>
<p><span id="more-1009"></span></p>
<p><strong>DLLs, die mit XNA 3.1 kompiliert werde produzieren Probleme.</strong> In The Kingdom od Darkness hatte ich eine Libary eingebunden, die die Konsole beinhaltet. Die ist natürlich noch für XNA 3.1 kompiliert, deswegen schlugen alle Zugriffe darauf mit dem Hinweis <em>GameTime kann nicht in GameTime konvertiert werden</em> fehl. Das ist natürlich Blödsinn. Ich habe die Konsole erst mal entfernt, werde sie aber wohl durch etwas anderes ersetzen. (Dazu später mehr)</p>
<p><strong>Aus Effect.Begin/End wird Apply.</strong> Eine relativ einfache Änderung: statt für jeden Effect und Pass Begin und End aufzurufen wird nur ein mal für jeden Pass Apply aufgerufen. Technische Details bei <a href="http://blogs.msdn.com/b/shawnhar/archive/2010/04/22/effect-api-changes-in-xna-game-studio-4-0.aspx">Shawn</a>.</p>
<p><strong>Kein Rendertarget.GetTexture mehr.</strong> Das war wohl die einfachste Sachen: Ein RenderTarget <em>ist</em> eine Texture2D. Es kann also direkt in Draw verwendet werden.</p>
<p><strong>Kein CompileEffectFromSource mehr.</strong> Das ist mein Hauptproblem. Weil es auf der XBox nicht möglich war Shader zu Laufzeit zu kompilieren wurde dieses Feature auch in der Windows Version gestrichen. Es ist zwar generell möglich, aber nur sehr umständlich und <em>nicht auf Clients</em> (Rechnern, die nur das Redistributable installiert haben). Details auch wieder bei <a href="http://blogs.msdn.com/b/shawnhar/archive/2010/05/07/effect-compilation-and-content-pipeline-automation-in-xna-game-studio-4-0.aspx">Shawn</a>. Damit muss ich mein tolles System, das Post-Processing Shader je nach Bedarf generiert wieder über Bord werfen <img src='http://niklas-rother.de/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> </p>
<p><strong>Es gibt keine Color Konstruktor mehr, der die Transparenz ändert.</strong> Es wird also aus jedem new Color(Color, byte) eine Color * byte. Das ganze dem Fakt geschuldet, das XNA jetzt vormultipliziertes Alpha benutzt. Ich musste zum Glück nicht viel ändern, sonst wäre ich zu Suchen&amp;Ersetzen übergegangen.</p>
<p><strong>Serialisierte Daten können nicht mehr gelesen werden.</strong> Etwas ärgerlich: Alle Klassen, die mit 3.1 serialisiert wurden, können mit 4.0 nicht mehr gelesen werden. Vermutlich gibt es da eine Möglichkeit das Laden zu erzwingen, ich habe einfach eine neue Klasse serialisiert. Wer seine Spielstände so speichert sollte aber aufpassen, das die nach dem Upgrade noch gelesen werden können!</p>
<p><strong>Die Standardauflösung wurde geändert.</strong> Wenn man keine Auflösung angibt wird jetzt 800&#215;480 statt 800&#215;600 verwendet. Das entspricht einem Windows Phone im Querformat. Mit zwei Zeilen im Konstruktor war auch dieses Problem gelöst.</p>
<p><strong>Die Assembly im gemischten Modus wurde während Version v2.0.50727 der Laufzeit erstellt und kann nicht während der 4.0-Laufzeit ohne zusätzliche Konfigurationsinformationen geladen werden. </strong>Da musste ich dann doch zu Google greifen <img src='http://niklas-rother.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  Dieser Fehler besagt aber einfach nur, das .NET 4.0 (das jetzt automatisch verwendet wird) keine Assemblies mehr lesen kann, die für .NET 2.0 kompiliert wurden. In meinem Fall betraf das den LUA Wrapper LUA.NET. Wenn man folgenden Zeilen zu seiner <em>app.config</em> hinzufügt wird dieser Schutz aber umgangen:</p>
<pre class="brush: plain; title: ; notranslate">
&lt;configuration&gt;
  &lt;startup useLegacyV2RuntimeActivationPolicy=&quot;true&quot;&gt;
    &lt;supportedRuntime version=&quot;v4.0&quot;/&gt;
  &lt;/startup&gt;
&lt;/configuration&gt;
</pre>
<p>So, das waren alle Probleme, die ich im Bezug auf XNA 4.0 hatte. Relativ wenig, wenn man bedenkt, dass sie doch viel geändert haben.</p>
<p>Wenn meine Tilemap nicht so groß wäre (was noch geändert wird) könnte ich The Kingdom of Darkness sogar auf dem Reach Profil laufen lassen, das dann ohne Probleme auch auf dem Windows Phone laufen sollte. Wenn ich die Textur verkleinert habe, werde ich das bestimmt mal probieren <img src='http://niklas-rother.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<br /><a href="http://niklas-rother.de/?p=1009#comments" title="Comments on &quot;Hürden für das Upgrade auf XNA 4.0 und wie man sie umgeht&quot;"><img src="http://niklas-rother.de/wp-content/plugins/feed-comments-number/image.php?1009" alt="Comments" /></a>]]></content:encoded>
			<wfw:commentRss>http://niklas-rother.de/artikel/hurden-fur-das-upgrade-auf-xna-4-0-und-wie-man-sie-umgeht/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>WordPress: Eigenes Menü für bestimmte Seiten</title>
		<link>http://niklas-rother.de/artikel/wordpress-eigenes-menu-fur-bestimmte-seiten/</link>
		<comments>http://niklas-rother.de/artikel/wordpress-eigenes-menu-fur-bestimmte-seiten/#comments</comments>
		<pubDate>Mon, 06 Sep 2010 16:44:11 +0000</pubDate>
		<dc:creator>Niklas</dc:creator>
				<category><![CDATA[mein Blog]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[Tipps & Tricks]]></category>
		<category><![CDATA[cms]]></category>
		<category><![CDATA[menu]]></category>
		<category><![CDATA[portfolio]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://niklas-rother.de/?p=940</guid>
		<description><![CDATA[Ich bin ja immer noch dabei, mein &#8220;Portfolio&#8221; ein bisschen aufzuarbeiten, und dabei soll WordPress auch als CMS benutzt werden. Jetzt hätte ich gerne auf den Seiten, die ein bestimmtes Projekt beschreiben ein Menü, dass sich auf die Unterseiten dieser &#8230; <a href="http://niklas-rother.de/artikel/wordpress-eigenes-menu-fur-bestimmte-seiten/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Ich bin ja immer noch dabei, mein &#8220;Portfolio&#8221; ein bisschen aufzuarbeiten, und dabei soll WordPress auch als CMS benutzt werden. Jetzt hätte ich gerne auf den Seiten, die ein bestimmtes Projekt beschreiben ein Menü, dass sich auf die Unterseiten dieser Seite beschränkt, und nur einen generelle Link zurück zu Blog hat. Auf dem Blog soll natürlich weiterhin das normale Menü angezeigt werden.</p>
<p>Die Lösung war eine Kombination aus der WP 3.0 Menü Funktion und einem kleinen PHP Hack. Zuerst ein Mal zu der Menü Funktion: Diese Funktion ist mit WordPress 3.0 verfügbar und ermöglicht es, unter Design/Menüs eigene Menüs zu erstellen. (Wenn das Theme das unterstützt) Nur was macht man damit? Zum einem kann das Menü einer Position im Theme zuweisen. Das ist praktisch, wenn man die automatische Menüanordnung nicht mag. Doch mit einem kleinem Eingriff wird das ganz noch mächtiger!</p>
<p>Alles was man machen muss, ist diese Zeilen in die funktions.php des Theme zu kopieren:</p>
<p><span id="more-940"></span></p>
<pre class="brush: php; title: ; notranslate">&lt;?php
//Filter the arguments for the wp_nav_menu_function to include a custom menu on pages.
function nr_2010_wp_nav_menu_args($args = '')
{
	if(is_page()) //custom menus only on sites
	{
		global $post;
		$page_slug = sanitize_title($post-&gt;post_title);

		if(is_nav_menu('page-' . $page_slug)) //if a menu with the name page-{page url form} exists, use it.
		{
			$args['menu'] = 'page-' . $page_slug;
		}
	}
	return $args;
}
add_filter( 'wp_nav_menu_args', 'nr_2010_wp_nav_menu_args' );
?&gt;
</pre>
<p>Kleine Erklärung: Es wird ein <a href="http://codex.wordpress.org/Plugin_API#Filters">Filter</a> auf die Parameter der <a href="http://codex.wordpress.org/Function_Reference/wp_nav_menu">wp_nav_menu</a> gesetzt. In diesem Filter kann man die Parameter der Funktion ändern, bevor sie ausgeführt wird. (Alles Teil des genialen Plugin Systems von WordPress) Wenn grade eine Seite (is_page) angefragt wird, wird in der Variable post_slug die URL Form des Titels gespeichert und wenn auch ein Menu existiert (das wie oben beschrieben erstellt wurde), das den Name page-{post_slug} hat, wird dieses statt dem normalem Menü angezeigt.</p>
<p>Viel Text für eine einfache Erklärung: Ich kann einfach ein Menü mit einem passenden Namen erstellen, und es wird anstelle des normalen Menüs angezeigt! Super einfach <img src='http://niklas-rother.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Verbesserungsideen: Den Namen des Menüs aus einem Custom Filed des Posts leses&#8230;</p>
<br /><a href="http://niklas-rother.de/?p=940#comments" title="Comments on &quot;WordPress: Eigenes Menü für bestimmte Seiten&quot;"><img src="http://niklas-rother.de/wp-content/plugins/feed-comments-number/image.php?940" alt="Comments" /></a>]]></content:encoded>
			<wfw:commentRss>http://niklas-rother.de/artikel/wordpress-eigenes-menu-fur-bestimmte-seiten/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

