<?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>HP&#039;s Blog</title>
	<atom:link href="http://blog.schelian.de/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.schelian.de</link>
	<description>Hans-Peter Schelian&#039;s Weblog</description>
	<lastBuildDate>Fri, 18 Jan 2013 11:58:02 +0000</lastBuildDate>
	<language>de-DE</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5</generator>
		<item>
		<title>Windows 8 Store Apps (HTML5/JavaScript) &#8211; CSS ist nicht gleich CSS</title>
		<link>http://blog.schelian.de/2013/01/windows-8-store-apps-html5javascript-css-ist-nicht-gleich-css/</link>
		<comments>http://blog.schelian.de/2013/01/windows-8-store-apps-html5javascript-css-ist-nicht-gleich-css/#comments</comments>
		<pubDate>Fri, 18 Jan 2013 11:58:02 +0000</pubDate>
		<dc:creator>Hans-Peter Schelian</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Wissenswert]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML 5]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[WIN-8]]></category>
		<category><![CDATA[Windows 8 Store Apps]]></category>

		<guid isPermaLink="false">http://blog.schelian.de/?p=2011</guid>
		<description><![CDATA[Bei der Arbeit an einer Windows 8 Store App die ich mit HTML5 und JavaScript realisiere, bin ich auf folgendes Problem gestoßen (welches ich hier bereits auf Facebook gepostet habe): Doch zuerst einmal ein kurzer Ausschnitt des Markup bei welchem &#8230; <a href="http://blog.schelian.de/2013/01/windows-8-store-apps-html5javascript-css-ist-nicht-gleich-css/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px 10px 0px 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" align="left" src="http://blog.schelian.de/wp-content/uploads/2013/01/image.png" width="87" height="87">Bei der Arbeit an einer Windows 8 Store App die ich mit HTML5 und JavaScript realisiere, bin ich auf folgendes Problem gestoßen (welches ich <a href="http://www.facebook.com/schelianhp/posts/491864214190014" target="_blank">hier</a> bereits auf Facebook gepostet habe):</p>
<p>Doch zuerst einmal ein kurzer Ausschnitt des Markup bei welchem das Problem auftritt:</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:ed5d63c3-c976-4b3f-b9cd-9bb28214ce18" class="wlWriterEditableSmartContent">
<pre style=white-space:normal>
<pre class="brush: xml; pad-line-numbers: true; title: ; notranslate">
&lt;body&gt;
	&lt;div id=&quot;itemTemplate&quot;&gt;
		&lt;figure&gt;
			&lt;img id=&quot;profile-image&quot; src=&quot;images/smalllogo.png&quot; /&gt;
		&lt;/figure&gt;
		&lt;div&gt;
			&lt;span data-win-bind=&quot;innerText: text&quot;&gt;Testen&lt;/span&gt;
		&lt;/div&gt;
	&lt;/div&gt;
&lt;/body&gt;
</pre>
</div>
<p>Im zugehörigen Stylesheet sind unter anderem folgende Styles definiert:</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:ab139816-0088-463c-9c7c-0556a27511ff" class="wlWriterEditableSmartContent">
<pre style=white-space:normal>
<pre class="brush: css; title: ; notranslate">
figure {
    margin: 0px;   
}

#itemTemplate figure img {
    margin: 30px;
}
</pre>
</div>
<p>So wie die Styles definiert sind, sollte das Image Element mit der ID “profile-image” eine Margin von 30px auf allen Seiten vorweisen. </p>
<p>Das funktioniert auch wenn man es in einem Browser aufruft (Sogar der IE funktioniert hierbei korrekt <img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smiley" src="http://blog.schelian.de/wp-content/uploads/2013/01/wlEmoticon-smile.png"> ).</p>
<p><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px 10px 2px 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" align="left" src="http://blog.schelian.de/wp-content/uploads/2013/01/image1.png" width="202" height="70">Wenn man diese Formatierung allerdings in einem “<strong>HTML5/JavaScript Windows a Store App</strong>” (was für ein Begriff<img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-sadsmile" alt="Trauriges Smiley" src="http://blog.schelian.de/wp-content/uploads/2013/01/wlEmoticon-sadsmile.png"> ) verwendet, greift der Style “#itemplate figure img” nicht in dem Image Element, welches in dem Figure Element eingebettet ist, sondern die Margin Einstellung des übergeordneten Elementes Figur hebt die Formatierung des darin eingebetteten Image Elementes auf.</p>
<blockquote>
<p>Ein erstes kleines Fazit dabei ist, dass man sich nicht darauf verlassen kann, dass der zuletzt definierte Style tatsächlich Verwendung findet. <br />Wenigstens dann nicht wenn man übergeordnete globale Element Formatierungen verwendet.</p>
</blockquote>
<div align="center"><a href="http://twitter.com/SchelianHP" target="_blank"><img src="http://blog.schelian.de/wp-content/plugins/igit-follow-me-after-post-button-new/twitter11.png" /></a></div>]]></content:encoded>
			<wfw:commentRss>http://blog.schelian.de/2013/01/windows-8-store-apps-html5javascript-css-ist-nicht-gleich-css/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>XAML oder HMTL5</title>
		<link>http://blog.schelian.de/2012/12/xaml-oder-hmtl5/</link>
		<comments>http://blog.schelian.de/2012/12/xaml-oder-hmtl5/#comments</comments>
		<pubDate>Sat, 22 Dec 2012 07:53:30 +0000</pubDate>
		<dc:creator>Hans-Peter Schelian</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[APPS]]></category>
		<category><![CDATA[HTML 5]]></category>
		<category><![CDATA[WIN-8]]></category>
		<category><![CDATA[XAML]]></category>

		<guid isPermaLink="false">http://blog.schelian.de/?p=1989</guid>
		<description><![CDATA[Zum Jahresende stellt sich für mich noch die &#8220;Frage aller Fragen&#8221; (Also die aktuelle &#8220;Frage aller Fragen&#8221; werde sicherlich bald wieder eine neue haben : Bisher konnte ich mich um dieses XAML Gedöns ganz gut herumdrücken. Viel Backend Entwicklung (kein &#8230; <a href="http://blog.schelian.de/2012/12/xaml-oder-hmtl5/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Zum Jahresende stellt sich für mich noch die &#8220;Frage aller Fragen&#8221;<br />
(Also die aktuelle &#8220;Frage aller Fragen&#8221; werde sicherlich bald wieder eine neue haben :</p>
<p><img style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="image" src="http://blog.schelian.de/wp-content/uploads/2012/12/image1.png" alt="image" width="244" height="142" border="0" /></p>
<p>Bisher konnte ich mich um dieses XAML Gedöns ganz gut herumdrücken.</p>
<ul>
<li>Viel Backend Entwicklung (kein XAML notwendig)</li>
<li>WPF habe ich ausgesessen.</li>
<li>Silverlight ignoriert</li>
<li>Für die Dicken “Fat Clients” habe ich (immer noch) Winforms eingesetzt und für Webseiten neben C#, HMTL nur ein wenig JavaScript benötigt.</li>
</ul>
<p>Und nun, stehen Windows 8 Apps (also die Kachel Programme <img class="wlEmoticon wlEmoticon-smile" style="border-style: none;" src="http://blog.schelian.de/wp-content/uploads/2012/12/wlEmoticon-smile1.png" alt="Smiley" />) auf der Liste.</p>
<p align="left"><img style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="image" src="http://blog.schelian.de/wp-content/uploads/2012/12/image2.png" alt="image" width="109" height="152" border="0" /><a href="http://blog.schelian.de/wp-content/uploads/2012/12/image3.png"><img style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="image" src="http://blog.schelian.de/wp-content/uploads/2012/12/image_thumb.png" alt="image" width="223" height="152" border="0" /></a><a href="http://blog.schelian.de/wp-content/uploads/2012/12/image4.png"><img style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="image" src="http://blog.schelian.de/wp-content/uploads/2012/12/image_thumb1.png" alt="image" width="121" height="152" border="0" /></a></p>
<div align="center"><a href="http://twitter.com/SchelianHP" target="_blank"><img src="http://blog.schelian.de/wp-content/plugins/igit-follow-me-after-post-button-new/twitter11.png" /></a></div>]]></content:encoded>
			<wfw:commentRss>http://blog.schelian.de/2012/12/xaml-oder-hmtl5/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Ultrabook &#8211; Lenovo Twist &#8211; WIN-8</title>
		<link>http://blog.schelian.de/2012/12/ultrabook-lenovo-twist-win-8/</link>
		<comments>http://blog.schelian.de/2012/12/ultrabook-lenovo-twist-win-8/#comments</comments>
		<pubDate>Sun, 16 Dec 2012 20:24:24 +0000</pubDate>
		<dc:creator>Hans-Peter Schelian</dc:creator>
				<category><![CDATA[Betriebssysteme]]></category>
		<category><![CDATA[Mobile Geräte]]></category>
		<category><![CDATA[Lenovo]]></category>
		<category><![CDATA[Twist]]></category>
		<category><![CDATA[WIN-8]]></category>

		<guid isPermaLink="false">http://blog.schelian.de/?p=1973</guid>
		<description><![CDATA[Abstract (Zusammenfassung f&#252;r ungeduldige): Wenn man einen Lenovo Twist bestellt, sollte man nicht erwarten ein Ger&#228;t in der gleichen Klasse wie einen Apple Mac Book Air (MBA) zu bekommen. Das w&#228;re wohl auch zu viel verlangt, denn der Lenovo kostet &#8230; <a href="http://blog.schelian.de/2012/12/ultrabook-lenovo-twist-win-8/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<h2>Abstract (Zusammenfassung f&#252;r ungeduldige):</h2>
<p><img style="background-image: none; margin: 0px 6px 0px 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; padding-top: 0px; border: 0px;" title="image" src="http://blog.schelian.de/wp-content/uploads/2012/12/image.png" alt="image" width="96" height="65" align="left" border="0" />Wenn man einen Lenovo Twist bestellt, sollte man nicht erwarten ein Ger&#228;t in der gleichen Klasse wie einen Apple Mac Book Air (MBA) zu bekommen. Das w&#228;re wohl auch zu viel verlangt, denn der Lenovo kostet einiges weniger als ein MBA</p>
<p>.Aber man bekommt ein Ger&#228;t, was meiner Meinung nach vor allem f&#252;r den Betrieb mit Windows 8 einen guten Kompromiss, zwischen kleinem Ger&#228;t, Guter Leistung und akzeptablem Preis darstellt.</p>
<p>Leider kann man den Twist nicht in einer, meiner Meinung nach &#8220;brauchbaren&#8221; Ausstattung (SSD ist zu klein) direkt bestellen.</p>
<p>Man kann ihn, wie ich sp&#228;ter noch beschreibe werde, aber relativ einfach mit der fehlenden gr&#246;&#223;eren SSD aufr&#252;sten.</p>
<h2>Erste Eindr&#252;cke</h2>
<p>
<img style="display: inline; float: left;" src="http://t0.gstatic.com/images?q=tbn:ANd9GcTuUL3UU2HLb_8yi5BLSxX8N9X7k8kFOkV0yAr-Ho-ZvIOiAONvorTqIVE" alt="Vollbild anzeigen" align="left" />Nach 2 Tagen Einrichtung und Verwendung des Lenovo Twist m&#246;chte ich hier meine ersten Eindr&#252;cke mit dem Ultrabook und Windows 8 zum besten geben. Die meisten die mich kennen, wissen dass ich mich mit Windows 8 auf dem Desktop Rechner etwas schwer tue, ja schon gut, etwas sehr viel schwer tue <img class="wlEmoticon wlEmoticon-smile" style="border-style: none;" src="http://blog.schelian.de/wp-content/uploads/2012/12/wlEmoticon-smile.png" alt="Smiley" />ist eventuell etwas untertrieben, aber nach dem Motto:</p>
<blockquote><p>
  <strong>Gib Windows 8 eine Chance</strong>
</p></blockquote>
<p>
Habe ich mir extra ein Ger&#228;t bestellt, welches meiner Meinung nach, die wichtigste Voraussetzung f&#252;r Windows 8 erf&#252;llt, und das ist:</p>
<p>Es besitzt ein Touch Display und kann damit die st&#228;rken (ups was habe ich das gesagt st&#228;rken <img src='http://blog.schelian.de/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  ) von Windows 8 ausspielen.</p>
<h2>Los geht&#8217;s</h2>
<p>
Das erste was mir aufgefallen ist und das war gleich so ein:</p>
<blockquote><p>
  &#8220;Oh man was machen die da nur und warum ist das bei meinem MBA ganz anders Aufschrei&#8221;
</p></blockquote>
<p>
Bei relativ wenig Aktivit&#228;t setzt der L&#252;fter des Ger&#228;ts sehr schnell ein und verursacht somit ein leises aber eben nicht un&#252;berh&#246;rbares Ger&#228;usch. Das kenne ich vom MBA nur wenn ich mit einer Windows VM arbeite und die unter H&#246;chstlast betreibe. Aber OK, das macht mein DELL Precision (Meine tragbare Workstation) auch hin und wieder, also ein Problem welches eher an Windows und weniger am Twist liegt.</p>
<p>Dann ist mir auch noch aufgefallen, dass auf der rechten Seite, da wo die L&#252;fter sind, auch schon mal die Temperatur ganz sch&#246;n nach oben gehen kann.</p>
<h3>Tastatur Touchpad</h3>
<p>
Die Tastatur des Twist ist, na sagen wir mal &#8220;OK&#8221;, das Touchpad hat eine recht gute Touch Gesten Unterst&#252;tzung ist aber viel weniger Pr&#228;zise als ich das von einem MBA her kenne. Es f&#252;hlt sich auch nicht so hochwertig an irgendwie so ein wenig nach Plastik. Ich finde aber trotzdem das man damit seine Arbeit machen kann und, dass es zu dem Preisgef&#252;ge des Twist passt.<br />
Wo wir gerade bei der Tastatur sind, muss ich leider noch anmerken, dass es mir pers&#246;nlich schon fehlt, dass diese nicht beleuchtet ist, dieses Feature ist doch gerade bei Ger&#228;ten die man auch mal so auf dem Scho&#223; betreibt, eigentlich recht angenehm.</p>
<h3>Display</h3>
<p>
Das Display ist wie bereits erw&#228;hnt ein 12,5 Zoll Touch Display mit relativ geringer Aufl&#246;sung. Die geringe Aufl&#246;sung von maximal 1366 X 768 ist f&#252;r die Kacheloberfl&#228;che absolut ausreichend. f&#252;r etwas anspruchsvollere Desktopanwendungen w&#252;rde man sich aber schon etwas mehr Aufl&#246;sung w&#252;nschen.</p>
<p>Die Touch Bedienung funktioniert mit dem Display wie erwartet gut. Nach zwei Tagen kann ich aber schon sagen, dass ich &#252;berhaupt kein gr&#246;&#223;eres Display an diesem Ger&#228;t haben wollte; 12,5&#8221; beschmiertes Display gen&#252;gen vollkommen. Bisher habe ich mich nur bei Tablet Rechnern wie das iPad an die verschmierten Bildschirme gew&#246;hnt aber nicht an &#8220;quasi&#8221; Desktop Rechner / Notebooks, ob ich mich damit jemals anfreunden kann, wer wei&#223;.</p>
<h3>Prozessor</h3>
<p>
Im Lenovo Twist ist ein I7 mit 2 Kernen verbaut der gen&#252;gend Power hat um fl&#252;ssiges arbeiten sicherzustellen.</p>
<h3>Hauptspeicher</h3>
<p>
Ich habe die Variante mit 8 GB (maximale Ausbaustufe) bestellt.<br />
Mit diesen 8 GB kann das ganze WIN-8 <span style="text-decoration: line-through;">(Metro)</span> Ged&#246;ns gut betrieben werden. Office Programme und auch Visual Studio funktionieren recht ansprechend mit der Speicherausstattung.<br />
VM&#8217;s wollte ich damit allerdings nicht regelm&#228;&#223;ig betreiben, aber daf&#252;r ist ein Ultrabook wie der Twist sicherlich auch nicht gedacht.</p>
<h3>Festplatte / SSD</h3>
<p>
Auch bei der Festplatte habe ich die gr&#246;&#223;te Ausbaustufe bestellt. Das ist aber leider nur eine SSD mit 128 GB.</p>
<p>Nachdem man WIN-8, Office und Visual Studio installiert hat bleiben gerade mal 40 GB freier Speicher und das reicht &#8220;mir&#8221; auf jeden Fall nicht aus.</p>
<p>Positiv ist aber, dass die SSD ist von au&#223;en zug&#228;nglich und nach l&#246;sen von nur einer Schraube ausgetauscht werden kann.</p>
<p>Leider ist die Aufr&#252;stung einer gr&#246;&#223;eren SSD trotz des einfachen mechanischen Austauschs nicht ganz so problemlos verlaufen, wie zuerst gedacht.</p>
<p>Das liegt haupts&#228;chlich an zwei Dingen:</p>
<blockquote><p>
  1) Zum Lenovo Twist wird &#8220;kein&#8221; Datentr&#228;ger mit dem Betriebssystem und den Tools mitgeliefert.<br />
  Wobei ein Datentr&#228;ger in Form einer CD/DVD in Ermangelung eines CD/DVD Laufwerks nicht direkt verwendet werden k&#246;nnte. Doch ein ISO File welches man auf einen USB Stick zum booten kopieren k&#246;nnte w&#252;rde einem das Leben schon enorm erleichtern um ein System auf einer Platte neu zu installieren.</p>
<p>2)Die Clone Methode von Acronis True Image die ich eigentlich verwenden wollte, habe ich mit dem Lenovo Twist nicht zum funktionieren gebracht <img src='http://blog.schelian.de/wp-includes/images/smilies/icon_sad.gif' alt=':-(' class='wp-smiley' /> .</p>
</blockquote>
<p>
Da auf der Original SSD verschiedene Volumes angelegt sind, darunter auch ein Recovery Volume, musste ich mir etwas einfallen lassen um diese Volumes auch auf die &#8220;neue&#8221; SSD zu &#252;bertragen, damit man im Notfall sp&#228;ter mit der neuen SSD ein Recocery machen kann..</p>
<p>Da die Clone Methode mit Acronis True Image nicht funktioniert hat, habe ich &#252;ber eine Backup / Restore Strategie die SSD gegen eine Samsung SSD 840 Pro mit 256 GB ausgetauscht.</p>
<p>Wenn jemand Probleme mit dem Austausch der SSD hat und noch Tipps braucht, einfach per Kommentar melden, ich kann dann noch ausf&#252;hrlicher erl&#228;utern was zu tun ist damit man die kompletten Volumes der Original SSD auf die neue SSD &#252;bertragen kann.</p>
<h3>Akku / Laufzeit</h3>
<p>
Ich habe keine aufwendigen Testre&#237;hen durchgef&#252;hrt um die Akkulaufzeit zu ermitteln oder effektive Laufzeiten bestimmen zu k&#246;nnen sondern dies hier sind einfach Eindr&#252;cke die beim arbeiten mit dem Lenovo Twist entstanden sind.</p>
<p>Ich kann &#8220;nicht&#8221; bet&#228;tigen dass der Akku 7 Stunden Betriebszeit gew&#228;hrleistet, aber ich kam bisher selbst, wenn ich den Twist gequ&#228;lt habe immer weit &#252;ber 4 &#8211; 5 Stunden mit einer Akkuladung hin. Also bei nur ein bisschen Surfen oder Nutzung von Office sollte noch einiges mehr drin sein.</p>
<h2>Res&#252;mees</h2>
<p>
Der Lenovo Twist f&#252;hlt sich auch dank der sehr griffigen Oberfl&#228;che gut an.</p>
<p>Das Display ist OK aber nicht &#252;berragend, gen&#252;gt aber meinen Anspr&#252;chen um Windows 8 mit der Kacheloberfl&#228;che betreiben zu k&#246;nnen und, so vermute ich, auch um WIN-8 App Entwicklung mit Visual Studio darauf aus&#252;ben zu k&#246;nnen (das wird sich in den n&#228;chsten Wochen zeigen).</p>
<p>Nachdem die SSD aufger&#252;stet ist, gen&#252;gt die Hardware (Prozessor, Hauptspeicher &#8220;und&#8221; Festplatte) den aktuellen Anspr&#252;chen um sich leistungsstarker Ultrabook nennen zu d&#252;rfen.</p>
<div align="center"><a href="http://twitter.com/SchelianHP" target="_blank"><img src="http://blog.schelian.de/wp-content/plugins/igit-follow-me-after-post-button-new/twitter11.png" /></a></div>]]></content:encoded>
			<wfw:commentRss>http://blog.schelian.de/2012/12/ultrabook-lenovo-twist-win-8/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Google Music Manager &#8211; Couldn&#8217;t connect to Google Play</title>
		<link>http://blog.schelian.de/2012/10/google-music-manager-couldnt-connect-to-google-play/</link>
		<comments>http://blog.schelian.de/2012/10/google-music-manager-couldnt-connect-to-google-play/#comments</comments>
		<pubDate>Mon, 01 Oct 2012 08:59:27 +0000</pubDate>
		<dc:creator>Hans-Peter Schelian</dc:creator>
				<category><![CDATA[Cloud]]></category>
		<category><![CDATA[Tips und Tricks]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Music Manager]]></category>

		<guid isPermaLink="false">http://blog.schelian.de/?p=1968</guid>
		<description><![CDATA[Seit einigen Wochen hat der Google Music Manager auf meinem Windows 7 Rechner seinen Betrieb eingestellt. Da das synchronisieren der Musik in die Google Music Cloud nun nicht zu meinem Haupt Business gehört, war die Priorität zur Lösung des Problems &#8230; <a href="http://blog.schelian.de/2012/10/google-music-manager-couldnt-connect-to-google-play/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Seit einigen Wochen hat der Google Music Manager auf meinem Windows 7 Rechner seinen Betrieb eingestellt.</p>
<p>Da das synchronisieren der Musik in die Google Music Cloud nun nicht zu meinem Haupt Business gehört, war die Priorität zur Lösung des Problems auch nicht ganz so hoch angesiedelt wie das bei Problemen ist, die mich beim erledigen meiner eigentlichen Tätigkeit behindern.</p>
<p>Aber da mich das Problem doch so langsam genervt hat,&nbsp; habe ich mich auf die Fehlersuche gemacht und bin auch fündig geworden.</p>
<p>Hier zuerst noch einmal kurz das Problem, das von Heute auf Morgen aufgetreten ist:</p>
<p>Beim Start des Music Manager konnte, wie unten zu sehen ist, dieser sich nicht mit Google Music verbinden.</p>
<p><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="SNAGHTMLf6c2a7" border="0" alt="SNAGHTMLf6c2a7" src="http://blog.schelian.de/wp-content/uploads/2012/10/SNAGHTMLf6c2a7.png" width="244" height="233"></p>
<p>Deinstallieren und neu Installieren bracht auch keine Besserung.</p>
<p>Eine genauere Recherche hat dann ergeben, dass beim Versuch sich bei der Google Music Cloud anzumelden, ein Problem mit den in Windows installierten Root Zertifikaten eingestellt hat.</p>
<p>Ein einfaches Update dieser Zertifikate bringt schon Abhilfe und der Google Music Manager läuft wieder einwandfrei.</p>
<p>Hier der Link zum Update der Zertifikate (Für Windows ):</p>
<p><a href="http://download.windowsupdate.com/msdownload/update/v3/static/trustedr/en/rootsupd.exe">http://download.windowsupdate.com/msdownload/update/v3/static/trustedr/en/rootsupd.exe</a></p>
<p>Einfache herunterladen und ausführen.</p>
<p>Und nicht wundern, das Update erfolgt ohne weitere Ausgaben auf dem Bildschirm</p>
<div align="center"><a href="http://twitter.com/SchelianHP" target="_blank"><img src="http://blog.schelian.de/wp-content/plugins/igit-follow-me-after-post-button-new/twitter11.png" /></a></div>]]></content:encoded>
			<wfw:commentRss>http://blog.schelian.de/2012/10/google-music-manager-couldnt-connect-to-google-play/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Einlesen von &#8220;delimited with&#8221; Daten &#8211; Leicht gemacht mit Hilfe von Custom Attribut</title>
		<link>http://blog.schelian.de/2012/06/einlesen-von-delimited-with-daten-leicht-gemacht-mit-hilfe-von-custom-attribut/</link>
		<comments>http://blog.schelian.de/2012/06/einlesen-von-delimited-with-daten-leicht-gemacht-mit-hilfe-von-custom-attribut/#comments</comments>
		<pubDate>Sat, 30 Jun 2012 20:08:00 +0000</pubDate>
		<dc:creator>Hans-Peter Schelian</dc:creator>
				<category><![CDATA[Tips und Tricks]]></category>
		<category><![CDATA[Attributes]]></category>
		<category><![CDATA[Delimited]]></category>
		<category><![CDATA[Import]]></category>

		<guid isPermaLink="false">http://blog.schelian.de/?p=1963</guid>
		<description><![CDATA[So lange es EDV gibt und wohl auch, so lange es EDV geben wird ist der Austausch von Daten immer wieder ein Thema. Um Daten zwischen Verschiedenen Systemen auszutauschen sind die Möglichkeiten fast unerschöpflich. Eine der Möglichkeiten besteht darin Daten &#8230; <a href="http://blog.schelian.de/2012/06/einlesen-von-delimited-with-daten-leicht-gemacht-mit-hilfe-von-custom-attribut/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>So lange es EDV gibt und wohl auch, so lange es EDV geben wird ist der Austausch von Daten immer wieder ein Thema.</p>
<p>Um Daten zwischen Verschiedenen Systemen auszutauschen sind die Möglichkeiten fast unerschöpflich.</p>
<p>Eine der Möglichkeiten besteht darin Daten in eine Zeichenkennte zu schreiben und die Daten mit einem sogenannten Trennzeichen (Delimiter) zwischen den einzelnen Feldinformationen zu trennen (Auch noch im Zeitalter von Serialisierung und anderen tollen Dingen).</p>
<p>Die meisten Programme können Daten in diesem Format exportieren.</p>
<p>Viel interessanter wird es, wenn man diese Daten in seine eigenen Programmen verarbeiten möchte.</p>
<p>Ich möchte hier eine einfache Möglichkeit zeigen, wie man sich mit ein paar Zeilen Code eine schicke kleine Funktion und ein Custom Attribut schreiben kann die einem dabei behilflich sind, solche Daten einzulesen und diese Daten in Eigenschaften seiner eigenen Klasse zu schreiben.</p>
<p>Hier zuerst das Custom Attribute.  Das bietet schon ein wenig mehr Möglichkeiten als es hier in diesem Beispiel zum Einsatz kommt, aber der Beitrag soll auch nicht eine fertige Lösung darstellen, sondern nur behilflich sein, einen Weg zu zeigen:</p>
<div id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:63e105eb-dbc7-4efa-b41e-83152bcd6e0b" class="wlWriterEditableSmartContent" style="margin: 0px; display: inline; float: none; padding: 0px;">
<pre class="brush: csharp; title: ; notranslate">
[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)]
public class ImportFieldAttribute : Attribute
{
	/// &lt;summary&gt;
	/// Feldtype der zu importierenden Daten
	/// &lt;/summary&gt;
	private readonly ImportFieldType fieldType;

	/// &lt;summary&gt;
	/// Position im Segment
	/// &lt;/summary&gt;
	private readonly int position;

	/// &lt;summary&gt;
	/// Initializes a new instance of the &lt;see cref=&quot;ImportFieldAttribute&quot;/&gt; class.
	/// Für Import von Sätzen mit Trennzeichen
	/// &lt;/summary&gt;
	/// &lt;param name=&quot;fieldType&quot;&gt;Type of the field.&lt;/param&gt;
	/// &lt;param name=&quot;position&quot;&gt;The position.&lt;/param&gt;
	/// &lt;param name=&quot;length&quot;&gt;The length.&lt;/param&gt;
	public ImportFieldAttribute(ImportFieldType fieldType, int position)
	{
		this.fieldType = fieldType;
		this.position = position;
	}

	/// &lt;summary&gt;
	/// Feldtype der zu importierenden Daten
	/// &lt;/summary&gt;
	public ImportFieldType FieldType
	{
		get
		{
			return this.fieldType;
		}
	}

	/// &lt;summary&gt;
	/// Position im Segment
	/// &lt;/summary&gt;
	public int Position
	{
		get
		{
			return this.position;
		}
	}
}
</pre>
</div>
<p>Schauen wir uns nun den Code an der sich mit Hilfe des Custom Attribute an die Daten ran macht.</p>
<div id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:903ba811-2b63-4c1d-bb49-753e386d6f13" class="wlWriterEditableSmartContent" style="margin: 0px; display: inline; float: none; padding: 0px;">
<pre class="brush: csharp; pad-line-numbers: true; title: ; notranslate">
public static void ImportClassFieldsFrom(object target, string buf, char delimiter)
{
	var fields = buf.Split(delimiter);

	const BindingFlags Flags = BindingFlags.Instance | BindingFlags.Public;
	var targetProperties = target.GetType().GetProperties(Flags);
	try
	{
		foreach (PropertyInfo propertyInfo in targetProperties)
		{
			var attribs =
				(ImportFieldAttribute[])propertyInfo.GetCustomAttributes(typeof(ImportFieldAttribute), true);

			if (attribs.Length &gt; 0)
			{
				ImportFieldAttribute attrib = attribs[0];
				if (attrib.Position &lt;= fields.Length)
				{
					var temp = fields[attrib.Position];
					propertyInfo.SetValue(target, temp.TrimEnd(), null);
				}
			}
		}
	}
	catch (Exception ex)
	{
		Exceptions.Log.LogError(buf, ex);
	}

}
</pre>
</div>
<p>Und so verwendet man diese Methode und das Custom Attribute:</p>
<p>Bei der Definition der Klasse, welche die Informationen aus dem “Delimited width” Zeichenkette aufnehmen soll, wende ich nun das Custom Attribute wie folgt an:</p>
<div id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:41723eaf-e8d8-4be7-9f25-f9e5aa64d1d8" class="wlWriterEditableSmartContent" style="margin: 0px; display: inline; float: none; padding: 0px;">
<pre class="brush: csharp; title: ; notranslate">
public class Palettes
{
	/// &lt;summary&gt;
	/// Gets or sets GrossWeight.
	/// &lt;/summary&gt;
	[ImportField(ImportFieldType.Char, 1)]
	public string GrossWeight { get; set; }

	/// &lt;summary&gt;
	/// Gets or sets Height.
	/// &lt;/summary&gt;
	[ImportField(ImportFieldType.Char, 2)]
	public string Height { get; set; }

	/// &lt;summary&gt;
	/// Gets or sets Lenght.
	/// &lt;/summary&gt;
	[ImportField(ImportFieldType.Char, 3)]
	public string Lenght { get; set; }
}
</pre>
</div>
<p>Um die Klasseneigenschaften meiner Klasse mit den Werten aus der “Delimited width” Zeichenkette zu bekommen wird folgender Methodenaufruf durchgeführt:</p>
<div id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:35e7b45c-d87c-44ea-b50f-7c7928f2272d" class="wlWriterEditableSmartContent" style="margin: 0px; display: inline; float: none; padding: 0px;">
<pre class="brush: csharp; title: ; notranslate">
var palette = new Palettes());
AttributHelper.ImportClassFieldsFrom(palette, &quot;12,00~15,01~23,00&quot;, '~');
</pre>
</div>
<p>Fragen, Anregungen und Kritik wie immer, einfach als Kommentar</p>
<div align="center"><a href="http://twitter.com/SchelianHP" target="_blank"><img src="http://blog.schelian.de/wp-content/plugins/igit-follow-me-after-post-button-new/twitter11.png" /></a></div>]]></content:encoded>
			<wfw:commentRss>http://blog.schelian.de/2012/06/einlesen-von-delimited-with-daten-leicht-gemacht-mit-hilfe-von-custom-attribut/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Fritzbox 7390 &#8211; Nortel VPN Client &#8211; VPN tunnel is disconnected due to routing table change</title>
		<link>http://blog.schelian.de/2012/05/fritzbox-7390-nortel-vpn-client-vpn-tunnel-is-disconnected-due-to-routing-table-change/</link>
		<comments>http://blog.schelian.de/2012/05/fritzbox-7390-nortel-vpn-client-vpn-tunnel-is-disconnected-due-to-routing-table-change/#comments</comments>
		<pubDate>Mon, 21 May 2012 12:29:38 +0000</pubDate>
		<dc:creator>Hans-Peter Schelian</dc:creator>
				<category><![CDATA[Tips und Tricks]]></category>
		<category><![CDATA[AirPlay]]></category>
		<category><![CDATA[FritzBox]]></category>
		<category><![CDATA[Nortel VPN]]></category>
		<category><![CDATA[Router]]></category>

		<guid isPermaLink="false">http://blog.schelian.de/?p=1958</guid>
		<description><![CDATA[Nachdem ich vor einigen Wochen in meinem Homeoffice einen DSL Speedport von der Telekom gegen eine Fritzbox 7390 ausgetauscht habe, kam es bei der Verwendung der Nortel VPN Client Software zu ständigen Verbindungsabbrüchen. Da ich dieses Verhalten kurz nach dem &#8230; <a href="http://blog.schelian.de/2012/05/fritzbox-7390-nortel-vpn-client-vpn-tunnel-is-disconnected-due-to-routing-table-change/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Nachdem ich vor einigen Wochen in meinem Homeoffice einen DSL Speedport von der Telekom gegen eine Fritzbox 7390 ausgetauscht habe, kam es bei der Verwendung der Nortel VPN Client Software zu ständigen Verbindungsabbrüchen.</p>
<p><a href="http://blog.schelian.de/wp-content/uploads/2012/05/image.png"><img style="background-image: none; margin: 0px 7px 0px 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; padding-top: 0px; border: 0px;" title="image" src="http://blog.schelian.de/wp-content/uploads/2012/05/image_thumb.png" alt="image" width="244" height="46" align="left" border="0" /></a>Da ich dieses Verhalten kurz nach dem Einsatz der Fritzbox festgestellt habe, lag die Vermutung, dass es mit der Fritzbox zusammenhängt, natürlich mehr als nah.</p>
<p>Um die Vermutung zu verfestigen oder zu wiederlegen, habe ich mit der gleichen Hardware in verschiedenen Netzwerkumgebungen getestet, ob das Problem nicht doch an meinem Rechner oder der Konfiguration liegen könnte.</p>
<p>Das war aber nicht der Fall, das Problem trat nur in meinem Homeoffice auf.</p>
<p>Was lag also näher als den Support von AMV anzuschreiben um ihm meine Probleme zu schildern.</p>
<p>Gesagt getan und folgendes E-Mail an den Support gesendet:</p>
<p>&gt;&gt;&gt;=================  START MAIL vom 03.05.2012 ================&gt;&gt;&gt;</p>
<blockquote><p>Hallo Support Team,</p>
<p>Ich verwende den Nortel VPN Client Version 10.04.016 um eine VPN Verbindung zu einem Firmennetzwerk herzustellen.</p>
<p>Ich kann die Verbindung herstellen, nach kurzer Zeit (nach einigen Sekunden bis Minuten) wird die Verbindung getrennt und es erscheint folgende</p>
<p>Fehlermeldung:</p>
<p>&#8220;VPN tunnel is disconnected due to routing table change&#8221;.</p>
<p>Wenn ich den gleichen Rechner in meinem Büronetzwerk verwende in dem ich einen Router von Vodafone einsetze funktioniert der VPN Zugang zum selben Firmennetzwerk den ganzen Tag ohne Unterbrechung.</p>
<p>Auf das VPN des Firmennetzwerk habe ich keinen Einfluss (das ist aber auch obsolet, da es für über 100000 Mitarbeiter weltweit funktioniert.</p>
<p>Für mich auch, wenn ich es nicht mit der FritzBox 7390 aus dem Homeoffice heraus verwende.</p>
<p>Der 7390 ist an einem VDSL 50000 Anschluss angeschlossen und funktioniert bis auf dieses VPN Problem ohne weitere Einschränkung. Leider kann ich ohne dieses VPN mein Homeoffice nicht nutzen <img src='http://blog.schelian.de/wp-includes/images/smilies/icon_sad.gif' alt=':-(' class='wp-smiley' />  .</p>
<p>Ich hoffe Sie haben Lösungsansätze für mich</p></blockquote>
<p>&gt;&gt;&gt;================= ENDE MAIL vom 03.05.2012 ================&gt;&gt;&gt;</p>
<p>Nicht gut aber schnell, nämlich am gleichen Tag habe ich dann eine erste Antwort erhalten</p>
<p>&lt;&lt;&lt;================= START MAIL vom 03.05.2012 ===================</p>
<blockquote>
<p align="left">Guten Tag Herr Schelian,</p>
<p align="left">vielen Dank für Ihre Anfrage an den AVM-Support.</p>
<p align="left">Tipps und Hinweise zu VPN-Lösungen anderer Hersteller finden Sie in folgendem</p>
<p align="left">Link:</p>
<p align="left"><a href="http://service.avm.de/support/de/SKB/FRITZ-Box-7390/243:VPN-Loesung-eines-andere">http://service.avm.de/support/de/SKB/FRITZ-Box-7390/243:VPN-Loesung-eines-andere</a></p>
<p align="left">n-Herstellers-mit-FRITZ-Box-verbinden</p>
<p align="left">Über die Tipps in unserer FAQ hinaus leisten wir keinen Support für lokale oder individuelle VPN-Szenarien mit der Software anderer Hersteller.</p>
</blockquote>
<p>&lt;&lt;&lt;================= ENDE MAIL vom 03.05.2012 ===================</p>
<p>Außer einem Link zu einer furchtbaren FAQ die so überhaupt nichts mit dem von mir geschilderten Problem zu tun hat, nur “Schön dass Sie uns geschrieben haben”.</p>
<p>Aber ich wäre nicht Ich, wenn ich mich damit zufrieden gegeben hätte.</p>
<p>Also habe ich 2 Tage später folgendes Mail an den Support zurückgeschrieben:</p>
<p>==================== START MAIL vom 05.05.2012 ================&gt;&gt;&gt;</p>
<blockquote><p>Hallo Support Team,</p>
<p>leider hat mir Ihr Hinweis nicht geholfen.</p>
<p>Natürlich hatte ich bevor ich Sie kontaktiert habe die Q&amp;A auf Ihrer Webseite angeschaut.</p>
<p>Ich nehme an, dass Sie mein Problem nicht richtig verstanden haben, ich versuche nicht mit irgendeiner VPN Lösung auf die Fritzbox zuzugreifen, sondern aus dem Netz welches über die Fritzbox über das Internet hergestellt hat auf ein Weltweites VPN Firmennetzwerk zuzugreifen.</p>
<p>Wie ich bereits in meiner ersten Nachricht geschrieben habe, kann ich mit dem gleichen Notebook aus meinem Firmennetz an dem ein Vodafone Router die Verbindung ins Internet herstellt, ohne Problem auf das externe VPN Netzwerk zugreifen.</p>
<p>Über einen Mobilen WLAN Hotspot funktioniert der Zugriff ebenfalls.</p>
<p>Eben nur nicht sobald ich über den Internetzugang gehe der über die Fritzbox hergestellt wird.</p>
<p>Ich hoffe dass Sie mir weiterhelfen können.</p></blockquote>
<p>==================== ENDE MAIL vom 08.05.2012 ================&gt;&gt;&gt;</p>
<p>Und tatsächlich erhalte ich nach nur 3 Tagen wieder eine Antwort</p>
<p>&lt;&lt;&lt;================= START MAIL vom 05.05.2012 ===================</p>
<blockquote><p>Guten Tag Herr Schelian,</p>
<p>vielen Dank für Ihre Rückmeldung.</p>
<p>Es tut mir leid, aber wir supporten wie erwähnt keine individuellen lokalen</p>
<p>VPN-Szenarien.</p>
<p>Freundliche Grüße aus Berlin</p>
<p>Jon Doe (AVM Support) (Name wurde auf Wunsch von AVM geändert)</p></blockquote>
<p>&lt;&lt;&lt;================= ENDE MAIL vom 08.05.2012 ===================</p>
<p>Es tut mir auch leid, ich konnte mir nicht verkneifen noch einmal zurück zu schreiben</p>
<p>==================== START MAIL vom 10.05.2012 ================&gt;&gt;&gt;</p>
<blockquote><p>Hallo Herr Doe, (Name wurde auf Wunsch von AVM geändert)</p>
<p>wenn das die Meinung von AVM ist!</p>
<p>Ich finde zwar nicht dass es sich bei meinem Problem im ein VPN Problem sondern um ein Router bzw. Firewall Problem Ihres Routers handelt. Aus irgend einem Grund ändert der Router die Routing Table und stört damit die bestendende Verbindung zu meinem VPN Server.</p>
<p>Vor allem wo dies mit verschiedener Firmware mal besser mal schlechter wird.</p>
<p>Mit der letzten Aktualisierung gerade mal wieder schlechter, bzw. mal wieder gar nicht benutzbar.</p>
<p>Dann werde ich wohl keine Fritz Router mehr einsetzen können.</p></blockquote>
<p>==================== ENDE MAIL vom 10.05.2012 ================&gt;&gt;&gt;</p>
<p>Aber wer denkt, der AVM Support würde aufgeben, der täuscht, ich erhalte also noch einmal eine Mail vom AVM Support</p>
<p>&lt;&lt;&lt;================ START MAIL vom 11.05.2012 ===================</p>
<blockquote><p>Guten Tag Herr Schelian,</p>
<p>vielen Dank für Ihre Rückmeldung.</p>
<p>Mein Kollege hat hier völlig recht. Es gibt hier keinen kausalen Zusammenhang mit der FRITZ!Box. Lesen Sie sich bitte dies hier in Ruhe</p>
<p>durch:</p>
<p><a href="http://blog.michaelfmcnamara.com/2010/03/nortel-vpn-client-release-10-04-016-for-windows-7/#comment-3602">http://blog.michaelfmcnamara.com/2010/03/nortel-vpn-client-release-10-04-016-for-windows-7/#comment-3602</a></p>
<p>Dort ist exakt die Fehlermeldung aufgegriffen und auch die Ursache und eine Lösung beschrieben.</p>
<p>Freundliche Grüße aus Berlin</p>
<p>Max Mustermann (AVM Support) (Name wurde auf Wunsch von AVM geändert)</p></blockquote>
<p>&lt;&lt;&lt;================= ENDE MAIL vom 11.05.2012 ===================</p>
<p>Ich habe dort zwar keine Lösung für mein Problem gefunden, aber immerhin einen Workaround und konnte damit tatsächlich ermitteln, dass das Problem mit dem 7390 nur mit WLAN auftritt und nicht wenn ich den Rechner per Kabel angeschlossen habe.</p>
<p>Eigentlich hätte man die Sache damit bewenden lassen können, aber ich wäre nicht Ich wenn ich das Problem nicht an der Wurzel packen wollte.</p>
<p>Und so habe ich mich auf die Suche nach den Unterschieden in den verschiedenen W-LAN Netzen gemacht.</p>
<p>Um das ganze hier nicht ausufern zu lassen möchte ich nun aber zur Lösung des Problem kommen.</p>
<blockquote><p><strong>Hallo AVM Support hört gut zu, es gibt eine Fritz7390 Lösung für mein VPN spezifisches Problem.</strong></p></blockquote>
<p>Unter WLAN&#8211;&gt;Funkkanal gibt es eine Einstellung:</p>
<p><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" src="http://blog.schelian.de/wp-content/uploads/2012/05/image1.png" alt="image" width="644" height="313" border="0" /></p>
<p>Für 300 Mbit/s optimierte Kanäle verwenden.</p>
<p>Und diese Option ist im Default gesetzt (<strong>Und muss ausgeschaltet werden</strong>).</p>
<p>Das einschalten dieser Option führt dazu, dass die Fritzbox anstelle eines einzelnen Kanals einen Doppelkanal zum Beispiel Kanal 8 und Kanal 12 verwendet, und in diesem Zusammenhang kommt es zu wohl irgendwie zum internen Umschreiben der Routing Table oder irgend einem anderen Fritzbox internen Problem, dass zu dem in diesem Artikel beschriebenen Abbruch der VPN Verbindung kommt.</p>
<p>Übrigens konnte ich noch einen Zusammenhang mit dieser Einstellung feststellen.</p>
<p><a href="http://blog.schelian.de/wp-content/uploads/2012/05/image2.png"><img style="background-image: none; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" src="http://blog.schelian.de/wp-content/uploads/2012/05/image_thumb1.png" alt="image" width="212" height="112" border="0" /></a></p>
<p>Bei der Musik Übertagung vom iPhone/iPad via AirPlay auf einen Verstärker kam es immer wieder zu kurzen Unterbrechungen (Aussetzern)!</p>
<p>Diese sind nun auch verschwunden.</p>
<p>Hallo AVM Support Team, es war mir eine Freude behilflich sein zu können.</p>
<p>Ich schicke euch den Link per Mail, dann könnt Ihr eure FAQ ergänzen</p>
<div align="center"><a href="http://twitter.com/SchelianHP" target="_blank"><img src="http://blog.schelian.de/wp-content/plugins/igit-follow-me-after-post-button-new/twitter11.png" /></a></div>]]></content:encoded>
			<wfw:commentRss>http://blog.schelian.de/2012/05/fritzbox-7390-nortel-vpn-client-vpn-tunnel-is-disconnected-due-to-routing-table-change/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>DotNetNuke &#8211; Nach Upgrade auf DNN 6.1.X &#8211; HTML Modul speichert keine &#196;nderungen mehr</title>
		<link>http://blog.schelian.de/2012/05/dotnetnuke-nach-upgrade-auf-dnn-6-1-x-html-modul-speichert-keine-nderungen-mehr/</link>
		<comments>http://blog.schelian.de/2012/05/dotnetnuke-nach-upgrade-auf-dnn-6-1-x-html-modul-speichert-keine-nderungen-mehr/#comments</comments>
		<pubDate>Mon, 14 May 2012 09:29:53 +0000</pubDate>
		<dc:creator>Hans-Peter Schelian</dc:creator>
				<category><![CDATA[Tips und Tricks]]></category>
		<category><![CDATA[DNN]]></category>
		<category><![CDATA[DotNetNuke]]></category>
		<category><![CDATA[DotNetNuke 6]]></category>
		<category><![CDATA[Provider]]></category>
		<category><![CDATA[Telerik]]></category>
		<category><![CDATA[TextEditor]]></category>

		<guid isPermaLink="false">http://blog.schelian.de/?p=1950</guid>
		<description><![CDATA[Heute Vormittag habe ich den Anruf eines Kunden erhalten der mir folgendes Problem geschildert hat. Nach der Aktualisierung eines DotNetNuke Portals von DNN 5.6.X auf DNN 6.1.1 werden Änderungen die man an Texten im HMTL Modul vornimmt nicht gespeichert. Keine &#8230; <a href="http://blog.schelian.de/2012/05/dotnetnuke-nach-upgrade-auf-dnn-6-1-x-html-modul-speichert-keine-nderungen-mehr/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Heute Vormittag habe ich den Anruf eines Kunden erhalten der mir folgendes Problem geschildert hat.</p>
<p>Nach der Aktualisierung eines DotNetNuke Portals von DNN 5.6.X auf DNN 6.1.1 werden Änderungen die man an Texten im HMTL Modul vornimmt nicht gespeichert.</p>
<blockquote><p><strong>Keine Fehlermeldung, kein Eintrag im Ereignisprotokoll, einfach nichts!</strong></p>
</blockquote>
<p>Nachdem ich mir die Konfiguration genauer angeschaut hatte, konnte ich einen Fehler in der Konfiguration des System (IIS und App Pool) ausschließen.</p>
<p>Das Problem war aber trotzdem relativ schnell gefunden.</p>
<p>Mit dem “früher” als Standardeditor eingesetzten FCK Editor gibt es mit der aktuellen Version (Ich glaube schon seit Version 5.6.X) von DotNetNuke an einigen Stellen Probleme, unter anderem eben auch im Text/HMTL Modul. </p>
<p>Irgendwelche JavaScripte des Editors kollidieren mit anderen JavaScript aufrufen in irgend einer der vielen verwendeten JavaScript Frameworks.</p>
<p>JavaScript eben <img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smiley" src="http://blog.schelian.de/wp-content/uploads/2012/05/wlEmoticon-smile.png"></p>
<p>Ich weiß schon warum sich meine Begeisterung für dieses (Java)Script Gedöns in Grenzen hält.</p>
<p>OK, aber lassen wir das.</p>
<p>Ob es einen aktualisierte Version des FCK Editors gibt, die mit DNN Version 6.1 und höher läuft, weiß ich nicht, sollte jemand näheres dazu wissen, würde ich mich über einen entsprechenden Kommentar freuen.</p>
<p>Um das Problem mit den Bordmitteln von DNN zu lösen kann man aber einfach den Texteditor umstellen und anstelle des FCK Editors den Telerik Texteditor, der aktuell als Standardeditor von DotNetNuke verwendet wird.</p>
<p>Hierzu öffnet man die web.config und nimmt folgende Änderung vor:</p>
<p>Den defaultProvider von “FckHtmlEditorProvider” (siehe Vorher) auf “TelerikEditorProvider” (siehe Nachher) ändern</p>
<p>Vorher:</p>
<p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:d11cb4a4-b95b-46c9-951d-2d835f3f020b" class="wlWriterEditableSmartContent">
<pre style=white-space:normal>
<pre class="brush: xml; pad-line-numbers: true; title: ; notranslate">
&lt;htmlEditor defaultProvider=&quot;FckHtmlEditorProvider&quot;&gt;
  &lt;providers&gt;
	&lt;clear /&gt;
	&lt;add name=&quot;TelerikEditorProvider&quot; type=&quot;DotNetNuke.HtmlEditor.TelerikEditorProvider.EditorProvider, DotNetNuke.HtmlEditor.TelerikEditorProvider&quot; providerPath=&quot;~/Providers/HtmlEditorProviders/Telerik/&quot; toolsFile=&quot;~/Providers/HtmlEditorProviders/Telerik/Config/ToolsDefault.xml&quot; configFile=&quot;~/Providers/HtmlEditorProviders/Telerik/Config/ConfigDefault.xml&quot; FilterHostExtensions=&quot;True&quot; /&gt;
	&lt;add name=&quot;FckHtmlEditorProvider&quot; type=&quot;DotNetNuke.HtmlEditor.FckHtmlEditorProvider.FckHtmlEditorProvider, DotNetNuke.FckHtmlEditorProvider&quot; providerPath=&quot;~/Providers/HtmlEditorProviders/Fck/&quot; CustomConfigurationPath=&quot;~/Providers/HtmlEditorProviders/Fck/custom/FCKConfig.js&quot; EnhancedSecurityDefault=&quot;false&quot; SecureConfigurationPath=&quot;~/Providers/HtmlEditorProviders/Fck/custom/FCKConfigSecure.js&quot; ImageGalleryPath=&quot;~/Providers/HtmlEditorProviders/Fck/fckimagegallery.aspx&quot; ImageUploadPath=&quot;~/Providers/HtmlEditorProviders/Fck/fckimagegallery.aspx&quot; ImageAllowedFileTypes=&quot;gif,png,bmp,jpg&quot; FlashGalleryPath=&quot;~/Providers/HtmlEditorProviders/Fck/fckimagegallery.aspx&quot; FlashUploadPath=&quot;~/Providers/HtmlEditorProviders/Fck/fckimagegallery.aspx&quot; FlashAllowedFileTypes=&quot;fla,swf&quot; LinksGalleryPath=&quot;~/Providers/HtmlEditorProviders/Fck/fcklinkgallery.aspx&quot; DynamicStylesGeneratorPath=&quot;~/Providers/HtmlEditorProviders/Fck/FCKStyles.aspx&quot; DynamicStylesCaseSensitive=&quot;true&quot; DynamicStylesGeneratorFilter=&quot;controlpanel|filemanager|mainmenu|wizard&quot; StaticStylesFile=&quot;~/Providers/HtmlEditorProviders/Fck/FCKeditor/fckstyles.xml&quot; StylesDefaultMode=&quot;dynamic&quot; DynamicCSSGeneratorPath=&quot;~/Providers/HtmlEditorProviders/Fck/FCKCSS.aspx&quot; StaticCSSFile=&quot;~/Providers/HtmlEditorProviders/Fck/FCKeditor/editor/css/fck_editorarea.css&quot; CSSDefaultMode=&quot;dynamic&quot; spellCheck=&quot;ieSpell&quot; AvailableToolbarSkins=&quot;Office2003,Silver&quot; DefaultToolbarSkin=&quot;Office2003&quot; AvailableToolBarSets=&quot;DNNDefault,Default,NoGallery,Basic&quot; DefaultToolbarSet=&quot;DNNDefault&quot; DefaultImageGallerySkin=&quot;Default&quot; DefaultFlashGallerySkin=&quot;Default&quot; DefaultLinksGallerySkin=&quot;Default&quot; FCKDebugMode=&quot;false&quot; UseFCKSource=&quot;false&quot; OptionsOpenMode=&quot;ShowModalDialog&quot; ShowModuleType=&quot;true&quot; FixOldDNNPostback=&quot;false&quot; CustomOptionsDialog=&quot;Admin&quot; /&gt;
  &lt;/providers&gt;
&lt;/htmlEditor&gt;
</pre>
</div>
<p>Nachher:</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:ea1d3a9e-a044-480b-a0a3-18cbffe33731" class="wlWriterEditableSmartContent">
<pre style=white-space:normal>
<pre class="brush: xml; title: ; notranslate">
&lt;htmlEditor defaultProvider=&quot;TelerikEditorProvider&quot;&gt;
  &lt;providers&gt;
	&lt;clear /&gt;
	&lt;add name=&quot;TelerikEditorProvider&quot; type=&quot;DotNetNuke.HtmlEditor.TelerikEditorProvider.EditorProvider, DotNetNuke.HtmlEditor.TelerikEditorProvider&quot; providerPath=&quot;~/Providers/HtmlEditorProviders/Telerik/&quot; toolsFile=&quot;~/Providers/HtmlEditorProviders/Telerik/Config/ToolsDefault.xml&quot; configFile=&quot;~/Providers/HtmlEditorProviders/Telerik/Config/ConfigDefault.xml&quot; FilterHostExtensions=&quot;True&quot; /&gt;
	&lt;add name=&quot;FckHtmlEditorProvider&quot; type=&quot;DotNetNuke.HtmlEditor.FckHtmlEditorProvider.FckHtmlEditorProvider, DotNetNuke.FckHtmlEditorProvider&quot; providerPath=&quot;~/Providers/HtmlEditorProviders/Fck/&quot; CustomConfigurationPath=&quot;~/Providers/HtmlEditorProviders/Fck/custom/FCKConfig.js&quot; EnhancedSecurityDefault=&quot;false&quot; SecureConfigurationPath=&quot;~/Providers/HtmlEditorProviders/Fck/custom/FCKConfigSecure.js&quot; ImageGalleryPath=&quot;~/Providers/HtmlEditorProviders/Fck/fckimagegallery.aspx&quot; ImageUploadPath=&quot;~/Providers/HtmlEditorProviders/Fck/fckimagegallery.aspx&quot; ImageAllowedFileTypes=&quot;gif,png,bmp,jpg&quot; FlashGalleryPath=&quot;~/Providers/HtmlEditorProviders/Fck/fckimagegallery.aspx&quot; FlashUploadPath=&quot;~/Providers/HtmlEditorProviders/Fck/fckimagegallery.aspx&quot; FlashAllowedFileTypes=&quot;fla,swf&quot; LinksGalleryPath=&quot;~/Providers/HtmlEditorProviders/Fck/fcklinkgallery.aspx&quot; DynamicStylesGeneratorPath=&quot;~/Providers/HtmlEditorProviders/Fck/FCKStyles.aspx&quot; DynamicStylesCaseSensitive=&quot;true&quot; DynamicStylesGeneratorFilter=&quot;controlpanel|filemanager|mainmenu|wizard&quot; StaticStylesFile=&quot;~/Providers/HtmlEditorProviders/Fck/FCKeditor/fckstyles.xml&quot; StylesDefaultMode=&quot;dynamic&quot; DynamicCSSGeneratorPath=&quot;~/Providers/HtmlEditorProviders/Fck/FCKCSS.aspx&quot; StaticCSSFile=&quot;~/Providers/HtmlEditorProviders/Fck/FCKeditor/editor/css/fck_editorarea.css&quot; CSSDefaultMode=&quot;dynamic&quot; spellCheck=&quot;ieSpell&quot; AvailableToolbarSkins=&quot;Office2003,Silver&quot; DefaultToolbarSkin=&quot;Office2003&quot; AvailableToolBarSets=&quot;DNNDefault,Default,NoGallery,Basic&quot; DefaultToolbarSet=&quot;DNNDefault&quot; DefaultImageGallerySkin=&quot;Default&quot; DefaultFlashGallerySkin=&quot;Default&quot; DefaultLinksGallerySkin=&quot;Default&quot; FCKDebugMode=&quot;false&quot; UseFCKSource=&quot;false&quot; OptionsOpenMode=&quot;ShowModalDialog&quot; ShowModuleType=&quot;true&quot; FixOldDNNPostback=&quot;false&quot; CustomOptionsDialog=&quot;Admin&quot; /&gt;
  &lt;/providers&gt;
&lt;/htmlEditor&gt;
</pre>
</div>
<div align="center"><a href="http://twitter.com/SchelianHP" target="_blank"><img src="http://blog.schelian.de/wp-content/plugins/igit-follow-me-after-post-button-new/twitter11.png" /></a></div>]]></content:encoded>
			<wfw:commentRss>http://blog.schelian.de/2012/05/dotnetnuke-nach-upgrade-auf-dnn-6-1-x-html-modul-speichert-keine-nderungen-mehr/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Generische Methode zur &#220;berschreibung der ToString Methode eigener komplexer Klassen &#8211; C#</title>
		<link>http://blog.schelian.de/2012/04/generische-methode-zur-berschreibung-der-tostring-methode-eigener-komplexer-klassen-c/</link>
		<comments>http://blog.schelian.de/2012/04/generische-methode-zur-berschreibung-der-tostring-methode-eigener-komplexer-klassen-c/#comments</comments>
		<pubDate>Wed, 25 Apr 2012 13:01:52 +0000</pubDate>
		<dc:creator>Hans-Peter Schelian</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Tips und Tricks]]></category>
		<category><![CDATA[Generics]]></category>
		<category><![CDATA[Reflection]]></category>

		<guid isPermaLink="false">http://blog.schelian.de/?p=1946</guid>
		<description><![CDATA[Im Zuge eines Projektes musste eine komplexe ineinander verschachtelte Klassenstrukturen aufgebaut werden, um eine ebenfalls komplexe Interfacestruktur einer externen Anwendung abzubilden. Um bei Fehlermeldungen und beim Debuggen (ja ich oute mich, ich debugge auch Code) ordentliche Daten, anstelle des reinen &#8230; <a href="http://blog.schelian.de/2012/04/generische-methode-zur-berschreibung-der-tostring-methode-eigener-komplexer-klassen-c/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Im Zuge eines Projektes musste eine komplexe ineinander verschachtelte Klassenstrukturen aufgebaut werden, um eine ebenfalls komplexe Interfacestruktur einer externen Anwendung abzubilden. </p>
<p>Um bei Fehlermeldungen und beim Debuggen (ja ich oute mich, ich debugge auch Code) ordentliche Daten, anstelle des reinen Objektnamen über die ToString() Methode dargestellt zu bekommen, überschreibt man in der jeweiligen Klasse die ToString() Methode und gibt darin an, welche Daten ausgegeben werden sollen.</p>
<p>So in etwas sieht es im Debugger aus, wenn man ToString() <strong>nicht</strong> überschreibt:</p>
<p><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blog.schelian.de/wp-content/uploads/2012/04/image.png" width="644" height="55"></p>
<p>Für, ich will es mal “<em>Nicht so komplexe Klassen</em>” nennen, kann man das auch im folgenden Stil machen.</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:acb14459-f774-430c-a810-008319020cb2" class="wlWriterEditableSmartContent">
<pre style=white-space:normal>
<pre class="brush: csharp; pad-line-numbers: true; title: ; notranslate">
        public override string ToString()
        {
            return &quot;Ausschreibungsstatus= &quot; + this.Ausschreibungsstatus + 
                &quot; &quot; + &quot;Ausschreibungstext= &quot; + this.Ausschreibungstext;
        }
</pre>
</div>
<p>Das ist schon besser und sieht in etwa so aussehen:</p>
<p><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blog.schelian.de/wp-content/uploads/2012/04/image1.png" width="644" height="48"></p>
<p>Schon besser, aber …. </p>
<p>Ich würde gerne ohne großen Schreibaufwand in jeder Klasse die Public Eigenschaften mit den enthaltenen Werten angezeigt bekommen.</p>
<p>Also musste ich mir hierfür etwas mehr generisches ausdenken.</p>
<p>Und wieder einmal lag die Lösung meines Problems in der Verwendung von Reflection.</p>
<p>Hier nun meine “generische” Methode zur Bildung einer für mich “sinnvollen” ToString() Ausgabe für meine komplexen Klassen.</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:bc74f5fa-932a-487d-9093-7cf86af79d2f" class="wlWriterEditableSmartContent">
<pre style=white-space:normal>
<pre class="brush: csharp; title: ; notranslate">
public static string ClassPropertiesToString(object obj)
{
    string retVal = obj.GetType().ToString() + &quot;\n&quot;;
    const BindingFlags Flags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.FlattenHierarchy;
    var sourceProperties = obj.GetType().GetProperties(Flags);

    foreach (PropertyInfo pi in sourceProperties)
    {
        if (pi.PropertyType.Namespace != &quot;System&quot;)
            continue;

        retVal += string.Format(&quot;{0}:{1}\n&quot;, pi.Name, pi.GetValue(obj, null));
    }

    return retVal;
}
</pre>
</div>
<p>Ich denke der Code ist soweit Selbsterklärend, falls nicht, einfach einen Kommentar abgeben und fragen, dann erläutern wir die Details.</p>
<p>Hier noch der Vollständigkeit halber, das Ergebnis im Debugger:</p>
<p><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blog.schelian.de/wp-content/uploads/2012/04/image2.png" width="401" height="484"></p>
<p>Und bevor ich es vergesse. </p>
<p>So sieht dann die Überschreibung in der jeweiligen Klasse aus:</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:608ee6c2-3901-46c9-834f-83d6433e3e1b" class="wlWriterEditableSmartContent">
<pre style=white-space:normal>
<pre class="brush: csharp; title: ; notranslate">
public override string ToString()
{
    return Lager.Global.Common.Generic.ClassPropertiesToString(this);
}
</pre>
</div>
<div align="center"><a href="http://twitter.com/SchelianHP" target="_blank"><img src="http://blog.schelian.de/wp-content/plugins/igit-follow-me-after-post-button-new/twitter11.png" /></a></div>]]></content:encoded>
			<wfw:commentRss>http://blog.schelian.de/2012/04/generische-methode-zur-berschreibung-der-tostring-methode-eigener-komplexer-klassen-c/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Generische Methode um gleichnamige Properties einer Klasse zu einem Objekt einer anderen Klasse zu kopieren &#8211; C#</title>
		<link>http://blog.schelian.de/2012/03/generische-methode-um-gleichnamige-properties-einer-klasse-zu-einem-objekt-einer-anderen-klasse-zu-kopieren-c/</link>
		<comments>http://blog.schelian.de/2012/03/generische-methode-um-gleichnamige-properties-einer-klasse-zu-einem-objekt-einer-anderen-klasse-zu-kopieren-c/#comments</comments>
		<pubDate>Fri, 23 Mar 2012 08:42:44 +0000</pubDate>
		<dc:creator>Hans-Peter Schelian</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Tips und Tricks]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Generics]]></category>
		<category><![CDATA[Properties]]></category>
		<category><![CDATA[PropertyInfo]]></category>
		<category><![CDATA[Reflection]]></category>

		<guid isPermaLink="false">http://blog.schelian.de/?p=1936</guid>
		<description><![CDATA[Bei meiner Arbeit kommt es häufiger vor, dass ich umfangreiche Klassen (welche die Daten einer Datenbank repräsentieren) verwende die mal schnell über 50 oder 100 Public Properties (Datenbankfelder) enthalten. Nun kommt immer wieder vor, dass ich zum Beispiel zum Archivieren &#8230; <a href="http://blog.schelian.de/2012/03/generische-methode-um-gleichnamige-properties-einer-klasse-zu-einem-objekt-einer-anderen-klasse-zu-kopieren-c/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Bei meiner Arbeit kommt es häufiger vor, dass ich umfangreiche Klassen (welche die Daten einer Datenbank repräsentieren) verwende die mal schnell über 50 oder 100 Public Properties (Datenbankfelder) enthalten. </p>
<p><a href="http://blog.schelian.de/wp-content/uploads/2012/03/image.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px 10px 0px 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" align="left" src="http://blog.schelian.de/wp-content/uploads/2012/03/image_thumb.png" width="244" height="114"></a>Nun kommt immer wieder vor, dass ich zum Beispiel zum Archivieren solcher Daten, damit meine ich die Daten aus einer Tabelle in eine andere zu verschieben, nicht auf SQL Skripte auf dem Server zugreifen kann oder möchte, da dieses verschieben noch mit zusätzlicher Businesslogik hinterlegt werden muss.</p>
<p>Was bleibt ist dann so etwas in dieser Art:</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:676be534-3cee-43dc-9d05-62c26e5c9c1d" class="wlWriterEditableSmartContent">
<pre style=white-space:normal>
<pre class="brush: csharp; pad-line-numbers: true; title: ; notranslate">
var auftrag = new Auftrag
    { Position = 1, Artikel = &quot;Mars&quot;, Beschreibung = &quot;Schoko Riegel&quot;, Preis = 1.50 };

var auftragsArchiv = new AuftragArchiv();
auftragsArchiv.Artikel = auftrag.Artikel;
auftragsArchiv.Beschreibung = auftrag.Beschreibung;
auftragsArchiv.Preis = auftrag.Preis;

if (auftragsArchiv.Save())
{
    auftrag.Delete();
}
</pre>
</div>
<p>Diese Vorgehensweise kann bei umfangreichen Klassen sehr arbeitsintensiv sein.</p>
<p>Nun gibt es verschiedene Ansätze um sich diesem Problem anzunehmen. Nachfolgend möchte ich einige Lösungsansätze unter Verwendung von Reflection aufzeigen.</p>
<p>Ich nehme an, jeder kennt die Methode ToString(). </p>
<p>Die Idee ist nun eine generische To…. Methode zu erstellen, welche die Aufgaben wie im obigen Beispiel dargestellt, universell erledigt.</p>
<p>Das Ziel soll sein, dass die Public Property Werte eines Objektes, durch Aufruf einer Methode, alle Werte die den gleichen Property Namen&nbsp; haben in ein anderes Objekt einer anderen Klasse kopiert werden.</p>
<p>Hier nun die Variante 1 (Methode einer Klasse):</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:6de5f11b-93de-4444-a5a5-d91191d489a0" class="wlWriterEditableSmartContent">
<pre style=white-space:normal>
<pre class="brush: csharp; title: ; notranslate">
public T ToTobject&lt;T&gt;(T target)
{
    const BindingFlags Flags = BindingFlags.Instance | BindingFlags.Public;
    var sourceProperties = this.GetType().GetProperties(Flags);

    foreach (PropertyInfo pi in sourceProperties)
        {
            if (pi.CanWrite)
            {
				var propInfoObj = target.GetType().GetProperty(pi.Name);
				if (propInfoObj != null)
				{
					var propValue = pi.GetValue(this, null);
					propInfoObj.SetValue(target, propValue, null);
				}                             
            }
        }

    return target;
}
</pre>
</div>
<p>Der Aufruf um diese Variante zu verwenden sieht dann so aus:</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:4873472e-a5e9-4f0d-b5c7-1dd82c113f54" class="wlWriterEditableSmartContent">
<pre style=white-space:normal>
<pre class="brush: csharp; highlight: [6]; title: ; notranslate">
var auftrag = new Auftrag
	{ Position = 1, Artikel = &quot;Mars&quot;, Beschreibung = &quot;Schoko Riegel&quot;, Preis = 1.50 };

var auftragsArchiv = new AuftragArchiv();

auftragsArchiv = auftrag.ToTobject(auftragsArchiv);

if (auftragsArchiv.Save())
{
	auftrag.Delete();
}
</pre>
</div>
<p>Sieht doch schon ganz gut aus.</p>
<p>Hier noch eine Variante, die noch etwas mehr generisch arbeitet und nur noch mitgeteilt bekommt, welchen Type ich als Rückgabe der Methode erwarte, die Instanz des Objekts der neuen Klasse wird in der Methode selbst erzeugt.</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:ba854a89-fa43-47fa-aa89-1a7cbc9987d0" class="wlWriterEditableSmartContent">
<pre style=white-space:normal>
<pre class="brush: csharp; title: ; notranslate">
public T ToTobject&lt;T&gt;()
{
	var constructorInfo = typeof(T).GetConstructor(new Type[] { });
	if (constructorInfo != null)
	{
		var target = (T)constructorInfo.Invoke(new object[] { });

		const BindingFlags Flags = BindingFlags.Instance | BindingFlags.Public;
		var sourceProperties = this.GetType().GetProperties(Flags);

		foreach (PropertyInfo pi in sourceProperties)
		{
			if (pi.CanWrite)
			{
				if (!pi.IsDefined(typeof(XmlIgnoreAttribute), false))
				{
					var propInfoObj = target.GetType().GetProperty(pi.Name);
					if (propInfoObj != null)
					{
						var propValue = pi.GetValue(this, null);
						propInfoObj.SetValue(target, propValue, null);
					}
				}
			}
		}

		return target;
	}

	return default(T);
}
</pre>
</div>
<p>Diese Variante wird dann so verwendet:</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:c6c74197-9022-4089-854b-af1237bb472c" class="wlWriterEditableSmartContent">
<pre style=white-space:normal>
<pre class="brush: csharp; highlight: [4]; title: ; notranslate">
var auftrag = new Auftrag
	{ Position = 1, Artikel = &quot;Mars&quot;, Beschreibung = &quot;Schoko Riegel&quot;, Preis = 1.50 };

var auftragsArchiv = auftrag.ToTobject&lt;AuftragArchiv&gt;();

if (auftragsArchiv.Save())
{
	auftrag.Delete();
}
</pre>
</div>
<p>Diese Variante gefällt mir schon etwas besser</p>
<p>Aber das ist noch nicht das Ende der Methoden Evolution!</p>
<p><img src="http://lh4.ggpht.com/_APjgPmP_12w/SeLksqfHIbI/AAAAAAAAEi8/CZlpxjrjS0A/Evolution25.jpg" width="240" height="218"></p>
<p>Es geht noch generischer (und statisch für alle Klassen verwendbar) und diese Variante folgt nun.</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:fdc50ae3-c82e-466a-b32e-79ce4cdc3307" class="wlWriterEditableSmartContent">
<pre style=white-space:normal>
<pre class="brush: csharp; title: ; notranslate">
public static T ToTobject&lt;T&gt;(object source)
{
	var constructorInfo = typeof(T).GetConstructor(new Type[] { });
	if (constructorInfo != null)
	{
		var target = (T)constructorInfo.Invoke(new object[] { });

		const BindingFlags Flags = BindingFlags.Instance | BindingFlags.Public;
		var sourceProperties = source.GetType().GetProperties(Flags);

		foreach (PropertyInfo pi in sourceProperties)
		{
			if (pi.CanWrite)
			{
				var propInfoObj = target.GetType().GetProperty(pi.Name);
				if (propInfoObj != null)
				{
					var propValue = pi.GetValue(source, null);
					propInfoObj.SetValue(target, propValue, null);
				}
			}
		}

		return target;
	}

	return default(T);
}
</pre>
</div>
<p>Diese nun statische Variante kann auf jedes beliebige Objekt jeder beliebigen Klasse angewendet und für die Rückgabe jeder beliebigen Klasse verwendet werden. Natürlich nur solange diese Klassen auch gleiche Properties enthalten.</p>
<p>Und so wird diese statische Methode verwendet:</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:d022abb7-7403-4b6f-9068-e5969c5eaa99" class="wlWriterEditableSmartContent">
<pre style=white-space:normal>
<pre class="brush: csharp; highlight: [4]; title: ; notranslate">
var auftrag = new Auftrag
	{ Position = 1, Artikel = &quot;Mars&quot;, Beschreibung = &quot;Schoko Riegel&quot;, Preis = 1.50 };

var auftragsArchiv = Auftrag.ToTobject&lt;AuftragArchiv&gt;(auftrag);

if (auftragsArchiv.Save())
{
	auftrag.Delete();
}
</pre>
</div>
<p>Mir hat es Spaß gemacht diese Methodik zu entwickeln, evtl. hilft es auch mal jemand anderem beim Lösen “seines” Problem.</p>
<p>Anregungen und Kritik wie immer gerne als Kommentar zum Beitrag.</p>
<div align="center"><a href="http://twitter.com/SchelianHP" target="_blank"><img src="http://blog.schelian.de/wp-content/plugins/igit-follow-me-after-post-button-new/twitter11.png" /></a></div>]]></content:encoded>
			<wfw:commentRss>http://blog.schelian.de/2012/03/generische-methode-um-gleichnamige-properties-einer-klasse-zu-einem-objekt-einer-anderen-klasse-zu-kopieren-c/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>ASCII Schnittstellen mit Hilfe von Custom Attributes komfortabel erstellen &#8211; C#</title>
		<link>http://blog.schelian.de/2012/02/ascii-schnittstellen-mit-hilfe-von-custom-attributes-komfortabel-erstellen-c/</link>
		<comments>http://blog.schelian.de/2012/02/ascii-schnittstellen-mit-hilfe-von-custom-attributes-komfortabel-erstellen-c/#comments</comments>
		<pubDate>Tue, 07 Feb 2012 20:27:28 +0000</pubDate>
		<dc:creator>Hans-Peter Schelian</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Attributes]]></category>
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://blog.schelian.de/?p=1923</guid>
		<description><![CDATA[Viele kennen dass Problem, dass Daten zwischen verschiedenen Welten auch Heute noch immer durch Übergabe von Schnittstellendateien, seien es EDI oder auch ASCII Dateien, die einen festen Satzaufbau haben, übergeben werden. Die Definitionen sehen oft wie folgt aus: Wobei die &#8230; <a href="http://blog.schelian.de/2012/02/ascii-schnittstellen-mit-hilfe-von-custom-attributes-komfortabel-erstellen-c/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Viele kennen dass Problem, dass Daten zwischen verschiedenen Welten auch Heute noch immer durch Übergabe von Schnittstellendateien, seien es EDI oder auch ASCII Dateien, die einen festen Satzaufbau haben, übergeben werden.</p>
<p>Die Definitionen sehen oft wie folgt aus:</p>
<p><a href="http://blog.schelian.de/wp-content/uploads/2012/02/image.png"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="" src="http://blog.schelian.de/wp-content/uploads/2012/02/image_thumb.png" alt="" width="644" height="118" border="0" /></a></p>
<p>Wobei die nähere Definition etwas komplexer sein kann:</p>
<p><a href="http://blog.schelian.de/wp-content/uploads/2012/02/image1.png"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="Art: A alphanumerisches Feld N numerisches Feld Länge L Gesamtlänge des Datenfeldes Nachkomma K davon Nachkommastellen Position von von Stelle ... im Datensatz bis bis Stelle ... im Datensatz M/O M Muss-Feld O Kann-Feld (optional) M/O abhängig von anderen Angaben handelt es sich wahlweise um ein Muss- oder ein Kann-Feld " src="http://blog.schelian.de/wp-content/uploads/2012/02/image_thumb1.png" alt="Art: A alphanumerisches Feld N numerisches Feld Länge L Gesamtlänge des Datenfeldes Nachkomma K davon Nachkommastellen Position von von Stelle ... im Datensatz bis bis Stelle ... im Datensatz M/O M Muss-Feld O Kann-Feld (optional) M/O abhängig von anderen Angaben handelt es sich wahlweise um ein Muss- oder ein Kann-Feld " width="644" height="262" border="0" /></a></p>
<p>Der Output, also die Übertragungsdatei enthält dann Daten die ähnlich der nachfolgenden Abbildung aussehen können.</p>
<p><a href="http://blog.schelian.de/wp-content/uploads/2012/02/image2.png"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="image" src="http://blog.schelian.de/wp-content/uploads/2012/02/image_thumb2.png" alt="image" width="644" height="182" border="0" /></a></p>
<p>Eine durchaus übliche Vorgehensweise solche Daten erstellen zu können ist es, sich Klassen zu erstellen, die dem eigentlichen benötigten Satzaufbau entsprechen, diese in einer Füll Routine mit Daten füllt und anschließend die Daten der Klasseneigenschaften mit string.Format Stück für Stück ausgibt.</p>
<p>Wäre es nicht wünschenswert, bereits bei der Definition der Klasse festlegen zu können, welche Ausgabeeigenschaften (Ausgabeformat wie führende Nullen, Links oder Rechtsbündig, Anzahl Nachkommastellen usw.) die jeweilige Eigenschaft besitzt und an welcher Position die Eigenschaft ausgegeben werden soll, anzugeben, damit man anschließend die Daten einfach mit einer einzelnen Methode im richtigen Format ausgeben kann.</p>
<p>Und genau da setze ich mit meiner Lösung an:</p>
<p>Man kann mit sogenannten Custom Attributes beliebig zusätzliche Informationen an jedes beliebige Klassenelement anheften. Hierzu muss man eine Klasse erstellen die von System.Attributes abgeleitet wird.</p>
<p>Siehe Nachfolgendes Beispiel, welches ziemlich selbsterklärend sein sollte.</p>
<div id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:9d1fbd0e-4241-4cbe-8eaa-fede6ec5f613" class="wlWriterEditableSmartContent" style="margin: 0px; display: inline; float: none; padding: 0px;">
<pre class="brush: csharp; pad-line-numbers: true; title: ; wrap-lines: true; notranslate">
using System;
    using System.Reflection;

    public enum ExportFieldType
    {
        /// &lt;summary&gt;
        /// Alphanumeric Field
        /// &lt;/summary&gt;
        Alpha,

        /// &lt;summary&gt;
        /// Numeric Field
        /// &lt;/summary&gt;
        Numeric
    }

    [AttributeUsage(AttributeTargets.Property, AllowMultiple = false)]
    public class ExportFieldAttribute : Attribute
    {
        private readonly int index;

        private readonly int length;

        private readonly ExportFieldType fieldType;

        private readonly int precision;

        private readonly bool optionalField;

        private readonly int fromPos;

        private readonly int toPos;

        /// &lt;summary&gt;
        /// Initializes a new instance of the &lt;see cref=&quot;ExportFieldAttribute&quot;/&gt; class.
        /// &lt;/summary&gt;
        /// &lt;param name=&quot;index&quot;&gt;The index.&lt;/param&gt;
        /// &lt;param name=&quot;fieldType&quot;&gt;Type of the field.&lt;/param&gt;
        /// &lt;param name=&quot;length&quot;&gt;The length.&lt;/param&gt;
        /// &lt;param name=&quot;precision&quot;&gt;The precision.&lt;/param&gt;
        /// &lt;param name=&quot;optionalField&quot;&gt;if set to &lt;c&gt;true&lt;/c&gt; [optional field].&lt;/param&gt;
        /// &lt;param name=&quot;fromPos&quot;&gt;From pos.&lt;/param&gt;
        /// &lt;param name=&quot;toPos&quot;&gt;To pos.&lt;/param&gt;
        public ExportFieldAttribute(int index, ExportFieldType fieldType, int length, int precision, bool optionalField = false, int fromPos = -1, int toPos = -1)
        {
            this.index = index;
            this.fieldType = fieldType;
            this.length = length;
            this.precision = precision;
            this.optionalField = optionalField;
            this.fromPos = fromPos;
            this.toPos = toPos;
        }

        public int Index
        {
            get
            {
                return this.index;
            }
        }

        public ExportFieldType FieldType
        {
            get
            {
                return this.fieldType;
            }
        }

        public int Length
        {
            get
            {
                return this.length;
            }
        }

        public int Precision
        {
            get
            {
                return this.precision;
            }
        }

        public bool OptionalField
        {
            get
            {
                return this.optionalField;
            }
        }

        public int FromPos
        {
            get
            {
                return this.fromPos;
            }
        }

        public int ToPos
        {
            get
            {
                return this.toPos;
            }
        }
    }
</pre>
</div>
<p>Nun kann ich in der Klassendefinition in der ich die Datensatzstruktur der Exportdatei abbilde, dieses Attribut zusätzlich zu den Eigenschaften der Klasse verwenden um die für den korrekten Export benötigen Informationen anzuheften.</p>
<p>Die Klasse könnte so aussehen:</p>
<div id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:5724d337-dd90-4a99-82d4-1daaee149501" class="wlWriterEditableSmartContent" style="margin: 0px; display: inline; float: none; padding: 0px;">
<pre class="brush: csharp; title: ; notranslate">
    public class Ksta
    {
        [ExportField(0, ExportFieldType.Alpha, 5, 0)]
        public string Satza
        {
            get
            {
                return &quot;KSTA_&quot;;
            }
        }

        [ExportField(1, ExportFieldType.Numeric, 2, 0)]
        public int Gsber
        {
            get
            {
                return 1;
            }
        }

        [ExportField(2, ExportFieldType.Numeric, 8, 0)]
        public int Kvkda { get; set; }

        [ExportField(3, ExportFieldType.Numeric, 8, 0)]
        public int Dtkda { get; set; }

        [ExportField(4, ExportFieldType.Numeric, 5, 0)]
        public int Kvkvn { get; set; }

        [ExportField(5, ExportFieldType.Numeric, 5, 0)]
        public int Ssbpa { get; set; }

        [ExportField(6, ExportFieldType.Numeric, 8, 3)]
        public int Sskda { get; set; }
    }
</pre>
</div>
<p>Wie aber können wir diese zusätzlichen Attribute verwenden?</p>
<p>Ich möchte dies an einem einfachen Beispiel demonstrieren. Hierzu erweitere ich die Klasse ExportFieldAttribute um folgende Methode:</p>
<div id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:2a80c6ce-7dc8-4855-bcaa-ccb26f51c845" class="wlWriterEditableSmartContent" style="margin: 0px; display: inline; float: none; padding: 0px;">
<pre class="brush: csharp; title: ; wrap-lines: true; notranslate">
public static string ExportFieldToString(object obj, bool sorted = true)
{
	string buffer = string.Empty;
	PropertyInfo[] pi = obj.GetType().GetProperties();
	if (sorted)
	{
		var propertyInfoSorted = new PropertyInfo[pi.Length];
		foreach (var propertyInfo in pi)
		{
			var attribs = (ExportFieldAttribute[])propertyInfo.GetCustomAttributes(typeof(ExportFieldAttribute), true);
			if (attribs.Length &gt; 0)
			{
				propertyInfoSorted[attribs[0].Index] = propertyInfo;
			}
		}

		pi = propertyInfoSorted;
	}

	foreach (var propertyInfo in pi)
	{
		if (propertyInfo == null)
		{
			continue;
		}

		var attribs = (ExportFieldAttribute[])propertyInfo.GetCustomAttributes(typeof(ExportFieldAttribute), true);

		if (attribs.Length &gt; 0)
		{
			ExportFieldAttribute attrib = attribs[0];
			var o = propertyInfo.GetValue(obj, null);
			if (o == null)
			{
				o = string.Empty;
			}

			if (attrib.FieldType == ExportFieldType.Alpha)
			{
				string t = string.Format(o.ToString().PadRight(attrib.Length));
				buffer += t;
			}

			if (attrib.FieldType == ExportFieldType.Numeric)
			{
				if (attrib.Precision &gt; 0)
				{
					string concat;
					var buf = o.ToString().Split(',');
					if (buf.Length &gt; 1)
					{
						buf[1] = buf[1].PadRight(attrib.Precision, '0').Substring(0, attrib.Precision);
						concat = buf[0] + buf[1];
					}
					else
					{
						concat = buf[0] + string.Empty.PadRight(attrib.Precision, '0');
					}
					string t = string.Format(concat.PadLeft(attrib.Length, '0'));
					buffer += t;
				}
				else
				{
					string t = string.Format(o.ToString().PadLeft(attrib.Length, '0'));
					buffer += t;
				}
			}
		}
	}
	return buffer;
}
</pre>
</div>
<p>Ich möchte an dieser Stelle nun auch keine aufwändige Erklärung der Methode vornehmen, ich denke dass derjenige der sich mit diesem Problem beschäftigt erkennen wird was darin geschieht.</p>
<p>Und um diese Methode zu verwenden, also um den Satzaufbau der Daten so zu erhalten wie ich ihn mit den Attributen definiert habe, überschreibe ich einfach die ToString() Methode der Klasse in welcher ich die Datenstruktur abgebildet habe.</p>
<p>Das sieht dann so aus (In der Klasse Ksta):</p>
<div id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:6c1bd2f7-cd57-476b-b3e0-96c3947e6e9f" class="wlWriterEditableSmartContent" style="margin: 0px; display: inline; float: none; padding: 0px;">
<pre class="brush: csharp; title: ; notranslate">
        public override string ToString()
        {
            return ExportFieldAttribute.ExportFieldToString(this);
        }
</pre>
</div>
<p>Wenn ich nun eine Instanz der Klasse Ksta erstelle, diese dann mit Daten fülle und anschließen die ToString Methode aufrufe erhalten ich die Daten genau in der definierten Struktur.</p>
<p>Wenn jemand noch Fragen zu dem Thema hat, oder doch noch weiterführende Erläuterungen benötigt, dann einfach per Kommentar die Fragen oder Anregungen stellen.</p>
<div align="center"><a href="http://twitter.com/SchelianHP" target="_blank"><img src="http://blog.schelian.de/wp-content/plugins/igit-follow-me-after-post-button-new/twitter11.png" /></a></div>]]></content:encoded>
			<wfw:commentRss>http://blog.schelian.de/2012/02/ascii-schnittstellen-mit-hilfe-von-custom-attributes-komfortabel-erstellen-c/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
