<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Der C+# (CPlusSharp) Blog</title>
	<atom:link href="http://cplussharp.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>https://cplussharp.wordpress.com</link>
	<description>Some random stuff about C++, C#, .Net and software development</description>
	<lastBuildDate>Thu, 10 Nov 2011 21:01:44 +0000</lastBuildDate>
	<language>de</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='cplussharp.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>https://s-ssl.wordpress.com/i/buttonw-com.png</url>
		<title>Der C+# (CPlusSharp) Blog</title>
		<link>https://cplussharp.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="https://cplussharp.wordpress.com/osd.xml" title="Der C+# (CPlusSharp) Blog" />
	<atom:link rel='hub' href='https://cplussharp.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Juhu, 1.000+ Downloads von Tendoid (lite) im Android Market!</title>
		<link>https://cplussharp.wordpress.com/2011/11/07/juhu-1-000-downloads-von-tendoid-lite-im-android-market/</link>
		<comments>https://cplussharp.wordpress.com/2011/11/07/juhu-1-000-downloads-von-tendoid-lite-im-android-market/#comments</comments>
		<pubDate>Mon, 07 Nov 2011 20:21:00 +0000</pubDate>
		<dc:creator>cplussharp</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Tendoid]]></category>

		<guid isPermaLink="false">https://cplussharp.wordpress.com/2011/11/07/juhu-1-000-downloads-von-tendoid-lite-im-android-market/</guid>
		<description><![CDATA[Nach fast genau 5 Monaten hat meine erste Android-App endlich über 1.000 Downloads im Android Market. Das Beste ist, von den 1.000 Downloads sind sogar noch 1/4 aktiv. Hier gibt’s den Beweis als Screenshot dazu: Bei Tendoid handelt es sich um ein Mahjong Clone, den ich bereits als normales PC-Programm umgesetzt hatte und später dann [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cplussharp.wordpress.com&amp;blog=18564258&amp;post=45&amp;subd=cplussharp&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Nach fast genau 5 Monaten hat meine erste Android-App endlich über 1.000 Downloads im Android Market. Das Beste ist, von den 1.000 Downloads sind sogar noch 1/4 aktiv. Hier gibt’s den Beweis als Screenshot dazu:</p>
<p><a href="http://cplussharp.files.wordpress.com/2011/11/entwicklerkonsole.png"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border-width:0;" title="Entwicklerkonsole" border="0" alt="Entwicklerkonsole" src="http://cplussharp.files.wordpress.com/2011/11/entwicklerkonsole_thumb.png?w=633&#038;h=256" width="633" height="256"></a></p>
<p>Bei <a href="https://market.android.com/details?id=de.mcssoft.tendoidlite" target="_blank">Tendoid</a> handelt es sich um ein Mahjong Clone, den ich bereits als normales PC-Programm umgesetzt hatte und später dann für Android. Eine genaue Beschreibung der (Leidens-)Geschichte des Programmes, sowie einen Einblick in die Entwicklung und die “Vermarktung” des Programmes gibt es in einem der folgenden Blog-Posts.</p>
<p>Und für alle die es interessiert, gibt es hier noch die ganze Statistik für die App (erweitert um ein paar Anmerkungen):</p>
<p><a href="http://cplussharp.files.wordpress.com/2011/11/market-statistik.png"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border-width:0;" title="market-statistik" border="0" alt="market-statistik" src="http://cplussharp.files.wordpress.com/2011/11/market-statistik_thumb.png?w=131&#038;h=244" width="131" height="244"></a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/cplussharp.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/cplussharp.wordpress.com/45/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/cplussharp.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/cplussharp.wordpress.com/45/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/cplussharp.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/cplussharp.wordpress.com/45/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/cplussharp.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/cplussharp.wordpress.com/45/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/cplussharp.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/cplussharp.wordpress.com/45/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/cplussharp.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/cplussharp.wordpress.com/45/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/cplussharp.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/cplussharp.wordpress.com/45/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cplussharp.wordpress.com&amp;blog=18564258&amp;post=45&amp;subd=cplussharp&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>https://cplussharp.wordpress.com/2011/11/07/juhu-1-000-downloads-von-tendoid-lite-im-android-market/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="https://secure.gravatar.com/avatar/a92e43afc5e7f930704c791a393f7c8a?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">cplussharp</media:title>
		</media:content>

		<media:content url="http://cplussharp.files.wordpress.com/2011/11/entwicklerkonsole_thumb.png" medium="image">
			<media:title type="html">Entwicklerkonsole</media:title>
		</media:content>

		<media:content url="http://cplussharp.files.wordpress.com/2011/11/market-statistik_thumb.png" medium="image">
			<media:title type="html">market-statistik</media:title>
		</media:content>
	</item>
		<item>
		<title>Application.OnIdle equivalent for WPF</title>
		<link>https://cplussharp.wordpress.com/2011/07/01/application-onidle-equivalent-for-wpf/</link>
		<comments>https://cplussharp.wordpress.com/2011/07/01/application-onidle-equivalent-for-wpf/#comments</comments>
		<pubDate>Fri, 01 Jul 2011 15:55:00 +0000</pubDate>
		<dc:creator>cplussharp</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[Tipps und Tricks]]></category>

		<guid isPermaLink="false">https://cplussharp.wordpress.com/2011/07/01/application-onidle-equivalent-for-wpf/</guid>
		<description><![CDATA[If you need an alternativ to the WinForms Application.OnIdle event in WPF you can use the DispatcherTimer. DispatcherTimer timer = new DispatcherTimer(DispatcherPriority.ApplicationIdle); timer.Tick += (s, e) =&#62; { // Do something }; timer.Start(); Do you only need the function executet once on idle you use BeginInvoke with Priority Idle. Dispatcher.CurrentDispatcher.BeginInvoke((Action)(() =&#62; { // Do something [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cplussharp.wordpress.com&amp;blog=18564258&amp;post=36&amp;subd=cplussharp&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>If you need an alternativ to the WinForms Application.OnIdle event in WPF you can use the DispatcherTimer.</p>
<pre class="code"><span style="color:#2b91af;">DispatcherTimer </span>timer = <span style="color:blue;">new </span><span style="color:#2b91af;">DispatcherTimer</span>(<span style="color:#2b91af;">DispatcherPriority</span>.ApplicationIdle);
timer.Tick += (s, e) =&gt; {
    <span style="color:green;">// Do something
</span>};
timer.Start();
</pre>
<p>Do you only need the function executet once on idle you use BeginInvoke with Priority Idle.</p>
<pre class="code"><span style="color:#2b91af;">Dispatcher</span>.CurrentDispatcher.BeginInvoke((<span style="color:#2b91af;">Action</span>)(() =&gt; {
    <span style="color:green;">// Do something
</span>}), <span style="color:#2b91af;">DispatcherPriority</span>.ApplicationIdle);
</pre>
<p>If you don’t like the lambda-style you can also write this:</p>
<pre class="code"><span style="color:#2b91af;">Dispatcher</span>.CurrentDispatcher.BeginInvoke((<span style="color:#2b91af;">Action</span>)doSomething, <span style="color:#2b91af;">DispatcherPriority</span>.ApplicationIdle);
</pre>
<p>Here doSomething needs to be a void function without parameters.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/cplussharp.wordpress.com/36/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/cplussharp.wordpress.com/36/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/cplussharp.wordpress.com/36/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/cplussharp.wordpress.com/36/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/cplussharp.wordpress.com/36/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/cplussharp.wordpress.com/36/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/cplussharp.wordpress.com/36/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/cplussharp.wordpress.com/36/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/cplussharp.wordpress.com/36/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/cplussharp.wordpress.com/36/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/cplussharp.wordpress.com/36/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/cplussharp.wordpress.com/36/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/cplussharp.wordpress.com/36/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/cplussharp.wordpress.com/36/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cplussharp.wordpress.com&amp;blog=18564258&amp;post=36&amp;subd=cplussharp&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>https://cplussharp.wordpress.com/2011/07/01/application-onidle-equivalent-for-wpf/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="https://secure.gravatar.com/avatar/a92e43afc5e7f930704c791a393f7c8a?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">cplussharp</media:title>
		</media:content>
	</item>
		<item>
		<title>Horziontal Rule in WinForms</title>
		<link>https://cplussharp.wordpress.com/2011/05/03/horziontal-rule-in-winforms/</link>
		<comments>https://cplussharp.wordpress.com/2011/05/03/horziontal-rule-in-winforms/#comments</comments>
		<pubDate>Tue, 03 May 2011 10:49:00 +0000</pubDate>
		<dc:creator>cplussharp</dc:creator>
				<category><![CDATA[Tipps und Tricks]]></category>

		<guid isPermaLink="false">https://cplussharp.wordpress.com/2011/05/03/horziontal-rule-in-winforms/</guid>
		<description><![CDATA[Sometime you need a horizontal rule in your WinForms dialog, like the HTML &#60;hr&#62; element. In MFC you have done it with a Static and in WinForms you do it with the equivalent to it, the Lable. First you need to empty the Text of the Label and set the BorderStyle to “Fixed3D”. To set [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cplussharp.wordpress.com&amp;blog=18564258&amp;post=35&amp;subd=cplussharp&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Sometime you need a horizontal rule in your WinForms dialog, like the HTML &lt;hr&gt; element. In MFC you have done it with a Static and in WinForms you do it with the equivalent to it, the Lable. First you need to empty the <em>Text</em> of the Label and set the <em>BorderStyle</em> to “Fixed3D”. To set a Witdh or Hight you need to set <em>AutoSize</em> to false. Then you set a <em>Height</em> of 2 and a Width of e.g. 100 and see you have a horizontal rule. If you set the Height to 3 or 4, you can also change the BackColor and get a colorfull version of your horizontal rule. The same applies to a vertical rule, you only swap Width and Height.</p>
<p><a href="http://cplussharp.files.wordpress.com/2011/05/horizontalrule.png"><img style="background-image:none;border-bottom:0;border-left:0;padding-left:0;padding-right:0;display:inline;border-top:0;border-right:0;padding-top:0;" title="horizontalRule" border="0" alt="horizontalRule" src="http://cplussharp.files.wordpress.com/2011/05/horizontalrule_thumb.png?w=244&#038;h=213" width="244" height="213"></a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/cplussharp.wordpress.com/35/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/cplussharp.wordpress.com/35/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/cplussharp.wordpress.com/35/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/cplussharp.wordpress.com/35/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/cplussharp.wordpress.com/35/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/cplussharp.wordpress.com/35/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/cplussharp.wordpress.com/35/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/cplussharp.wordpress.com/35/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/cplussharp.wordpress.com/35/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/cplussharp.wordpress.com/35/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/cplussharp.wordpress.com/35/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/cplussharp.wordpress.com/35/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/cplussharp.wordpress.com/35/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/cplussharp.wordpress.com/35/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cplussharp.wordpress.com&amp;blog=18564258&amp;post=35&amp;subd=cplussharp&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>https://cplussharp.wordpress.com/2011/05/03/horziontal-rule-in-winforms/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="https://secure.gravatar.com/avatar/a92e43afc5e7f930704c791a393f7c8a?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">cplussharp</media:title>
		</media:content>

		<media:content url="http://cplussharp.files.wordpress.com/2011/05/horizontalrule_thumb.png" medium="image">
			<media:title type="html">horizontalRule</media:title>
		</media:content>
	</item>
		<item>
		<title>Podzieh Teil 1: Einlesen eines RSS-Feeds für Podcasts</title>
		<link>https://cplussharp.wordpress.com/2011/04/05/podzieh-teil-1-einlesen-eines-rss-feeds-fr-podcasts/</link>
		<comments>https://cplussharp.wordpress.com/2011/04/05/podzieh-teil-1-einlesen-eines-rss-feeds-fr-podcasts/#comments</comments>
		<pubDate>Tue, 05 Apr 2011 18:33:00 +0000</pubDate>
		<dc:creator>cplussharp</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[podcast]]></category>

		<guid isPermaLink="false">https://cplussharp.wordpress.com/2011/04/05/podzieh-teil-1-einlesen-eines-rss-feeds-fr-podcasts/</guid>
		<description><![CDATA[So nun wird es ernst. Willkommen zum ersten Teil des Entwicklungstagebuches für meinen Podcatcher “Podzieh”. Die Anforderungen an das Programm habe ich im letzten Post bereits aufgeführt. Ich werde hier, in hoffentlich regelmäßigen Abständen, über aktuelle Punkte der Implementierung des Programmes schreiben. Und ich würde sagen, beginnen wir mal mit dem wichtigsten Punkt für einen [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cplussharp.wordpress.com&amp;blog=18564258&amp;post=30&amp;subd=cplussharp&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>So nun wird es ernst. Willkommen zum ersten Teil des Entwicklungstagebuches für meinen Podcatcher “Podzieh”. Die Anforderungen an das Programm habe ich im <a title="Mein eigener Podcatcher: Podzieh" href="http://cplussharp.wordpress.com/2011/04/03/mein-eigener-podcatcher-podzieh/">letzten Post</a> bereits aufgeführt. Ich werde hier, in hoffentlich regelmäßigen Abständen, über aktuelle Punkte der Implementierung des Programmes schreiben. Und ich würde sagen, beginnen wir mal mit dem wichtigsten Punkt für einen Podcatcher, das Abrufen und Einlesen des RSS-Feeds.</p>
<p>Beispiele für RSS-Feeds habe ich im Post “<a title="Podcasts für Entwickler und für nebenbei" href="http://cplussharp.wordpress.com/2011/04/02/podcasts-fr-entwickler-und-fr-nebenbei/">Podcasts für Entwickler und für nebenbei</a>” genügend geliefert, diese Feeds dienen mir als Referenz für mein Programm. Ich hoffe damit decke ich den Großteil der Möglichkeiten ab. In meinem Programm lege ich mich auf RSS-Feeds der Version 2.0 fest, da alle Feeds die ich bisher gefunden haben auch diese Version hatten. Einen guten Einstieg in den Aufbau eines RSS bietet <a href="http://www.w3schools.com/rss/" target="_blank">w3schools.com/rss</a>. Beim RSS Format handelt es sich im Grunde genommen nur um ein genau definiertes XML-Schema. Leider reicht manchen diese Vordefinierte Struktur nicht aus, und so kommen dann Erweiterungen, wie zum Beispiel die für <a href="http://www.apple.com/itunes/podcasts/specs.html#rss" target="_blank">iTunes</a>, dazu. Da es sich einfach nur um XML handelt, kann ich solch einen Feed mit den XML Klassen des dotNet Frameworks einlesen. Um die Erweiterungen zu Nutzen muss ich allerdings beim Analysieren des XML auf die Xml-Namespaces achten. Achja noch kurz zu Anmerkung, das Programm wird mit dem dotNet Framework 4 Client Profile entwickelt.</p>
<p>Zur Verarbeitung des RSS-Feeds müssen nur zwei Klassen angelegt werden. Eine für den “Channel”, dieser Beschreibt den Podcast im allgemeinen, und eine Klasse für das “Item”. Das Item stellt eine Episode im Podcast dar und kommt somit mehrfach als Kindelement des Channel vor. Damit keine fehlerhaften Objekte zustande kommen können, kann eine Instanz der Klassen nur über eine Factory-Methode erstellt werden. So kann ich zum Beispiel beeinflussen, was passiert wenn es sich nicht um einen RSS-Feed mit Version 2.0 handelt. Eingelesen wird das XML mit LINQ und der XDocument Klasse. Eine wirklich schöne Hilfe beim einlesen des XML ist die automatische Konvertierung des Inhaltes eines XElement bzw. XAttribute. Man muss nur den entsprechenden cast davor schreiben. Wenn man das ganz dann auch noch mit Nullable-Typen verbindet kann man sich etliche if Abfragen sparen.</p>
<pre class="code"><span style="color:blue;">public class </span><span style="color:#2b91af;">Channel
</span>{
    <span style="color:blue;">#region </span>Namespaces

    <span style="color:blue;">public static </span><span style="color:#2b91af;">XNamespace </span>NsItunes = <span style="color:#2b91af;">XNamespace</span>.Get(<span style="color:#a31515;">"http://www.itunes.com/dtds/podcast-1.0.dtd"</span>);
    <span style="color:blue;">public static </span><span style="color:#2b91af;">XNamespace </span>NsMedia = <span style="color:#2b91af;">XNamespace</span>.Get(<span style="color:#a31515;">"http://search.yahoo.com/mrss/"</span>);

    <span style="color:blue;">#endregion

    #region </span>Properties

    <span style="color:blue;">public string </span>Title { <span style="color:blue;">get</span>; <span style="color:blue;">protected set</span>; }
    <span style="color:blue;">public string </span>Description { <span style="color:blue;">get</span>; <span style="color:blue;">protected set</span>; }
    <span style="color:blue;">public string </span>URL { <span style="color:blue;">get</span>; <span style="color:blue;">protected set</span>; }
    <span style="color:blue;">public </span><span style="color:#2b91af;">IEnumerable</span>&lt;<span style="color:#2b91af;">Item</span>&gt; Items { <span style="color:blue;">get</span>; <span style="color:blue;">protected set</span>; }

    <span style="color:blue;">public string </span>LocalFolder { <span style="color:blue;">get</span>; <span style="color:blue;">set</span>; }

    <span style="color:blue;">#endregion

    #region </span>Init

    <span style="color:blue;">protected </span>Channel() { }

    <span style="color:blue;">public static </span><span style="color:#2b91af;">Channel </span>LoadFromFeed(<span style="color:blue;">string </span>url)
    {
        <span style="color:#2b91af;">XDocument </span>doc = <span style="color:#2b91af;">XDocument</span>.Load(url);
        <span style="color:blue;">if</span>(doc == <span style="color:blue;">null</span>) <span style="color:blue;">return null</span>;
        <span style="color:#2b91af;">XElement </span>rss = doc.Element(<span style="color:#a31515;">"rss"</span>);
        <span style="color:blue;">if </span>(rss == <span style="color:blue;">null </span>|| (<span style="color:blue;">string</span>)rss.Attribute(<span style="color:#a31515;">"version"</span>) != <span style="color:#a31515;">"2.0"</span>)
            <span style="color:blue;">return null</span>;

        <span style="color:#2b91af;">XElement </span>channel = rss.Element(<span style="color:#a31515;">"channel"</span>);
        <span style="color:blue;">if </span>(channel == <span style="color:blue;">null</span>) <span style="color:blue;">return null</span>;

        <span style="color:#2b91af;">Channel </span>c = <span style="color:blue;">new </span><span style="color:#2b91af;">Channel</span>()
        {
            URL = url,
            Title = (<span style="color:blue;">string</span>)channel.Element(<span style="color:#a31515;">"title"</span>),
            Description = (<span style="color:blue;">string</span>)channel.Element(<span style="color:#a31515;">"description"</span>)
        };

        c.Items = channel.Elements(<span style="color:#a31515;">"item"</span>)
                            .Select(i =&gt; <span style="color:#2b91af;">Item</span>.LoadFromXml(i))
                            .Where(i =&gt; !<span style="color:#2b91af;">String</span>.IsNullOrEmpty(i.Download) &amp;&amp; !<span style="color:#2b91af;">String</span>.IsNullOrEmpty(i.Title));

        <span style="color:blue;">return </span>c;
    }

    <span style="color:blue;">#endregion
</span>}</pre>
<p>Die Liste mit den Items erstelle ich mit Hilfe der LINQ Extension Methoden. Mit “Elements()” geh ich alle Items durch. Auf diese Enumeration wird ein “Select” angewedet, welches aus den XML-Items eine Item-Instanz meiner Klasse macht. Im Anschluss daran, Filter ich gleich die mit raus, bei denen ich keinen Download gefunden habe.</p>
<pre class="code"><span style="color:blue;">public class </span><span style="color:#2b91af;">Item
</span>{
    <span style="color:blue;">#region </span>Properties

    <span style="color:blue;">public string </span>Title { <span style="color:blue;">get</span>; <span style="color:blue;">protected set</span>; }
    <span style="color:blue;">public string </span>Description { <span style="color:blue;">get</span>; <span style="color:blue;">protected set</span>; }
    <span style="color:blue;">public string </span>Guid { <span style="color:blue;">get</span>; <span style="color:blue;">protected set</span>; }
    <span style="color:blue;">public string </span>Author { <span style="color:blue;">get</span>; <span style="color:blue;">protected set</span>; }
    <span style="color:blue;">public string </span>Download { <span style="color:blue;">get</span>; <span style="color:blue;">protected set</span>; }
    <span style="color:blue;">public long</span>? DownloadSize { <span style="color:blue;">get</span>; <span style="color:blue;">protected set</span>; }

    <span style="color:blue;">public </span><span style="color:#2b91af;">DateTime</span>? PubDate { <span style="color:blue;">get</span>; <span style="color:blue;">protected set</span>; }

    <span style="color:blue;">public string </span>LocalFile { <span style="color:blue;">get</span>; <span style="color:blue;">set</span>; }

    <span style="color:blue;">#endregion

    #region </span>Init

    <span style="color:blue;">protected </span>Item() { }

    <span style="color:blue;">public static </span><span style="color:#2b91af;">Item </span>LoadFromXml(<span style="color:#2b91af;">XElement </span>el)
    {
        <span style="color:#2b91af;">Item </span>i = <span style="color:blue;">new </span><span style="color:#2b91af;">Item</span>()
        {
            Title = (<span style="color:blue;">string</span>)el.Element(<span style="color:#a31515;">"title"</span>),
            Description = (<span style="color:blue;">string</span>)el.Element(<span style="color:#a31515;">"description"</span>),
            Guid = (<span style="color:blue;">string</span>)el.Element(<span style="color:#a31515;">"guid"</span>),
            Author = (<span style="color:blue;">string</span>)el.Element(<span style="color:#a31515;">"author"</span>)
        };

        <span style="color:blue;">if </span>(<span style="color:#2b91af;">String</span>.IsNullOrEmpty(i.Guid))
            i.Guid = (<span style="color:blue;">string</span>)el.Element(<span style="color:#a31515;">"link"</span>);

        <span style="color:blue;">if</span>(el.Element(<span style="color:#a31515;">"pubDate"</span>) != <span style="color:blue;">null</span>)
            i.PubDate = (<span style="color:#2b91af;">DateTime</span>?)el.Element(<span style="color:#a31515;">"pubDate"</span>);

        <span style="color:blue;">if </span>(i.Description == <span style="color:#2b91af;">String</span>.Empty)
        {   <span style="color:green;">// wenn in description nichts drin steht, ist vieleicht im itunes-tag summary was drin
            </span>i.Description = (<span style="color:blue;">string</span>)el.Element(<span style="color:#2b91af;">Channel</span>.NsItunes + <span style="color:#a31515;">"summary"</span>);
        }

        <span style="color:blue;">if </span>(el.Element(<span style="color:#a31515;">"enclosure"</span>) != <span style="color:blue;">null</span>)
        {
            i.Download = (<span style="color:blue;">string</span>)el.Element(<span style="color:#a31515;">"enclosure"</span>).Attribute(<span style="color:#a31515;">"url"</span>);
            i.DownloadSize = (<span style="color:blue;">long</span>?)el.Element(<span style="color:#a31515;">"enclosure"</span>).Attribute(<span style="color:#a31515;">"length"</span>);
            <span style="color:blue;">if </span>(i.DownloadSize.HasValue &amp;&amp; i.DownloadSize.Value == 0)
                i.DownloadSize = <span style="color:blue;">null</span>;
        }

        <span style="color:blue;">if</span>(<span style="color:#2b91af;">String</span>.IsNullOrEmpty(i.Download) || !i.DownloadSize.HasValue)
        {   <span style="color:green;">// wenn in enclosure nichts steht, steht das vieleicht in einem media:content-tag
            </span><span style="color:#2b91af;">XElement </span>elMedia = el.Element(<span style="color:#2b91af;">Channel</span>.NsMedia + <span style="color:#a31515;">"content"</span>);
            <span style="color:blue;">if </span>(elMedia != <span style="color:blue;">null </span>&amp;&amp; elMedia.Attribute(<span style="color:#a31515;">"url"</span>) != <span style="color:blue;">null</span>)
            {
                i.Download = (<span style="color:blue;">string</span>)elMedia.Attribute(<span style="color:#a31515;">"url"</span>);
                i.DownloadSize = (<span style="color:blue;">long</span>?)elMedia.Attribute(<span style="color:#a31515;">"fileSize"</span>);
                <span style="color:blue;">if </span>(i.DownloadSize.HasValue &amp;&amp; i.DownloadSize.Value == 0)
                    i.DownloadSize = <span style="color:blue;">null</span>;
            }
        }

        <span style="color:blue;">return </span>i;
    }

    <span style="color:blue;">#endregion
</span>}</pre>
<p>Wenn ich beim Einlesen eines Items keinen Download finde, versuche ich es mit dem Element media:content. Hier steht im Grunde das gleiche drin wie im enclosure-Element. Die Guid wird verwendet um die Episode eindeutig zu Identifizieren und später mit einer Datenbank abzugleichen. Die Properties “LocalFolder” und “LocalFile” habe ich angelegt um hier nach dem einlesen des Feeds, den Pfad zur lokalen Instanz einzutragen. Mehr dazu in einem späteren Post.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/cplussharp.wordpress.com/30/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/cplussharp.wordpress.com/30/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/cplussharp.wordpress.com/30/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/cplussharp.wordpress.com/30/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/cplussharp.wordpress.com/30/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/cplussharp.wordpress.com/30/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/cplussharp.wordpress.com/30/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/cplussharp.wordpress.com/30/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/cplussharp.wordpress.com/30/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/cplussharp.wordpress.com/30/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/cplussharp.wordpress.com/30/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/cplussharp.wordpress.com/30/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/cplussharp.wordpress.com/30/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/cplussharp.wordpress.com/30/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cplussharp.wordpress.com&amp;blog=18564258&amp;post=30&amp;subd=cplussharp&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>https://cplussharp.wordpress.com/2011/04/05/podzieh-teil-1-einlesen-eines-rss-feeds-fr-podcasts/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="https://secure.gravatar.com/avatar/a92e43afc5e7f930704c791a393f7c8a?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">cplussharp</media:title>
		</media:content>
	</item>
		<item>
		<title>Mein eigener Podcatcher: Podzieh</title>
		<link>https://cplussharp.wordpress.com/2011/04/03/mein-eigener-podcatcher-podzieh/</link>
		<comments>https://cplussharp.wordpress.com/2011/04/03/mein-eigener-podcatcher-podzieh/#comments</comments>
		<pubDate>Sun, 03 Apr 2011 21:10:00 +0000</pubDate>
		<dc:creator>cplussharp</dc:creator>
				<category><![CDATA[Random]]></category>
		<category><![CDATA[podcast]]></category>

		<guid isPermaLink="false">https://cplussharp.wordpress.com/2011/04/03/mein-eigener-podcatcher-podzieh/</guid>
		<description><![CDATA[Wie im letzten Post schon angedeutet suche ich zur Zeit nach einem guten Tool zur Verwaltung meiner Podcast-Downloads und –Feeds. Alle Programme die ich bis jetzt getestet habe, sind mir einfach zu überfrachtet oder zu Kompliziert. Aus diesem Grund habe ich mich dazu entschlossen ein eigenes kleines Programm dafür zu entwickeln. Schließlich bin ich nicht [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cplussharp.wordpress.com&amp;blog=18564258&amp;post=29&amp;subd=cplussharp&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Wie im letzten Post schon angedeutet suche ich zur Zeit nach einem guten Tool zur Verwaltung meiner Podcast-Downloads und –Feeds. Alle Programme die ich bis jetzt getestet habe, sind mir einfach zu überfrachtet oder zu Kompliziert. Aus diesem Grund habe ich mich dazu entschlossen ein eigenes kleines Programm dafür zu entwickeln. Schließlich bin ich nicht umsonst Softwareentwickler geworden <img style="border-style:none;" class="wlEmoticon wlEmoticon-winkingsmile" alt="Zwinkerndes Smiley" src="http://cplussharp.files.wordpress.com/2011/04/wlemoticon-winkingsmile.png?w=620">.</p>
<p>&nbsp;</p>
<p>Im allgemeinen wird die Gruppe von solchen Programmen als <a href="http://wiki.podcast.de/Podcatcher" target="_blank">Podcatcher</a> bezeichnet. Solch einem Programm wird Üblicherweise der RSS Feed eines Podcasts übergeben und es zeigt dann die verfügbaren Downloads an und lädt sie bei Bedarf herunter. Genau aus diesem Verhalten habe ich den Namen für mein kleines Programm abgeleitet. Ich wollte es zwar erst “Podzblitz” nennen, dass war mir dann aber doch zu abgedroschen und nicht beschreibend genug. Darum soll es jetzt “Podzieh” heißen, sowie PODcast und aus dem Netz ZIEHen.</p>
<p>&nbsp;</p>
<p>So und um auch gleich einen Einstieg zu haben, beginnen wir doch mal mit der Anforderungsanalyse. Was soll das Programm denn können? Für mich am wichtigsten sind eigentlich folgende Punkte:</p>
<ul>
<li>Verwaltung von Podcast-Feeds, das Umfasst folgende Kriterien
<ul>
<li>Eingabe von RSS URLs
<li>Abrufen des RSS Feeds
<li>Überprüfen auf neue Einträge</li>
</ul>
<li>Herunterladen von Podcast-Folgen
<ul>
<li>Eine oder mehrere Folgen auswählbar zum herunterladen
<li>Download im Hintergrund
<li>Fortschrittsanzeige
<li>Speicherung in einer eigenen Ordnerstruktur, zum Beispiel jeder Feed in einem eigenen Ordner
<li>ggf. fortsetzen von Downloads</li>
</ul>
<li>Markieren der Folgen
<ul>
<li>als gehört Kennzeichnen
<li>Bewerten
<li>ggf. automatisches löschen, wenn Platz gespart werden soll</li>
</ul>
<li>Abspielen
<ul>
<li>ggf. auch schon abspielen, wenn sie noch nicht fertig heruntergeladen wurde!</li>
</ul>
<li>Konvertieren ins AAC Format
<ul>
<li>zur Platzsparenden Archivierung oder um den Speicherplatz des Smartphone zu schonen
<li>natürlich auch im Hintergrund
<li>frei Konfigurierbar
<li>vorgegebene (empfohlene) Profile</li>
</ul>
<li>Übertagen auf ein (Android-)Smartphone per WLAN</li>
</ul>
<p>So das sind jetzt erst mal alle Punkte die mir Einfallen. Sicher gäbe es auch noch ein paar Features mehr die man in so ein Programm stecken könnte, aber man sollte es auch nicht übertreiben. Denn jetzt kommen ja noch die Nicht-Funktionalen Anforderungen, die die ganze Sache erst richtig interessant machen.</p>
<ul>
<li>Natürlich soll das Programm eine optisch ansprechende Oberfläche haben
<li>es soll möglichst Idiotensicher sein; der Nutzer soll so viel wie möglich mit dem Programm machen können und so wenig wie nötig dafür tun müssen
<li>Beachtung des <a href="http://www.clean-code-developer.de/Wertesystem.ashx" target="_blank">CleanCodeDeveloper</a> Wertesystems bei der Entwicklung
<li>und das Ganze soll Open-Source sein</li>
</ul>
<p>So das ist jetzt erst mal ein ganz schöner Brocken Arbeit der da vor mir liegt. Ich hoffe ich kann alle Punkte so umsetzen wie ich mir das vorstelle. Ich werde versuchen bei der Entwicklung immer hier auf dem Blog zu schreiben und auf jeden Funktionspunkt näher einzugehen. Wenn Ihr noch weitere Ideen habt, was unbedingt in so ein Programm gehört, könnt Ihr mir gern einen Kommentar da lassen, bzw. könnt Ihr auch einfach schreiben was Ihr von der Idee haltet.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/cplussharp.wordpress.com/29/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/cplussharp.wordpress.com/29/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/cplussharp.wordpress.com/29/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/cplussharp.wordpress.com/29/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/cplussharp.wordpress.com/29/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/cplussharp.wordpress.com/29/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/cplussharp.wordpress.com/29/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/cplussharp.wordpress.com/29/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/cplussharp.wordpress.com/29/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/cplussharp.wordpress.com/29/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/cplussharp.wordpress.com/29/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/cplussharp.wordpress.com/29/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/cplussharp.wordpress.com/29/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/cplussharp.wordpress.com/29/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cplussharp.wordpress.com&amp;blog=18564258&amp;post=29&amp;subd=cplussharp&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>https://cplussharp.wordpress.com/2011/04/03/mein-eigener-podcatcher-podzieh/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="https://secure.gravatar.com/avatar/a92e43afc5e7f930704c791a393f7c8a?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">cplussharp</media:title>
		</media:content>

		<media:content url="http://cplussharp.files.wordpress.com/2011/04/wlemoticon-winkingsmile.png" medium="image">
			<media:title type="html">Zwinkerndes Smiley</media:title>
		</media:content>
	</item>
		<item>
		<title>Podcasts für Entwickler und für nebenbei</title>
		<link>https://cplussharp.wordpress.com/2011/04/02/podcasts-fr-entwickler-und-fr-nebenbei/</link>
		<comments>https://cplussharp.wordpress.com/2011/04/02/podcasts-fr-entwickler-und-fr-nebenbei/#comments</comments>
		<pubDate>Sat, 02 Apr 2011 20:41:00 +0000</pubDate>
		<dc:creator>cplussharp</dc:creator>
				<category><![CDATA[Random]]></category>
		<category><![CDATA[podcast]]></category>

		<guid isPermaLink="false">https://cplussharp.wordpress.com/2011/04/02/podcasts-fr-entwickler-und-fr-nebenbei/</guid>
		<description><![CDATA[Wenn man mal wieder den Abwasch machen muss, etwas im Garten arbeitet oder einfach nur mit der Bahn fährt, mit einem Podcast in den Ohren geht das Alles viel leichter. Wenn ich mal gerade nicht am Entwickeln und Programmieren bin, tu ich durch das Podcast hören etwas um mich weiterzubilden und um mich zu informieren. [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cplussharp.wordpress.com&amp;blog=18564258&amp;post=25&amp;subd=cplussharp&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Wenn man mal wieder den Abwasch machen muss, etwas im Garten arbeitet oder einfach nur mit der Bahn fährt, mit einem Podcast in den Ohren geht das Alles viel leichter. Wenn ich mal gerade nicht am Entwickeln und Programmieren bin, tu ich durch das Podcast hören etwas um mich weiterzubilden und um mich zu informieren. Wenn ich ganz ehrlich bin, ist es aber vor allem als Unterhaltung gedacht. Da ich mein Handy/Smartphone immer dabei habe, lade ich mir dort regelmäßig die neuesten Episoden von verschiedenen Podcasts drauf.</p>
<p>Zum Podcast hören gekommen bin ich erst vor kurzem. Irgend wie ist die ganze Podcast-Mania vor ein paar Jahren ganz an mir vorbeigezogen, ohne das ich dem etwas abgewinnen konnte. Gepackt hat mich das Podcast-Fieber erst mit den wirklich gut und professionell gemachten Podcasts von <a href="http://gameone.de/" target="_blank">gameone.de</a>. Da ich die meisten der Redakteure schon seit Giga-Zeiten aus dem Fernsehen kenne, ist das hören der Episoden ganz angenehm.  Vor allem treffen aber die Retro und Kopfkino Podcasts genau ins Schwarze bei mir. In den Retro-Podcasts geht es vor allem um Spiele aus der guten alten Zeit, also genau da wo ich auch gespielt habe (SNES und Co.). Und in den Kopfkino-Podcasts werden Filme bzw. Filmreihen besprochen. Absolutes Highlight war hier natürlich der Livecast zur Oscar-Verleihung 2011. Da mein Sohn natürlich genau in dieser Nacht um 2 Uhr aufgewacht ist und nicht mehr schlafen wollte, habe ich mir tatsächlich die Oscar-Verleihung Live im Fernsehen angesehen. Ohne den Livecast und die Kommentare der gameone Redakteure hätte ich diese langweilige Verleihung wohl nicht durchgestanden.</p>
<p>Aber das war nur der erste von zwei Podcasts die mich zu einem Fan dieses Mediums haben werde lassen. Der gameone Podcast ist natürlich nur etwas zur Unterhaltung. Richtig die Augen oder besser gesagt Ohren geöffnet hat mir dann der <a href="http://www.heise.de/developer/podcast/" target="_blank">SoftwareArchitekTOUR</a>-Podcast von heise.de/developer. Hier geht es um mein Lieblingsthema, die Softwareentwicklung. Naja eigentlich nicht ganz um die Softwareentwicklung, sondern wie der Name schon sagt um Softwarearchitektur. Besprochen werden Vorgehensmodelle, Designschwerpunkte, Pattern und aktuelle Entwicklungen wie NoSQL und Cloud Computing.</p>
<p>So genug geredet, es wird Zeit sich etwas anzuhören. Hier nun meine Liste mit Podcasts die ich regelmäßig höre, bzw. auf die ich gerade erst aufmerksam geworden bin.</p>
<ul>
<li>gameone.de Plauschangriff  | <a href="http://gameone.de/specials/der-gameone-plauschangriff" target="_blank">website</a> | <a href="http://gameone.de/feed/podcast.xml" target="_blank">feed</a></li>
<li>SoftwareArchitekTOUR-Podcast | <a href="http://www.heise.de/developer/podcast/" target="_blank">website</a> | <a href="http://www.heise.de/developer/podcast/itunes/heise-developer-podcast-softwarearchitektour.rss" target="_blank">feed</a></li>
<li>pentacast (Podcast des c3d2) | <a href="http://www.c3d2.de/podcast.html" target="_blank">website</a> | <a href="http://www.c3d2.de/pentacast.xml" target="_blank">feed</a></li>
<li>Technikwürze Podcast | <a href="http://technikwuerze.de/" target="_blank">website</a> | <a href="http://technikwuerze.de/feed/" target="_blank">feed</a></li>
<li>Working Draft Podcast | <a href="http://workingdraft.de/" target="_blank">website</a> | <a href="http://workingdraft.de/feed/rss/" target="_blank">feed</a></li>
<li>Spieleveteranen | <a href="http://www.spieleveteranen.de/" target="_blank">website</a> | <a href="http://www.spieleveteranen.de/feed" target="_blank">feed</a></li>
</ul>
<p>Und hier noch ein paar interessante  Englische Podcasts:</p>
<ul>
<li>Experimental Game Dev Podcast Show | <a href="http://www.indiegamepod.com/" target="_blank">website</a> | <a href="http://www.indiegamepod.com/?feed=rss2" target="_blank">feed</a></li>
<li>hanselminutes | <a href="http://www.hanselminutes.com/" target="_blank">website</a> | <a href="http://feeds.feedburner.com/HanselminutesCompleteMP3" target="_blank">feed</a></li>
<li>This Developers Life | <a href="http://www.thisdeveloperslife.com/" target="_blank">website</a> | <a href="http://feeds.feedburner.com/thisdeveloperslife" target="_blank">feed</a></li>
</ul>
<p>Natürlich gibt es noch wesentlich mehr englischsprachige Podcasts, es macht nur keinen Sinn die hier alle aufzuzählen.</p>
<p>Da es mit der Zeit ganz schön unübersichtlich wird mit so vielen unterschiedlichen Podcasts und dem ganzen Runtergelade und Angehöre, bin ich zur Zeit noch auf der Suche nach einer guten Software, die das Alles etwas Unterstützt. Ich hab zwar auch schon ein paar Programme ausprobiert, aber so richtig glücklich geworden, bin ich mit keinem. Über Empfehlungen würde ich mich hier freuen. Aber anscheinend muss ich da wohl selber mal ran und mir genau das Programmieren was ich brauch!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/cplussharp.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/cplussharp.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/cplussharp.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/cplussharp.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/cplussharp.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/cplussharp.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/cplussharp.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/cplussharp.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/cplussharp.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/cplussharp.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/cplussharp.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/cplussharp.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/cplussharp.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/cplussharp.wordpress.com/25/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cplussharp.wordpress.com&amp;blog=18564258&amp;post=25&amp;subd=cplussharp&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>https://cplussharp.wordpress.com/2011/04/02/podcasts-fr-entwickler-und-fr-nebenbei/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="https://secure.gravatar.com/avatar/a92e43afc5e7f930704c791a393f7c8a?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">cplussharp</media:title>
		</media:content>
	</item>
		<item>
		<title>ALM mit Redmine, Teil 2</title>
		<link>https://cplussharp.wordpress.com/2011/03/18/alm-mit-redmine-teil-2/</link>
		<comments>https://cplussharp.wordpress.com/2011/03/18/alm-mit-redmine-teil-2/#comments</comments>
		<pubDate>Fri, 18 Mar 2011 22:01:00 +0000</pubDate>
		<dc:creator>cplussharp</dc:creator>
				<category><![CDATA[Projektmanagement]]></category>
		<category><![CDATA[Redmine]]></category>

		<guid isPermaLink="false">https://cplussharp.wordpress.com/2011/03/18/alm-mit-redmine-teil-2/</guid>
		<description><![CDATA[Im ersten Teil hatte ich ja bereits angekündigt, dass ich über unsere Erfahrungen mit Redmine weiter berichten werde. Leider hat sich das Ganze anders entwickelt als gedacht. Da bei uns vornehmlich Outlook zum Einsatz kommt und wir auch alle unsere Kundendaten im Outlook haben, nutzen wir jetzt doch eine Kommerzielle Erweiterung für Outlook um unsere [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cplussharp.wordpress.com&amp;blog=18564258&amp;post=21&amp;subd=cplussharp&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Im ersten Teil hatte ich ja bereits angekündigt, dass ich über unsere Erfahrungen mit Redmine weiter berichten werde. Leider hat sich das Ganze anders entwickelt als gedacht. Da bei uns vornehmlich Outlook zum Einsatz kommt und wir auch alle unsere Kundendaten im Outlook haben, nutzen wir jetzt doch eine Kommerzielle Erweiterung für Outlook um unsere Support-Anfragen zu bearbeiten. Aber nichts des do trotz arbeite ich jetzt erst mal alleine mit Redmine.</p>
<p>Da ich mehrere kleine und große Projekte habe, die ich in Eigenregie plane und Entwickle ist eine gute Aufgabenplanung unerlässlich. Mit Redmine habe ich jetzt endlich ein vernünftiges Werkzeug dafür gefunden. Ich habe mehrere Projekte und Unterprojekte in denen vor allem die drei Tracker “Bug”,&nbsp; “Feature” und “Anforderung” zum Einsatz kommen. Für Bugs war das ganze ja sowieso gedacht, jetzt kommt der Bugtracker halt zum Einsatz wenn ich selber Fehler finde oder der Kunde mir direkt welche schickt. Im Tracker “Feature” landen Ideen für Erweiterungen unserer Produkte.</p>
<p>Besonders wichtig ist für mich in letzter Zeit der Tracker “Anforderung” geworden. Da es sich hier um konkrete Aufgaben handelt, welche für den Kunden abgearbeitet werden müssen, ist das der Tracker mit den meisten Tickets. Außerdem nutze ich den Tracker dafür, meine Aufwände zu Planen. Ich zerlege die Aufgaben so, dass ich bei Maximal ein bis zwei Tagen, am besten jedoch bei ein bis zwei Stunden rauskomme. Somit kann ich bei einem Angebot ziemlich zuverlässig sagen wie viel Manntage bezahlt werden müssen.</p>
<p>Damit die Planung auch Sinnvoll und Realistisch ist, muss natürlich der tatsächliche Aufwand mit erfasst werden. Erst dadurch ist es möglich die Abschätzungen zu überprüfen und bei neuen Aufgaben genauere Zahlen zu liefern. Damit man nicht ständig auf die Uhr schauen muss wenn man an einer Aufgabe arbeitet, gibt es zum Glück das <a href="http://www.redmine.org/plugins/redmine_time_tracker" target="_blank">TimeTracker Plugin</a>. Es zeigt in der rechten oberen Ecke einen Button “Start #xxx” mit dem die Zeiterfassung für die aktuelle Aufgabe begonnen werden kann. Wenn der Timer läuft wird an dieser Stelle immer die aktuell benötigte Zeit angezeigt. Und da es wahrscheinlich vielen so geht wie mir, die beim Arbeiten durch Telefonate oder Sonstiges abgehalten werden, gibt es einen Pause-Button, welcher die Zeitmessung unterbricht. Drück man schließlich auf den Stopp-Button öffnet sich automatisch die Aufwands-Erfassungsmaske, in der die benötigte Zeit, in Stunden umgerechnet, bereits eingetragen ist. Hier kann man nun noch ein Kommentar mit einer Beschreibung der Tätigkeit eingeben und das Ganze als Tätigkeit für die Aufgabe speichern.</p>
<p>Da bei mir der Berg an Papier mit Feature-Wünschen und Anpassungen von unseren Kunden immer weiter gewachsen ist und ich da nicht mehr wirklich durchgesehen habe, wird so etwas jetzt immer eingescannt. Die PDF Datei hänge ich dann an die konkrete Aufgabe oder den Fehler als Anlage mit dran. Somit entfällt das lange Gesuche nach irgendwelchen Blättern mir Designvorgaben und Co. Das gleiche gilt natürlich auch für Dokumente oder Screenshots die ich per Mail erhalten habe. Sollte solch eine Datei mehrere Aufgaben betreffen, gibt es in Redmine die Möglichkeit, Dokumente zu einem Projekt zu speichern. Diesen Dokumenten gibt man einen Namen und eine kurze Beschreibung. Per <em>document#xxx</em> (xxx ist die ID des Dokuments) kann man dann schließlich in der Beschreibung einer Aufgabe oder einem Kommentar auf das Dokument verlinken. Hierbei wird der Ausdruck mit dem Dokumentnamen ersetzt. Es gibt übrigens eine ganze Reihe solcher Ausdrücke , um zwischen Dokumenten, Wiki-Einträgen und anderen Aufgaben zu verlinken. Eine Übersicht dafür liefert die <a href="http://www.redmine.org/projects/redmine/wiki/RedmineTextFormatting" target="_blank">Wiki-Seite von Redmine</a>.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/cplussharp.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/cplussharp.wordpress.com/21/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/cplussharp.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/cplussharp.wordpress.com/21/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/cplussharp.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/cplussharp.wordpress.com/21/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/cplussharp.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/cplussharp.wordpress.com/21/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/cplussharp.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/cplussharp.wordpress.com/21/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/cplussharp.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/cplussharp.wordpress.com/21/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/cplussharp.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/cplussharp.wordpress.com/21/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cplussharp.wordpress.com&amp;blog=18564258&amp;post=21&amp;subd=cplussharp&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>https://cplussharp.wordpress.com/2011/03/18/alm-mit-redmine-teil-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="https://secure.gravatar.com/avatar/a92e43afc5e7f930704c791a393f7c8a?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">cplussharp</media:title>
		</media:content>
	</item>
		<item>
		<title>jQuery Tablesorter Pager: Jump to Page</title>
		<link>https://cplussharp.wordpress.com/2011/03/18/jquery-tablesorter-pager-jump-to-page/</link>
		<comments>https://cplussharp.wordpress.com/2011/03/18/jquery-tablesorter-pager-jump-to-page/#comments</comments>
		<pubDate>Fri, 18 Mar 2011 21:30:00 +0000</pubDate>
		<dc:creator>cplussharp</dc:creator>
				<category><![CDATA[jQuery]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">https://cplussharp.wordpress.com/?p=14</guid>
		<description><![CDATA[This is my first blog in english, so sorry for any spelling errors. In one of our projects, we use the great jQuery library. A very cool plugin for jQuery is the tablesorter and the extsion to this, the pager. The only disadvantage of the pager plugin is the missing function “Jump To Page”. You [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cplussharp.wordpress.com&amp;blog=18564258&amp;post=14&amp;subd=cplussharp&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>This is my first blog in english, so sorry for any spelling errors.</p>
<p>In one of our projects, we use the great <a href="http://jquery.com/" target="_blank">jQuery</a> library. A very cool plugin for jQuery is the <a href="http://tablesorter.com/docs/" target="_blank">tablesorter</a> and the extsion to this, the <a href="http://tablesorter.com/docs/example-pager.html" target="_blank">pager</a>. The only disadvantage of the pager plugin is the missing function “Jump To Page”. You can only display the current page and the page count as one string. So i have modified the code of the pager plugin a little, to add this function.</p>
<p>It is a very simple extension, only two existing functions need to be updated. To identify the input-field for the current page and the div for the pagecount, i added two new properties to the settings: <em>cssPageCurrent</em> and <em>cssPageCount</em>. The first function to update is the constructur. Here i connect to the change-event of the input-field and call the moveToPage function. The second function is named <em>updatePageDisplay</em>. It is responsible to update the number in the currentpage-inputfield if you navigate with the next/prev buttons.</p>
<p>Here are the updated functions:</p>
<pre class="code"><span style="color:blue;">function </span>updatePageDisplay(c, table) {
    <span style="color:blue;">var </span>txt = (c.page + 1) + c.seperator + c.totalPages;
    <span style="color:blue;">var </span>pd = $(c.cssPageDisplay, c.container)
    <span style="color:blue;">if </span>(pd.is(<span style="color:maroon;">"input"</span>))
        pd.val(txt);
    <span style="color:blue;">else
        </span>pd.text(txt);

    <span style="color:blue;">var </span>pcur = $(c.cssPageCurrent, c.container)
    <span style="color:blue;">if </span>(pcur.is(<span style="color:maroon;">"input"</span>))
        pcur.val(c.page + 1);
    <span style="color:blue;">else
        </span>pcur.text(c.page + 1);

    <span style="color:blue;">var </span>pcount = $(c.cssPageCount, c.container)
    <span style="color:blue;">if </span>(pcount.is(<span style="color:maroon;">"input"</span>))
        pccount.val(c.totalPages);
    <span style="color:blue;">else
        </span>pcount.text(c.totalPages);

    $(table).trigger(<span style="color:maroon;">"tableSorterPagerUpdatePageDisplay"</span>);
}

<span style="color:blue;">this</span>.defaults = {
    size: 10,
    offset: 0,
    page: 0,
    totalRows: 0,
    totalPages: 0,
    container: <span style="color:blue;">null</span>,
    cssNext: <span style="color:maroon;">'.next'</span>,
    cssPrev: <span style="color:maroon;">'.prev'</span>,
    cssFirst: <span style="color:maroon;">'.first'</span>,
    cssLast: <span style="color:maroon;">'.last'</span>,
    cssPageDisplay: <span style="color:maroon;">'.pagedisplay'</span>,
    cssPageSize: <span style="color:maroon;">'.pagesize'</span>,
    cssPageCount: <span style="color:maroon;">'.pagecount'</span>,
    cssPageCurrent: <span style="color:maroon;">'.pagecurrent'</span>,
    seperator: <span style="color:maroon;">"/"</span>,
    positionFixed: <span style="color:blue;">true</span>,
    appender: <span style="color:blue;">this</span>.appender
};

<span style="color:blue;">this</span>.construct = <span style="color:blue;">function </span>(settings) {

    <span style="color:blue;">return this</span>.each(<span style="color:blue;">function </span>() {

        ...

        $(config.cssPageCurrent, pager).change(<span style="color:blue;">function </span>() {
            <span style="color:blue;">var </span>c = table.config;
            <span style="color:blue;">var </span>p = $(<span style="color:blue;">this</span>).val();

            <span style="color:blue;">if </span>(p != c.page + 1) {
                p = parseInt(p) - 1;
                <span style="color:blue;">if </span>(p &lt; 0 || isNaN(p)) p = 0;
                <span style="color:blue;">else if </span>(p &gt; c.totalPages - 1) p = c.totalPages - 1;

                c.page = p;
                moveToPage(table);
            }

            <span style="color:blue;">return false</span>;
        });
    });
};
</pre>
<p>Here you can download the changed scriptfile: <a href="http://www.mcs-soft.de/blog/files/jquery.tablesorter.pager.js" target="_blank">jquery.tablesorter.pager.js</a></p>
<p>And here is how i used it:</p>
<pre class="code"><span style="color:blue;">&lt;</span><span style="color:maroon;">html</span><span style="color:blue;">&gt;
&lt;</span><span style="color:maroon;">head</span><span style="color:blue;">&gt;
    &lt;</span><span style="color:maroon;">script </span><span style="color:red;">type</span><span style="color:blue;">="text/javascript"&gt;
        </span>$(document).ready(<span style="color:blue;">function </span>() {
            ...
            $(<span style="color:maroon;">".tblSortable"</span>).tablesorter();
            $(<span style="color:maroon;">".tblSortable"</span>).tablesorterPager({ container: $(<span style="color:maroon;">"#pager"</span>), positionFixed: <span style="color:blue;">false</span>, size: 30 });
            ...
        });
    <span style="color:blue;">&lt;/</span><span style="color:maroon;">script</span><span style="color:blue;">&gt;
&lt;/</span><span style="color:maroon;">head</span><span style="color:blue;">&gt;
&lt;</span><span style="color:maroon;">body</span><span style="color:blue;">&gt;
    </span>...
    <span style="color:blue;">&lt;</span><span style="color:maroon;">div </span><span style="color:red;">id</span><span style="color:blue;">="pager" </span><span style="color:red;">align</span><span style="color:blue;">="center"&gt;
        &lt;</span><span style="color:maroon;">input </span><span style="color:red;">type</span><span style="color:blue;">="text" </span><span style="color:red;">name</span><span style="color:blue;">="pagecurrent" </span><span style="color:red;">class</span><span style="color:blue;">="pagecurrent"&gt;
        &lt;</span><span style="color:maroon;">span</span><span style="color:blue;">&gt; </span>/ <span style="color:blue;">&lt;/</span><span style="color:maroon;">span</span><span style="color:blue;">&gt;
        &lt;</span><span style="color:maroon;">span </span><span style="color:red;">class</span><span style="color:blue;">="pagecount"&gt;</span>1<span style="color:blue;">&lt;/</span><span style="color:maroon;">span</span><span style="color:blue;">&gt;
    &lt;/</span><span style="color:maroon;">div</span><span style="color:blue;">&gt;
    </span>...
    <span style="color:blue;">&lt;</span><span style="color:maroon;">table </span><span style="color:red;">class</span><span style="color:blue;">="tblSortable"&gt;
        </span>...
    <span style="color:blue;">&lt;/</span><span style="color:maroon;">table</span><span style="color:blue;">&gt;
&lt;/</span><span style="color:maroon;">body</span><span style="color:blue;">&gt;
&lt;/</span><span style="color:maroon;">html</span><span style="color:blue;">&gt;

</span></pre>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/cplussharp.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/cplussharp.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/cplussharp.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/cplussharp.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/cplussharp.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/cplussharp.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/cplussharp.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/cplussharp.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/cplussharp.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/cplussharp.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/cplussharp.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/cplussharp.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/cplussharp.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/cplussharp.wordpress.com/14/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cplussharp.wordpress.com&amp;blog=18564258&amp;post=14&amp;subd=cplussharp&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>https://cplussharp.wordpress.com/2011/03/18/jquery-tablesorter-pager-jump-to-page/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="https://secure.gravatar.com/avatar/a92e43afc5e7f930704c791a393f7c8a?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">cplussharp</media:title>
		</media:content>
	</item>
		<item>
		<title>ALM mit Redmine, Teil 1</title>
		<link>https://cplussharp.wordpress.com/2011/01/09/alm-mit-redmine-teil-1/</link>
		<comments>https://cplussharp.wordpress.com/2011/01/09/alm-mit-redmine-teil-1/#comments</comments>
		<pubDate>Sun, 09 Jan 2011 21:22:00 +0000</pubDate>
		<dc:creator>cplussharp</dc:creator>
				<category><![CDATA[Projektmanagement]]></category>
		<category><![CDATA[ALM]]></category>
		<category><![CDATA[Bitnami]]></category>
		<category><![CDATA[Redmine]]></category>
		<category><![CDATA[Support]]></category>

		<guid isPermaLink="false">https://cplussharp.wordpress.com/2011/01/09/alm-mit-redmine-teil-1/</guid>
		<description><![CDATA[Kürzlich war ich auf der Suche nach einem guten Bugtracker, um den Support in unserer Firma etwas zu unterstützen und um so eine Art Wissensdatenbank aufzubauen. Zur Zeit werden bei uns Fehlermeldungen und Probleme von Kunden unserer Produkte vom Support-Mitarbeiter entgegengenommen und so weit geholfen wie möglich. Wenn unser Support-Mitarbeiter nicht mehr weiter weiß, wird das [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cplussharp.wordpress.com&amp;blog=18564258&amp;post=13&amp;subd=cplussharp&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Kürzlich war ich auf der Suche nach einem guten Bugtracker, um den Support in unserer Firma etwas zu unterstützen und um so eine Art Wissensdatenbank aufzubauen. Zur Zeit werden bei uns Fehlermeldungen und Probleme von Kunden unserer Produkte vom Support-Mitarbeiter entgegengenommen und so weit geholfen wie möglich. Wenn unser Support-Mitarbeiter nicht mehr weiter weiß, wird das Problem telefonisch oder per E-Mail an den entsprechenden Entwickler dieser Software weitergeleitet. Der bearbeitet dann das Ganze und schickt dem Kunden eine Lösung bzw. verweist ihn auf ein kommendes Update der Software. Es ist natürlich ungünstig für den Entwickler, wenn ähnliche Probleme immer wieder bei ihm auf den Tisch landen und ihn von der eigentlichen Arbeit abhalten.</p>
<p>Um diesen Missstand zu beheben wollen wir jetzt einen Bugtracker einführen welcher den Support-Mitarbeiter bei der Fehlerbehebung unterstützt. Einmal aufgetauchte Fehler oder auch nur Anfragen werden in den Bugtracker eingetragen und kategorisiert. Wenn der Fehler nicht gleich behoben werden kann, kümmert sich der entsprechende Entwickler darum und trägt die Lösung ein bzw. verweist auf die Programmversion, in der der Fehler behoben ist. So weit der Plan jedenfalls!</p>
<p>Bei meiner Suche nach entsprechenden Lösungen bin ich natürlich auf tausende von Systemen und Programme gestoßen. Da das Ganze aber so kostengünstig wie möglich sein soll, blieben nur ein paar wenige Open-Source Programme übrig. Die da wären <a href="http://www.bugzilla.org/" target="_blank">Bugzilla</a>, <a href="http://www.mantisbt.org/" target="_blank">Mantis</a>, <a href="http://trac.edgewall.org/" target="_blank">Trac</a> und schließlich <a href="http://www.redmine.org/" target="_blank">Redmine</a>.</p>
<p>Von den ganzen Programmen hat mir Redmine am besten gefallen. Bugzilla war zwar gut, aber die Installation ist einfach unmöglich. Mantis ist vom Umfang her auch recht gut, aber die Oberfläche sieht einfach altbacken aus. Und Trac schließlich hat keine wirklich zufriedenstellende Multi-Projekt-Unterstützung und eine zu komplizierte Oberfläche. Redmine war mir vorher total unbekannt, aber dank <a href="http://bitnami.org/" target="_blank">Bitnami</a> und ihren fertigen All-in-one-Installern bzw. ihren fertigen Virtuellen Maschinen konnte ich den Bugtracker ohne Probleme ausprobieren.</p>
<p>Also läuft jetzt bei uns erst mal eine VM mit Ubuntu 10.10, Apache, MySql, Ruby und Redmine zum Testeinsatz. Dank der Weboberfläche war es das schon fast mit der Installation der Software im Unternehmen. Jetzt bracht nur noch jeder Mitarbeiter ein Login und den Link mit der IP der VM und dem Programm. Die Weitere Einrichtung des Programmes sowie unsere Erfahrungen damit, werden in den kommenden Teilen beschrieben.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/cplussharp.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/cplussharp.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/cplussharp.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/cplussharp.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/cplussharp.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/cplussharp.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/cplussharp.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/cplussharp.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/cplussharp.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/cplussharp.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/cplussharp.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/cplussharp.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/cplussharp.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/cplussharp.wordpress.com/13/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cplussharp.wordpress.com&amp;blog=18564258&amp;post=13&amp;subd=cplussharp&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>https://cplussharp.wordpress.com/2011/01/09/alm-mit-redmine-teil-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="https://secure.gravatar.com/avatar/a92e43afc5e7f930704c791a393f7c8a?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">cplussharp</media:title>
		</media:content>
	</item>
		<item>
		<title>gemanagte Referenzen in einer nicht gemanagten Klasse speichern</title>
		<link>https://cplussharp.wordpress.com/2011/01/03/gemanagte-referenzen-in-einer-nicht-gemanagten-klasse-speichern/</link>
		<comments>https://cplussharp.wordpress.com/2011/01/03/gemanagte-referenzen-in-einer-nicht-gemanagten-klasse-speichern/#comments</comments>
		<pubDate>Mon, 03 Jan 2011 21:23:00 +0000</pubDate>
		<dc:creator>cplussharp</dc:creator>
				<category><![CDATA[Tipps und Tricks]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[C++ CLI]]></category>

		<guid isPermaLink="false">https://cplussharp.wordpress.com/2011/01/03/gemanagte-referenzen-in-einer-nicht-gemanagten-klasse-speichern/</guid>
		<description><![CDATA[Wenn man C++ CLI und normales C++ in einem Projekt zusammen einsetzt, tauchen früher oder später scheinbar unlösbare Probleme auf. Bei einem Videoplayer den wir zur Zeit programmieren, war es nun soweit. Um den Programmcode etwas zu entschlacken und den darunter liegenden Algorithmus zur Erstellung eines DirectShow Aufnahmegraphen wieder sichtbar zu machen, wurde es endlich [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cplussharp.wordpress.com&amp;blog=18564258&amp;post=10&amp;subd=cplussharp&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Wenn man C++ CLI und normales C++ in einem Projekt zusammen einsetzt, tauchen früher oder später scheinbar unlösbare Probleme auf. Bei einem Videoplayer den wir zur Zeit programmieren, war es nun soweit.</p>
<p>Um den Programmcode etwas zu entschlacken und den darunter liegenden Algorithmus zur Erstellung eines DirectShow Aufnahmegraphen wieder sichtbar zu machen, wurde es endlich Zeit eine Referenz auf ein gemanagtes Objekt in einer nativen Klasse zu speichern.</p>
<p>Im WPF-Frontend (C#) stellt der Nutzer ein, von welcher Kamera er aufnehmen will und in welches Format das geschehen soll. Diese Konfiguration wird an das Backend (C++) übergeben, in dem schließlich der Aufnahmegraph aufgebaut wird. Dabei kann es sehr viele unterschiedliche Kombination der Konfigurationsparameter geben. Die Art der Kamera (DV, USB, …), die Audioquelle, TimeShift (darüber werde ich bei Gelegenheit auch noch einen Blog-Eintrag schreiben =&gt; das war meine Diplomarbeit!) und noch einige mehr spielen hierbei eine Rolle.</p>
<p>Der Aufbau des Aufnahmegraphen erfolgte in einer großen Klasse mit etlichen Funktionen, und immer wieder wurde als Parameter dieser Funktionen ein Parameter vom Typ <em>ICaptureConfiguration^</em> übergeben. Also habe ich das ganze aufgeflochten und in mehrere Klassen verteilt. Eine abstrakte Basisklasse mit statischen Hilfsfunktionen und einem Interface mit den wichtigsten Methoden, welche dann durch die Detail-Klassen abgedeckt sein müssen. Und um nicht ständig die Konfiguration als Parameter übergeben zu müssen, wird dieser Kontraktur als Member gespeichert.</p>
<p>Doch oh Schreck, was ist das: “Der Typ <em>ICaptureConfiguration^</em> kann nicht als Membervariable einer nicht C++ CLI Klasse verwendet werden!” Ist ja eigentlich auch logisch, wie soll sonst der Speichermanager der CLR mitbekommen, wann die Referenz nicht mehr gebraucht wird und er das Objekt wieder freigeben kann. Oder noch schlimmer, wenn der Speichermanager des Objekt in seinem Speicher an eine andere Adresse schiebt um Platz zu schaffen, wäre die Referenz plötzlich ungültig! Es gibt nun nur zwei Möglichkeiten: entweder alles auf C++ CLI umstellen, was mindesten 100 Tage oder mehr dauern würde oder aber doch einen Weg finden, die Referenz zu speichern.</p>
<p>Dank google, der MSDN und anderen Seiten ist es mir zum Glück schließlich doch gelungen die Referenz zu speichern. Genau dafür gibt es nämlich das Template <em>gcroot&lt;T&gt;</em>. Es sorgt dafür, dass die zugewiesene Referenz immer erreichbar ist. Da man solch eine Referenz immer mit <em>delete</em> wieder freigeben müsste, ist es besser man nutzt <em>auto_gcroot&lt;T&gt;</em>. Das wird nämlich wie alle Wrapper dieser Art automatisch freigegeben. Im Code sieht das ganze dann in etwa so aus:</p>
<pre class="code"><span style="color:blue;">#include </span><span style="color:#a31515;">&lt;msclr\auto_gcroot.h&gt;
</span><span style="color:blue;">#using </span><span style="color:#a31515;">&lt;mscorlib.dll&gt;

</span><span style="color:blue;">using namespace </span>System;
...

<span style="color:blue;">class </span>CCaptureMgrBase
{
    CCaptureMgrBase(ICaptureConfiguration^ captureConfig)
    {
        m_captureConfig = captureConfig;
    }
    ...
    msclr::auto_gcroot&lt;ICaptureConfiguration^&gt; m_captureConfig;
}
</pre>
<p>Mit –&gt; kann man nun ganz normal auf die Referenz zugreifen und Funktionen aufrufen.</p>
<p>Eine kleine Anmerkung habe ich allerdings noch. Man kann <em>m_captureConfig</em> nicht mehr einfach so an eine Funktion übergeben, welche ein <em>ICaptureConfiguration^</em> als Parameter erwarte! Dafür muss man nun <em>m_captureConfig.get()</em> aufrufen.</p>
<pre class="code"><span style="color:blue;">class </span>CCaptureMgrBase
{
    ...
    <span style="color:blue;">void </span>Render()
    {
        <span style="color:green;">// geht nicht:
        </span>CCaptureMgrBase::Helper(m_captureConfig);

        <span style="color:green;">// so ist es richtig
        </span>CCaptureMgrBase::Helper(m_captureConfig.get());
    }

    <span style="color:blue;">static void </span>Helper(ICaptureConfiguration^ captureConfig) { ... }
}
</pre>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/cplussharp.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/cplussharp.wordpress.com/10/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/cplussharp.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/cplussharp.wordpress.com/10/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/cplussharp.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/cplussharp.wordpress.com/10/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/cplussharp.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/cplussharp.wordpress.com/10/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/cplussharp.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/cplussharp.wordpress.com/10/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/cplussharp.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/cplussharp.wordpress.com/10/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/cplussharp.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/cplussharp.wordpress.com/10/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cplussharp.wordpress.com&amp;blog=18564258&amp;post=10&amp;subd=cplussharp&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>https://cplussharp.wordpress.com/2011/01/03/gemanagte-referenzen-in-einer-nicht-gemanagten-klasse-speichern/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="https://secure.gravatar.com/avatar/a92e43afc5e7f930704c791a393f7c8a?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">cplussharp</media:title>
		</media:content>
	</item>
	</channel>
</rss>
