<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="wordpress/2.2.1" -->
<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/"
	>

<channel>
	<title>Dr. Jochen Manns</title>
	<link>http://jochen.jochen-manns.de</link>
	<description>Software und ich</description>
	<pubDate>Mon, 05 Mar 2012 17:46:28 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.2.1</generator>
	<language>en</language>
			<item>
		<title>Neues Ablagesystem für VCR.NET</title>
		<link>http://jochen.jochen-manns.de/index.php/2012/03/03/neues-ablagesystem-fur-vcrnet/</link>
		<comments>http://jochen.jochen-manns.de/index.php/2012/03/03/neues-ablagesystem-fur-vcrnet/#comments</comments>
		<pubDate>Sat, 03 Mar 2012 19:19:44 +0000</pubDate>
		<dc:creator>JMS</dc:creator>
		
		<category><![CDATA[VCR.NET]]></category>

		<guid isPermaLink="false">http://jochen.jochen-manns.de/index.php/2012/03/03/neues-ablagesystem-fur-vcrnet/</guid>
		<description><![CDATA[Beginnend mit VCR.NET 4.0 werden alle Informationen, die bisher in verschiedenen Dateien an verschiedenen Orten gespeichert wurden (Konfiguration, aktive und archivierte Aufträge, Protokolle, Programmzeitschriften) in einer einzige Microsoft SQL Compact Edition (SqlCe 4.0) Datenbank abgelegt. Die Übernahme erfolgt beim ersten Starten automatisch. Die Datenbank ist integraler Bestandteil der VCR.NET Installation (Private Mode des SqlCe), so [...]]]></description>
			<content:encoded><![CDATA[<p>Beginnend mit VCR.NET 4.0 werden alle Informationen, die bisher in verschiedenen Dateien an verschiedenen Orten gespeichert wurden (Konfiguration, aktive und archivierte Aufträge, Protokolle, Programmzeitschriften) in einer einzige Microsoft SQL Compact Edition (SqlCe 4.0) Datenbank abgelegt. Die Übernahme erfolgt beim ersten Starten automatisch. Die Datenbank ist integraler Bestandteil der VCR.NET Installation (Private Mode des SqlCe), so dass keine weiteren Schritt bei einer Erstinstallation oder einem Upgrade notwendig sind. Kurz: technisch sollten die Anwender von der Änderung gar nichts bemerken.</p>
<p>Die Umstellung wurde durch die (sehr zähen und langsam fortschreitenden - ich weiß &#8230; leider!) Arbeiten am neuen Zeitplaner sinnvoll. Allerdings habe ich trotz erfolgreicher Umstellung der aktuellen Funktionalitäten noch nicht das endgültige Datenbankschema erreicht. Daher wird es vorerst auch kein Preview geben - ich selbst nutze die Version noch nicht produktiv. Nach einer Aktualisierung auf das neue Ablagesystem gibt es auch kein Zurück mehr und ich möchte nicht schon in der Beta Phase Schemamigrationen machen müssen. Etwas Geduld also&#8230;</p>
<p>Die Wahl genau dieser Datenbank ergibt sich aus dem Umfeld (privates Lernprojekt, tagesaktuelle Anforderungen) und daher sind andere Datenbanken wie MySQL und Konsorten kein Thema. Die Implementierung ist zwar an vielen Stellen ADO.NET basierend allgemein gehalten, allerdings musste ich insbesondere aus Performancegründen bei der Programmzeitschrift einige Kompromisse schliessen und direkt gegen SqlCe programmieren. Auf der einen Seite stehe ich noch ganz am Anfang und möchte daher nicht die Hoffnung aufgeben, dass bis zum Release von VCR.NET 4.0 etwas Ordentliches daraus wird. Aber auf der anderen Seite ist das für 4.0 nur ein kleiner Nebenschauplatz, an dem ich eigentlich gar nicht lange verweilen wollte. Naja, man kann es sich selbst auch nicht Recht machen, oder&#8230;</p>
<p>Soweit zur Information</p>
<p>Jochen</p>
]]></content:encoded>
			<wfw:commentRss>http://jochen.jochen-manns.de/index.php/2012/03/03/neues-ablagesystem-fur-vcrnet/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Das Forum funktioniert nicht richtig&#8230;</title>
		<link>http://jochen.jochen-manns.de/index.php/2012/03/03/das-forum-funktioniert-nicht-richtig/</link>
		<comments>http://jochen.jochen-manns.de/index.php/2012/03/03/das-forum-funktioniert-nicht-richtig/#comments</comments>
		<pubDate>Sat, 03 Mar 2012 19:17:13 +0000</pubDate>
		<dc:creator>JMS</dc:creator>
		
		<category><![CDATA[DVB.NET]]></category>

		<category><![CDATA[VCR.NET]]></category>

		<guid isPermaLink="false">http://jochen.jochen-manns.de/index.php/2012/03/03/das-forum-funktioniert-nicht-richtig/</guid>
		<description><![CDATA[Ich habe gerade versucht, im VCR.NET / DVB.NET Forum etwas zu posten, aber da geht wohl im Moment (seit wann weiß ich nicht) gar nichts: weder Posts noch private Mails. Ich habe das an den Admin weitergeleitet.
Sorry
Jochen
Update 05.03.2012: Alles wieder wie es sein soll, Dank an den Admin (TheWatcher)!
]]></description>
			<content:encoded><![CDATA[<p>Ich habe gerade versucht, im VCR.NET / DVB.NET Forum etwas zu posten, aber da geht wohl im Moment (seit wann weiß ich nicht) gar nichts: weder Posts noch private Mails. Ich habe das an den Admin weitergeleitet.</p>
<p>Sorry</p>
<p>Jochen</p>
<p><strong>Update 05.03.2012</strong>: Alles wieder wie es sein soll, Dank an den Admin (TheWatcher)!</p>
]]></content:encoded>
			<wfw:commentRss>http://jochen.jochen-manns.de/index.php/2012/03/03/das-forum-funktioniert-nicht-richtig/feed/</wfw:commentRss>
		</item>
		<item>
		<title>ListBox, ComboBox oder was?</title>
		<link>http://jochen.jochen-manns.de/index.php/2012/02/12/listbox-combobox-oder-was/</link>
		<comments>http://jochen.jochen-manns.de/index.php/2012/02/12/listbox-combobox-oder-was/#comments</comments>
		<pubDate>Sun, 12 Feb 2012 17:54:21 +0000</pubDate>
		<dc:creator>JMS</dc:creator>
		
		<category><![CDATA[Silverlight]]></category>

		<guid isPermaLink="false">http://jochen.jochen-manns.de/index.php/2012/02/12/listbox-combobox-oder-was/</guid>
		<description><![CDATA[Im Rahmen meiner Einarbeitung in Silverlight / WPF bin ich auf eine Idee gestossen, die ich einmal an einem rudimentären Beispiel als Anschauungsmaterial implementiert habe. Die Aufgabenstellung an sich ist eigentlich sehr einfach: aus einer begrenzten Liste von Auswahlelementen soll eines vom Anwender ausgewählt werden. Ganz klar die Aufgabe einer ComboBox. Die Auswahl soll zudem [...]]]></description>
			<content:encoded><![CDATA[<p>Im Rahmen meiner Einarbeitung in Silverlight / WPF bin ich auf eine Idee gestossen, die ich einmal an einem rudimentären Beispiel als Anschauungsmaterial implementiert habe. Die Aufgabenstellung an sich ist eigentlich sehr einfach: aus einer begrenzten Liste von Auswahlelementen soll eines vom Anwender ausgewählt werden. Ganz klar die Aufgabe einer ComboBox. Die Auswahl soll zudem graphisch und nicht in Textform präsentiert werden - auch keinerlei Herausforderung für Silverlight / WPF. Wie das Beispiel zeigt, kann man sich das auch optisch ein wenig anders vorstellen - zu den einzelnen Elementen der Testseite gleich mehr. </p>
<p><a href='http://jochen.jochen-manns.de/__oneclick_uploads/2012/02/nopreselect.png' title='Startzustand'><img border="0" src='http://jochen.jochen-manns.de/__oneclick_uploads/2012/02/nopreselect.thumbnail.png' alt='Startzustand' /></a></p>
<p>Im initialen Zustand wird die Auswahlliste als ListBox dargestellt - ohne die typische Sondervisualisierung der ComboBox mit dem Auswahlfeld zum Aufklappen. Verändert sich die Auswahl, so übernimmt die Listbox die Anzeige - auf Aspekte des ausgewählten Eintrags kann im XAML wie gewohnt referenziert werden, wie das Bild links oben und der relative Pfad des Bildes daneben zeigt. Das ist nun wirklich nichts Besonderes bis hierhin.</p>
<p><a href='http://jochen.jochen-manns.de/__oneclick_uploads/2012/02/selection.png' title='Aufgeklappt'><img border="0" src='http://jochen.jochen-manns.de/__oneclick_uploads/2012/02/selection.thumbnail.png' alt='Aufgeklappt' /></a></p>
<p>Die Besonderheit zeigt sich aber, wenn man die Auswahl bestätigt. Die ListBox klappt dann scheinbar zu und zeigt nun nur noch den ausgewählten Eintrag.</p>
<p><a href='http://jochen.jochen-manns.de/__oneclick_uploads/2012/02/preselectorselect.png' title='Zugeklappt'><img src='http://jochen.jochen-manns.de/__oneclick_uploads/2012/02/preselectorselect.thumbnail.png' alt='Zugeklappt' /></a></p>
<p>Das Beispiel kann man sich selbst einmal <a target="_blank" href="http://downloads.psimarron.net/Silverlight/ExoticComboBox/ExoCombTest.html">hier</a> anschauen, die Quellen gibt es <a href="http://downloads.psimarron.net/Silverlight/ExoticComboBox/Sources.zip">hier</a>. Es handelt sich wirklich nur um eine sehr elementare Implementierung, sicher nicht um ein vollwertiges Control. Was tut das Beispiel jetzt schon:</p>
<ul>
<li>Beim Starten ist einer der drei Alternativen ausgewählt - sieht im Beispiel etwas häßlich aus, da meine Beispielbilder einen teilweise transparenten Hintergrund haben und die Auswahleinfärbung der Listbox auch im zugeklappten Modus erscheint: einfach vorstellen, dass der Hintergrund der Visualisierungselemente nicht transparent ist (man kann irgendein FrameworkElement verwenden).</li>
<li>In der oberen Zeile wird die Auswahl zur Demonstration als Bild und Pfad zusätzlich angezeigt.</li>
<li>Ein einfacher Klick auf die gewählte Alternative (großes Bild) öffnet die Auswahlliste.</li>
<li>Die Navigation in der Liste mit Maus oder Tastatur verändert die Auswahl, insbesondere kann diese wie gewohnt mit Strg-Click aufgehoben werden.</li>
<li>Ein Doppelklick oder die Taste ENTER beendet die Auswahl und schließt die Liste, es wird nun die letzte Auswahl angezeigt.</li>
<li>Die Eingabe des Pfades in der oberen Zeile kann zur Änderung der Auswahl verwendet werden - uh, Injection Attack möglich, schert hier aber nicht.</li>
<li>Hat die zugeklappte Liste den Fokus, so kann die Auswahl weiterhin mit der Maus verändert werden - die Liste klappt dazu automatisch auf.</li>
<li>Im XAML der Seite sieht man, dass die Auswahl vorbelegt werden kann, was natürlich optional ist.</li>
</ul>
<p>Happy Coding</p>
<p>Jochen</p>
]]></content:encoded>
			<wfw:commentRss>http://jochen.jochen-manns.de/index.php/2012/02/12/listbox-combobox-oder-was/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Es ist schon wieder so weit&#8230;</title>
		<link>http://jochen.jochen-manns.de/index.php/2011/12/24/es-ist-schon-wieder-so-weit/</link>
		<comments>http://jochen.jochen-manns.de/index.php/2011/12/24/es-ist-schon-wieder-so-weit/#comments</comments>
		<pubDate>Sat, 24 Dec 2011 11:13:26 +0000</pubDate>
		<dc:creator>JMS</dc:creator>
		
		<category><![CDATA[Allgemein]]></category>

		<guid isPermaLink="false">http://jochen.jochen-manns.de/index.php/2011/12/24/es-ist-schon-wieder-so-weit/</guid>
		<description><![CDATA[Ich wünsche allen Besuchern meines Blogs frohe und erhohlsame Festtage und einen guten Rutsch ins neue Jahr.
Viel Erfolg
Jochen
]]></description>
			<content:encoded><![CDATA[<p>Ich wünsche allen Besuchern meines Blogs frohe und erhohlsame Festtage und einen guten Rutsch ins neue Jahr.</p>
<p>Viel Erfolg</p>
<p>Jochen</p>
]]></content:encoded>
			<wfw:commentRss>http://jochen.jochen-manns.de/index.php/2011/12/24/es-ist-schon-wieder-so-weit/feed/</wfw:commentRss>
		</item>
		<item>
		<title>DVB.NET 4.0 Zeitplaner für VCR.NET - erste Schritte</title>
		<link>http://jochen.jochen-manns.de/index.php/2011/11/01/dvbnet-40-zeitplaner-fur-vcrnet-erste-schritte/</link>
		<comments>http://jochen.jochen-manns.de/index.php/2011/11/01/dvbnet-40-zeitplaner-fur-vcrnet-erste-schritte/#comments</comments>
		<pubDate>Tue, 01 Nov 2011 15:58:19 +0000</pubDate>
		<dc:creator>JMS</dc:creator>
		
		<category><![CDATA[DVB.NET]]></category>

		<category><![CDATA[VCR.NET]]></category>

		<guid isPermaLink="false">http://jochen.jochen-manns.de/index.php/2011/11/01/dvbnet-40-zeitplaner-fur-vcrnet-erste-schritte/</guid>
		<description><![CDATA[In DVB.NET 4.0 wird es wie bereits angekündigt einen neuen Zeitplaner für Aufzeichnungen und Aufgaben geben, den auch VCR.NET 4.0 verwenden soll. Ich habe auf der vorläufigen Web Site von DVB.NET 4.0 einige Überlegungen zusammengestellt - leider noch etwas krude, aber für mehr reicht die Zeit in diesem Moment nicht, später gibt es hoffentlich noch [...]]]></description>
			<content:encoded><![CDATA[<p>In DVB.NET 4.0 wird es wie bereits angekündigt einen neuen Zeitplaner für Aufzeichnungen und Aufgaben geben, den auch VCR.NET 4.0 verwenden soll. Ich habe auf der vorläufigen <a href="http://www.psimarron.net/DVBNET40">Web Site von DVB.NET 4.0</a> <a href="http://www.psimarron.net/DVBNET40/html/scheduler.html">einige Überlegungen</a> zusammengestellt - leider noch etwas krude, aber für mehr reicht die Zeit in diesem Moment nicht, später gibt es hoffentlich noch eine ordentliche Überarbeitung in Form und Inhalt. Auch mit der Implementierung bin ich noch nicht wirklich zufrieden, da der verwendete Algorithmus gerade bei einer größeren Zahl gleichartiger Geräte und mehreren überlappenden Aufzeichnungen leicht in hohen Ressourcenbedarf (Laufzeit und Hauptspeicher) getrieben werden kann. Da ich aber nicht weiß, wann ich zum nächsten Schritt komme, gebe ich einfach den aktuellen Stand mal zu Spielen frei - ich werde demnächst im Forum etwas mehr dazu schreiben, wie mich VCR.NET Anwender in dieser frühen Entwicklungsphase unterstützen und darüber vielleicht sogar noch eigene Anforderungen einbringen können.</p>
<p>Zuerst einmal kann das Testprogramm auch <strong>ohne DVB.NET / VCR.NET Installation</strong> ausgeführt werden, wenn Silverlight 4 im Web Browser unterstützt wird. Dazu kann man die <a href="http://downloads.psimarron.net/Silverlight/DVBScheduler/start.html">Startseite des Testprogramms</a> direkt auf meiner Web Site aufrufen. Zwar geht das Planen nicht ohne Geräteprofile, aber auch dafür braucht man keine DVB.NET Installation. Ich habe die Beispielprofile, die auch in der <a href="http://www.psimarron.net/DVBNET40/html/schedulesample.html">Beschreibung des Zeitplaners</a> referenziert werden, <a href="http://downloads.psimarron.net/Silverlight/DVBScheduler/DevicePack.zip">zum Download bereit gestellt</a>. Einfach irgendwo hin lokal kopieren und von dort <a href="http://www.psimarron.net/DVBNET40/html/scheduleapp.html">in das Testprogramm laden</a> - los geht es.</p>
<p>Für den rein lokalen Betrieb einfach die <a href="http://downloads.psimarron.net/Silverlight/DVBScheduler/">XAP und HTML vom Download Bereich</a> auf die Festplatte kopieren - bevorzugt in das Installationsverzeichnis des VER.NET Recordings Service, in den <a href="http://www.psimarron.net/DVBNET40/html/schedulevcrnet.html">Beispieltexten</a> wurde die <em>start.html</em> unter dem Namen <em>ScheduleUITestPage.html</em> abgelegt, der Name der Silverlight XAP darf nicht verändert werden. Für den VCR.NET Betrieb benötigt man allerdings zumindest das <a href="http://downloads.psimarron.net/Beta/">Halloween 2011 Preview der Version 4.0</a>, damit die Aufzeichnungen und Aufgaben ausgelesen werden können - DVB.NET und VCR.NET.</p>
<p>Bis bald</p>
<p>Jochen</p>
]]></content:encoded>
			<wfw:commentRss>http://jochen.jochen-manns.de/index.php/2011/11/01/dvbnet-40-zeitplaner-fur-vcrnet-erste-schritte/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Silent Running</title>
		<link>http://jochen.jochen-manns.de/index.php/2011/10/10/silent-running/</link>
		<comments>http://jochen.jochen-manns.de/index.php/2011/10/10/silent-running/#comments</comments>
		<pubDate>Mon, 10 Oct 2011 21:01:13 +0000</pubDate>
		<dc:creator>JMS</dc:creator>
		
		<category><![CDATA[VCR.NET]]></category>

		<guid isPermaLink="false">http://jochen.jochen-manns.de/index.php/2011/10/10/silent-running/</guid>
		<description><![CDATA[Ja, es ist im Moment etwas still geworden um die Weiterentwicklung von VCR.NET 4.0. Leider bin ich doch deutlich mehr anderweitig gebunden, als ich gehofft habe und komme nur langsam voran. Aber um mich mal zu melden hier ein kurzer Status: wie im Forum angesprochen ist ein für mich wichtiges Thema eine neue Aufzeichnungsplanung. Diese [...]]]></description>
			<content:encoded><![CDATA[<p>Ja, es ist im Moment etwas still geworden um die Weiterentwicklung von VCR.NET 4.0. Leider bin ich doch deutlich mehr anderweitig gebunden, als ich gehofft habe und komme nur langsam voran. Aber um mich mal zu melden hier ein kurzer Status: wie im Forum angesprochen ist ein für mich wichtiges Thema eine neue Aufzeichnungsplanung. Diese wird nach völlig anderen Konzepten vorgehen als alle bisherigen Lösungen und soll vor Allem die Nutzung mehrerer Karten erleichtern. Ich bereite im Moment im Rahmen der Tests ein kleines Silverlight Tool vor, das es den Beta-Testern erlauben wird, mit zur Weiterentwicklung von VCR.NET beizutragen. Etwas einfacher als das Bildchen unten es zeigt soll der Aufruf einer HTML Seite mit dem Silverlight Tool darauf darstellen, wie VCR.NET eine vorhandene Liste von Aufzeichnungen in Zukunft planen würde - ohne lästige Zuordnung einzelner Geräte. Schauen wir mal, ob das klappt.</p>
<p>Bis bald (hoffentlich nicht erst wieder in einem Monat)</p>
<p>Jochen</p>
<p><a href='http://jochen.jochen-manns.de/__oneclick_uploads/2011/10/schedule40.jpg' title='So könnte das Tool aussehen'><img border='0' src='http://jochen.jochen-manns.de/__oneclick_uploads/2011/10/schedule40.thumbnail.jpg' alt='So könnte das Tool aussehen' /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://jochen.jochen-manns.de/index.php/2011/10/10/silent-running/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Erste Testversion von VCR.NET 4.0 auf Basis von .NET 4.0</title>
		<link>http://jochen.jochen-manns.de/index.php/2011/08/31/erste-testversion-von-vcrnet-40-auf-basis-von-net-40/</link>
		<comments>http://jochen.jochen-manns.de/index.php/2011/08/31/erste-testversion-von-vcrnet-40-auf-basis-von-net-40/#comments</comments>
		<pubDate>Wed, 31 Aug 2011 08:19:36 +0000</pubDate>
		<dc:creator>JMS</dc:creator>
		
		<category><![CDATA[DVB.NET]]></category>

		<category><![CDATA[VCR.NET]]></category>

		<guid isPermaLink="false">http://jochen.jochen-manns.de/index.php/2011/08/31/erste-testversion-von-vcrnet-40-auf-basis-von-net-40/</guid>
		<description><![CDATA[Ich habe die aktuelle 4.0er Testversion auf .NET 4.0 umgestellt und seit einigen Wochen im privaten Einsatz. Bisher konnte ich kein Fehlerverhalten feststellen, darum habe ich diese Version hier zum Testen auf eigene Gefahr bereit gestellt - die auf .NET 3.5 basierende Variante wird in den nächsten Tagen verschwinden. Viel getan hat sich leider sonst [...]]]></description>
			<content:encoded><![CDATA[<p>Ich habe die aktuelle 4.0er Testversion auf .NET 4.0 umgestellt und seit einigen Wochen im privaten Einsatz. Bisher konnte ich kein Fehlerverhalten feststellen, darum habe ich diese Version <a href="http://downloads.psimarron.net/Beta/">hier</a> zum Testen auf eigene Gefahr bereit gestellt - die auf .NET 3.5 basierende Variante wird in den nächsten Tagen verschwinden. Viel getan hat sich leider sonst noch nicht - ich habe zwar einige Baustellen angefangen, diese aber noch nicht abgeschlossen. Ich werde versuchen, in naher Zukunft im <a href="http://www.watchersnet.de/tabid/52/g/forum/c/10/Andere-Projekte---other-Projects.aspx">Forum</a> einige Informationen zum aktuellen Stand und den Planungen für das 4.0er Release bereit zu stellen.</p>
<p>Viel Spaß</p>
<p>Jochen</p>
]]></content:encoded>
			<wfw:commentRss>http://jochen.jochen-manns.de/index.php/2011/08/31/erste-testversion-von-vcrnet-40-auf-basis-von-net-40/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Support für DVB.NET 3.9 mit SP2 eingestellt</title>
		<link>http://jochen.jochen-manns.de/index.php/2011/07/25/support-fur-dvbnet-39-mit-sp2-eingestellt/</link>
		<comments>http://jochen.jochen-manns.de/index.php/2011/07/25/support-fur-dvbnet-39-mit-sp2-eingestellt/#comments</comments>
		<pubDate>Mon, 25 Jul 2011 14:53:21 +0000</pubDate>
		<dc:creator>JMS</dc:creator>
		
		<category><![CDATA[DVB.NET]]></category>

		<category><![CDATA[VCR.NET]]></category>

		<guid isPermaLink="false">http://jochen.jochen-manns.de/index.php/2011/07/25/support-fur-dvbnet-39-mit-sp2-eingestellt/</guid>
		<description><![CDATA[Ich habe nun auch für VCR.NET 4.0 einen Preview auf Basis von .NET 3.5 erstellt und meine lokale Entwicklungsumgebung entsprechend umgestellt. Es wird nun keine Korrekturen für DVB.NET 3.9 mehr geben. Weitere Informationen zum Preview gibt es hier im Forum - wie dort dargelegt handelt es sich um eine sehr frühe Version mit vielen Infrastrukturänderungen [...]]]></description>
			<content:encoded><![CDATA[<p>Ich habe nun auch für VCR.NET 4.0 einen Preview auf Basis von .NET 3.5 erstellt und meine lokale Entwicklungsumgebung entsprechend umgestellt. Es wird nun keine Korrekturen für DVB.NET 3.9 mehr geben. Weitere Informationen zum Preview gibt es <a href="http://www.watchersnet.de/tabid/52/g/posts/t/37/VCR-NET-4-0-Preview---nur-fur-Betroffene-und-besonders-Mutige.aspx">hier im Forum</a> - wie dort dargelegt handelt es sich um eine sehr frühe Version mit vielen Infrastrukturänderungen in DVB.NET und wenigen aber merklichen Veränderungen am VCR.NET Recording Service. Eine Umstellung ist durchaus mit einem gewissen Risiko verbunden und sollte im Moment nur bei tatsächlichen Bedarf erfolgen (e.g. Nutzung der CI/CAM Lösung von Digital Devices in DVB.NET / VCR.NET oder der neuen Aktualisierungszeitplanung von Programmzeitschrift und Sendersuchlauf im VCR.NET).</p>
<p>So weit zur Information</p>
<p>Jochen</p>
]]></content:encoded>
			<wfw:commentRss>http://jochen.jochen-manns.de/index.php/2011/07/25/support-fur-dvbnet-39-mit-sp2-eingestellt/feed/</wfw:commentRss>
		</item>
		<item>
		<title>DVB.NET 4.0 Vorabversion</title>
		<link>http://jochen.jochen-manns.de/index.php/2011/05/29/dvbnet-40-vorabversion/</link>
		<comments>http://jochen.jochen-manns.de/index.php/2011/05/29/dvbnet-40-vorabversion/#comments</comments>
		<pubDate>Sun, 29 May 2011 18:04:57 +0000</pubDate>
		<dc:creator>JMS</dc:creator>
		
		<category><![CDATA[DVB.NET]]></category>

		<guid isPermaLink="false">http://jochen.jochen-manns.de/index.php/2011/05/29/dvbnet-40-vorabversion/</guid>
		<description><![CDATA[Von einigen Benutzer wurde auf Basis dieses Threads im Forum eine Vorabversion von DVB.NET 4.0 getestet. Es gibt bisher keine wesentlichen Änderungen nur eine ganze Reihe von internen Umstellungen, aber ich möchte dem geneigten Anwender diese Spielversion nicht vorenthalten - auch wenn CI/CAM Tests für Hauppauge und TechnoTrend Karten nicht vorgenommen wurden. Ich habe diesen [...]]]></description>
			<content:encoded><![CDATA[<p>Von einigen Benutzer wurde auf Basis dieses <a href="http://www.watchersnet.de/tabid/52/g/posts/t/28/DVB-NET-4-0---Bitte-um-Vorabtests--richtet-sich-an-erfahrene-DVB-NET-3-9-Anwender.aspx">Threads im Forum</a> eine Vorabversion von DVB.NET 4.0 getestet. Es gibt bisher keine wesentlichen Änderungen nur eine ganze Reihe von internen Umstellungen, aber ich möchte dem geneigten Anwender diese Spielversion nicht vorenthalten - auch wenn CI/CAM Tests für Hauppauge und TechnoTrend Karten nicht vorgenommen wurden. Ich habe diesen Stand <a href="http://downloads.psimarron.net/Beta/Version40PrivateforNET35/">hier</a> bereitgestellt. Aller Voraussicht nach wird es sich hier um die letzte auf .NET 3.5 basierte Version handeln.</p>
<p>Viel Spaß</p>
<p>Jochen</p>
]]></content:encoded>
			<wfw:commentRss>http://jochen.jochen-manns.de/index.php/2011/05/29/dvbnet-40-vorabversion/feed/</wfw:commentRss>
		</item>
		<item>
		<title>DVB.NET 4.0 - und welche .NET Version?</title>
		<link>http://jochen.jochen-manns.de/index.php/2011/04/08/dvbnet-40-und-welche-net-version/</link>
		<comments>http://jochen.jochen-manns.de/index.php/2011/04/08/dvbnet-40-und-welche-net-version/#comments</comments>
		<pubDate>Fri, 08 Apr 2011 21:18:51 +0000</pubDate>
		<dc:creator>JMS</dc:creator>
		
		<category><![CDATA[DVB.NET]]></category>

		<guid isPermaLink="false">http://jochen.jochen-manns.de/index.php/2011/04/08/dvbnet-40-und-welche-net-version/</guid>
		<description><![CDATA[Ich plane grundsätzlich DVB.NET 4.0 auf .NET 4.0 aufzusetzen. Bis zur Release Version können aber noch Monate vergehen. In der Zwischenzeit wird weiterhin &#8220;nur&#8221; .NET 3.5 SP2 voraus gesetzt und das durchaus in eigenem Interesse: gerade durch die Umstellung bei der Anbindung der BDA Geräte werde ich anfangs beim Testen auf die Unterstützung besonders der [...]]]></description>
			<content:encoded><![CDATA[<p>Ich plane grundsätzlich DVB.NET 4.0 auf .NET 4.0 aufzusetzen. Bis zur Release Version können aber noch Monate vergehen. In der Zwischenzeit wird weiterhin &#8220;nur&#8221; .NET 3.5 SP2 voraus gesetzt und das durchaus in eigenem Interesse: gerade durch die Umstellung bei der Anbindung der BDA Geräte werde ich anfangs beim Testen auf die Unterstützung besonders der Anwender angewiesen sein, die bereits DVB.NET 3.9 erfolgreich nutzen (e.g. über den VCR.NET Recording Service). Da DVB.NET 4.0 parallel zu DVB.NET 3.9 installiert werden kann, hilft diese Beibehaltung der Systemvoraussetzung vielleicht, dass ich mir mal den einen oder anderen kleinen Test wünschen kann - VCR.NET wird weiterhin keine Parallelinstallation erlauben und mit etwas Nachdenken findet man vermutlich alleine schnell heraus, warum dem so ist.</p>
<p>Viel Spaß</p>
<p>Jochen</p>
]]></content:encoded>
			<wfw:commentRss>http://jochen.jochen-manns.de/index.php/2011/04/08/dvbnet-40-und-welche-net-version/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Kompatibilität der Geräteabstraktionen zwischen DVB.NET 4.0 und 3.9</title>
		<link>http://jochen.jochen-manns.de/index.php/2011/04/08/kompatibilitat-der-gerateabstraktionen-zwischen-dvbnet-40-und-39/</link>
		<comments>http://jochen.jochen-manns.de/index.php/2011/04/08/kompatibilitat-der-gerateabstraktionen-zwischen-dvbnet-40-und-39/#comments</comments>
		<pubDate>Fri, 08 Apr 2011 21:12:42 +0000</pubDate>
		<dc:creator>JMS</dc:creator>
		
		<category><![CDATA[DVB.NET]]></category>

		<guid isPermaLink="false">http://jochen.jochen-manns.de/index.php/2011/04/08/kompatibilitat-der-gerateabstraktionen-zwischen-dvbnet-40-und-39/</guid>
		<description><![CDATA[Ich habe für DVB.NET 4.0 die existierende BDA Implementierung aufgeräumt - wenig Neues, aber viel hin und her geschoben. Im ersten Schritt habe ich mich dabei bemüht, soviel wie möglich von der Implementierung vor 3.9 zu entfernen und den Quellcode entsprechend aufzuräumen. Insbesondere wurde die bisherige BDA Bibliothek in zwei Dateien aufgeteilt: eine neue, die [...]]]></description>
			<content:encoded><![CDATA[<p>Ich habe für DVB.NET 4.0 die existierende BDA Implementierung aufgeräumt - wenig Neues, aber viel hin und her geschoben. Im ersten Schritt habe ich mich dabei bemüht, soviel wie möglich von der Implementierung vor 3.9 zu entfernen und den Quellcode entsprechend aufzuräumen. Insbesondere wurde die bisherige BDA Bibliothek in zwei Dateien aufgeteilt: eine neue, die sich ausschließlich um den DVB Empfang kümmert (die ist soweit fertig) und die bereinigte, die sich später einmal ausschließlich der Anzeige von Bild und Ton widmen wird (das kommt in der nächsten oder übernächsten Phase).</p>
<p>Dabei ist auch eine neue Infrastruktur für die Anbindung von BDA Geräten entstanden, die mit DVB.NET 3.9 zwar vorbereitet, aber noch nicht vollendet wurde. Aber wie will ich nun sicherstellen, dass bestehende Installation ohne viel Aufwand weiterlaufen? Nun, der Plan sieht drei Optionen vor.</p>
<p>Zum einen wird DVB.NET 4.0 alle 3.9 Geräteprofile einfach unverändert weiter nutzen können. Beim Laden wird automatisch eine entsprechende Anpassung vorgenommen, die sich aber nur zur Laufzeit im Speicher wiederspiegelt und keinen Einfluss auf das gespeicherte Profil hat. Nach der Regel <em>never touch a running system</em> kann man damit eventuell ewig klarkommen.</p>
<p>Allerdings kann die Konfiguration eines solchen Profils nicht mehr verändert werden. Alle Einstellungen werden als nur lesbar angezeigt und eine Veränderung unterbunden. Es ist aber möglich, im Pflegedialog die Implementierung von <em>vor 3.9</em> auf <em>ab 4.0</em> zu verändern. Dabei wird dann genau die oben beschriebene automatische Anpassung vorgenommen und in das Pflegeformular übernommen - das gilt nur für BDA Geräte, die Nexus bleibt wie gehabt ein anderes Ding. Erst die Speicherung ändert dann das Profil auf der Festplatte. Das ist dann der Punkt, an dem es nicht mehr von DVB.NET 3.9 verwendet werden kann - ansonsten ist eine Parallelinstallation der beiden Versionen ohne Probleme möglich.</p>
<p>Bleibt schließlich noch die Möglichkeit, ein Geräteprofil einfach neu Anzulegen. Ich hoffe, dass der neue Pflegedialog die Auswahl der benötigten Einstellung deutlich vereinfacht - das wird die Zeit zeigen.</p>
<p><a href='http://jochen.jochen-manns.de/__oneclick_uploads/2011/04/dvbnet40profil.jpg' title='Pflege eines DVB.NET 4.0 BDA Geräteprofils'><img src='http://jochen.jochen-manns.de/__oneclick_uploads/2011/04/dvbnet40profil.thumbnail.jpg' alt='Pflege eines DVB.NET 4.0 BDA Geräteprofils' border='0'/></a></p>
<p>Auf jeden Fall hiermit die Nachricht: DVB.NET 4.0 wird kommen!</p>
<p>Bis dann</p>
<p>Jochen</p>
]]></content:encoded>
			<wfw:commentRss>http://jochen.jochen-manns.de/index.php/2011/04/08/kompatibilitat-der-gerateabstraktionen-zwischen-dvbnet-40-und-39/feed/</wfw:commentRss>
		</item>
		<item>
		<title>3.9 Service Pack 2 freigegen</title>
		<link>http://jochen.jochen-manns.de/index.php/2011/03/11/39-service-pack-2-freigegen/</link>
		<comments>http://jochen.jochen-manns.de/index.php/2011/03/11/39-service-pack-2-freigegen/#comments</comments>
		<pubDate>Fri, 11 Mar 2011 18:32:18 +0000</pubDate>
		<dc:creator>JMS</dc:creator>
		
		<category><![CDATA[DVB.NET]]></category>

		<category><![CDATA[VCR.NET]]></category>

		<guid isPermaLink="false">http://jochen.jochen-manns.de/index.php/2011/03/11/39-service-pack-2-freigegen/</guid>
		<description><![CDATA[Ich habe das schon lange in der Entwicklung befindliche Service Pack 2 für DVB.NET (alle drei Installationsbereiche), VCR.NET und den DVB.NET / VCR.NET Viewer (jeweils 3.9) freigegeben. Insbesondere hatte sich in der CI/CAM Ansteuerung mit der Version 3.9 ein häßlicher kleiner Bug eingeschlichen. Es gibt eine Menge von kleinen Änderungen, wen das wirklich interessiert der [...]]]></description>
			<content:encoded><![CDATA[<p>Ich habe das schon lange in der Entwicklung befindliche Service Pack 2 für DVB.NET (alle drei Installationsbereiche), VCR.NET und den DVB.NET / VCR.NET Viewer (jeweils 3.9) <a href="http://downloads.psimarron.net/">freigegeben</a>. Insbesondere hatte sich in der CI/CAM Ansteuerung mit der Version 3.9 ein häßlicher kleiner Bug eingeschlichen. Es gibt eine Menge von kleinen Änderungen, wen das wirklich interessiert der möge sich <a href="http://www.watchersnet.de/tabid/52/g/posts/m/105/DVB-NET-3-9-Service-Pack-2-Release-Candidate-9.aspx#post105#post105">im Service Pack Thread</a> im offiziellen Forum informieren - ist leider etwas ungeordnet und läuft über einen nicht unerheblichen Zeitraum.</p>
<p>Es sind noch einige Punkte offen, die werde ich in Service Pack 3 angehen. Eine Version 4.0 steht leider immer noch in den Sternen.</p>
<p>Viel Spaß</p>
<p>Jochen</p>
]]></content:encoded>
			<wfw:commentRss>http://jochen.jochen-manns.de/index.php/2011/03/11/39-service-pack-2-freigegen/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Arbeiten mit mindestens zwei gleichartigen USB Geräten</title>
		<link>http://jochen.jochen-manns.de/index.php/2011/02/17/arbeiten-mit-mindestens-zwei-gleichartigen-usb-geraten/</link>
		<comments>http://jochen.jochen-manns.de/index.php/2011/02/17/arbeiten-mit-mindestens-zwei-gleichartigen-usb-geraten/#comments</comments>
		<pubDate>Thu, 17 Feb 2011 19:13:49 +0000</pubDate>
		<dc:creator>JMS</dc:creator>
		
		<category><![CDATA[DVB.NET]]></category>

		<category><![CDATA[VCR.NET]]></category>

		<guid isPermaLink="false">http://jochen.jochen-manns.de/index.php/2011/02/17/arbeiten-mit-mindestens-zwei-gleichartigen-usb-geraten/</guid>
		<description><![CDATA[(Dies ist ein Folgeartikel zu dieser Grundlagenbeschreibung)
USB Geräte habe die Angewohnheit, bei vielen normalen Gelegenheiten die eindeutigen Namen (Moniker) und Gerätepfade zu ändern. Damit versagt in vielen Fällen der DVB.NET Grundalgorithmus, Geräte über den eindeutigen BDA Namen nachzuschlagen- bei PCI Geräten ist es besser, aber die Problematik ist grundsätzlich die selbe.
Seit einiger Zeit kann in [...]]]></description>
			<content:encoded><![CDATA[<p>(Dies ist ein Folgeartikel zu <a href="http://jochen.jochen-manns.de/index.php/2011/02/17/gerateauswahl-uber-die-bda-filter-tuner-und-capture/">dieser Grundlagenbeschreibung</a>)</p>
<p>USB Geräte habe die Angewohnheit, bei vielen normalen Gelegenheiten die eindeutigen Namen (Moniker) und Gerätepfade zu ändern. Damit versagt in vielen Fällen der DVB.NET Grundalgorithmus, Geräte über den eindeutigen BDA Namen nachzuschlagen- bei PCI Geräten ist es besser, aber die Problematik ist grundsätzlich die selbe.</p>
<p>Seit einiger Zeit kann in einem BDA Geräteprofil die Einstellung <em>IgnoreMoniker</em> von der Voreinstellung <em>false</em> auf <em>true</em> gesetzt werden. Ist dies der Fall, so versucht DVB.NET erst gar nicht, einen eindeutigen Namen zu verwenden, sondern geht direkt auf die Anzeigenamen der Filter. Zusammen mit den in den anderen Artikeln beschriebenen Neuerung im Service Pack 2 greift diese Lösung in vielen Fällen. Zum einen sind Geräte mit gleichen Anzeigenamen zusätzlich durchnummeriert. Zum anderen erfolgt diese Nummerierung auf Basis der Gerätepfade, so dass insbesondere bei USB Geräten die Tuner und Capture Filter in der gleichen Reihenfolge angeordnet bleiben - der dritte Tuner Filter gehört zum dritten Capture Filter, man weiß halt nur nicht, zu welchem Gerät konkret. Dieses Verhalten muss zwar noch mit verschiedenen BDA Geräten verifiziert werden, scheint aber in der Tat DVB.NET an dieser Stelle zu helfen, mehrere gleichartige USB Geräte stabil zu verwalten.</p>
<p>So, das war erst einmal der letzte Artikel zu Thema - Rückfragen und Diskussionen bitte im <a href="http://www.watchersnet.de/tabid/52/g/topics/f/18/DVB-NET.aspx">Forum</a>.</p>
<p>Ciao</p>
<p>Jochen</p>
]]></content:encoded>
			<wfw:commentRss>http://jochen.jochen-manns.de/index.php/2011/02/17/arbeiten-mit-mindestens-zwei-gleichartigen-usb-geraten/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Nutzung mehrerer gleichartiger Geräte</title>
		<link>http://jochen.jochen-manns.de/index.php/2011/02/17/nutzung-mehrerer-gleichartiger-gerate/</link>
		<comments>http://jochen.jochen-manns.de/index.php/2011/02/17/nutzung-mehrerer-gleichartiger-gerate/#comments</comments>
		<pubDate>Thu, 17 Feb 2011 19:04:53 +0000</pubDate>
		<dc:creator>JMS</dc:creator>
		
		<category><![CDATA[DVB.NET]]></category>

		<category><![CDATA[VCR.NET]]></category>

		<guid isPermaLink="false">http://jochen.jochen-manns.de/index.php/2011/02/17/nutzung-mehrerer-gleichartiger-gerate/</guid>
		<description><![CDATA[(Dies ist ein Folgeartikel zu dieser Grundlagenbeschreibung)
In vielen Fällen ist es bei mehreren gleichartigen Geräten im System so, dass diese die gleichen BDA Anzeigenamen verwenden und so in der Auswahl nicht unterschieden werden können - das gilt sowohl für PCI als auch für USB basierte Hardware. Erschwerend kommt hinzu, dass im Allgemeinen passende Pärchen von [...]]]></description>
			<content:encoded><![CDATA[<p>(Dies ist ein Folgeartikel zu <a href="http://jochen.jochen-manns.de/index.php/2011/02/17/gerateauswahl-uber-die-bda-filter-tuner-und-capture/">dieser Grundlagenbeschreibung</a>)</p>
<p>In vielen Fällen ist es bei mehreren gleichartigen Geräten im System so, dass diese die gleichen BDA Anzeigenamen verwenden und so in der Auswahl nicht unterschieden werden können - das gilt sowohl für PCI als auch für USB basierte Hardware. Erschwerend kommt hinzu, dass im Allgemeinen passende Pärchen von Tuner und Capture Filter ausgewählt werden müssen. Hat man zwei Karten, so gibt es zwei mögliche Kombinationen zur Auswahl. Bei drei sind es schon 6, bei vier 24 und so weiter. Die schlechte Nachricht vorweg: die Auswahl der richtigen Kombination bleibt weiterhin dem Anwender überlassen. Sorry!</p>
<p>Immerhin gibt es seit Service Pack 2 eine leicht veränderte Anzeige zur Auswahl der Filter: DVB.NET fasst nun Geräte mit identischem Namen zusammen und sortiert diese nach dem zugehörigen Gerätepfad des Windows Gerätes (Device) - zur Erinnerung: dieses wird nun immer zu jedem Filter ermittelt. Gemäß dieser Sortierung erfolgt eine Nummerierung der Art (1), (2), etc., die zur Ergänzung der Anzeigenamen verwendet wird. Ändern sich die Gerätepfade nicht, so bleibt diese permanent stabil und eine gleiche Nummer bezeichnet auch das gleiche Gerät.</p>
<p>Was ist denn dann, wenn sich die Nummer doch ändert, etwa durch eine Treiberinstallation oder bei USB Geräten durch einen Neustart des Rechners, eventuell sogar einfach nur durch Vertauschen der USB Ports? Nun, DVB.NET hat dafür nicht wirklich eine Lösung. Aber vielleicht ist das für den Normalbetrieb auch gar nicht notwendig. Wenn mehrere Profile entsprechend konfiguriert sind und die eindeutigen Namen ändern sich, dann kann DVB.NET immer noch eine Auflösung über den Anzeigenamen samt Nummer versuchen. Nun die gute Nachricht: zumindest für USB Geräte (und scheinbar auch für einige PCI Geräte) haben die Gerätepfad für zusammengehörige Filterpaare eine gewisse Symmetrie. Die Sortierung wird vielleicht die Anzeigenamen (1) und (2) vertauschen, dies aber simultan für Tuner und Capture Filter. Oder kurz ausgedrückt: selbst bei einer Vertauschung hat man immer noch korrekt konfigurierte Profile, nur dass diese nun evtl. andere Geräte ansprechen - da dieser aber identisch sind, ist dies im realen Leben möglicherweise gar kein Problem.</p>
<p>Nun gut, zwei weitere Wermutstropfen gibt es noch - einer in einem Folgeartikel, der andere hier: die Nummerierung beginnt, wenn mindestens zwei Geräte mit gleichen Anzeigenamen vorhanden sind. Der Nummernzusatz hängt von der Anzahl der gleichartigen Geräte ab und ist bei bis zu 9 Geräten (1) bis (9) und dann (01) bis zur Anzahl der Geräte. Das bedeutet, dass der Sprung von einem zu zwei Geräten (und umgekehrt) sowie von 9 zu 10 (und umgekehrt) eine Neukonfiguration des Geräteprofils erforderlich machen kann - ich würde es zumindest empfehlen. Bei Verwendung ständig wechselnder USB Konfigurationen kann dies lästig werden. Sollte das tatsächlich mal ein Problem werden, denke ich darüber nach. Die Wahrscheinlichkeit ist aber nicht wirklich gigantisch&#8230;</p>
<p>Tschüss</p>
<p>Jochen</p>
]]></content:encoded>
			<wfw:commentRss>http://jochen.jochen-manns.de/index.php/2011/02/17/nutzung-mehrerer-gleichartiger-gerate/feed/</wfw:commentRss>
		</item>
		<item>
		<title>DVB Geräte mit nur einem Filter</title>
		<link>http://jochen.jochen-manns.de/index.php/2011/02/17/dvb-gerate-mit-nur-einem-filter/</link>
		<comments>http://jochen.jochen-manns.de/index.php/2011/02/17/dvb-gerate-mit-nur-einem-filter/#comments</comments>
		<pubDate>Thu, 17 Feb 2011 18:45:25 +0000</pubDate>
		<dc:creator>JMS</dc:creator>
		
		<category><![CDATA[DVB.NET]]></category>

		<category><![CDATA[VCR.NET]]></category>

		<guid isPermaLink="false">http://jochen.jochen-manns.de/index.php/2011/02/17/dvb-gerate-mit-nur-einem-filter/</guid>
		<description><![CDATA[(Dies ist ein Folgeartikel zu dieser Grundlagenbeschreibung)
Die Implementierung der BDA Anbindung in DVB.NET ist etwas eigenartig und kann einen Hinweis auf das geben, was ich in diesem Artikel kurz vorstellen möchte. Wenn der BDA Empfangsgraph aufgebaut wird, wird in diesem zuerst der im Geräteprofil konfigurierte Tuner Filter angelegt. Der Tuner wird allerdings nicht mit anderen [...]]]></description>
			<content:encoded><![CDATA[<p>(Dies ist ein Folgeartikel zu <a href="http://jochen.jochen-manns.de/index.php/2011/02/17/gerateauswahl-uber-die-bda-filter-tuner-und-capture/">dieser Grundlagenbeschreibung</a>)</p>
<p>Die Implementierung der BDA Anbindung in DVB.NET ist etwas eigenartig und kann einen Hinweis auf das geben, was ich in diesem Artikel kurz vorstellen möchte. Wenn der BDA Empfangsgraph aufgebaut wird, wird in diesem zuerst der im Geräteprofil konfigurierte Tuner Filter angelegt. Der Tuner wird allerdings nicht mit anderen Filtern verbunden. Anders als der Capture Filter, dessen Eingang zum Network Provider geht und an dessen Ausgang DVB.NET den (Transport Stream) Datenstrom abgreift. Der Tuner wird nun nur noch verwendet, um die Empfangsparamter festzulegen.</p>
<p>Ich war etwas überrascht, als ich ein Gerät in die Hand bekam, das tatsächlich nur einen Tuner Filter anbietet - so gesehen bei dem MSI DigiVox mini Deluxe DVB-T Stick. Schaut man sich die Implementierung an, so kann man zu der Ansicht kommen, dass tatsächlich einer der beiden Filter mehr oder weniger überflüssig ist - nur einer befindet sich im Datenfluss des DirectShow Graphen. Beginnend mit Service Pack 2 kommt DVB.NET zumindest mit der Situation klar, bei der es keinen Capture Filter gibt: hier wird nun der Tuner Filter zwischen Network Provider und Datenstromverbraucher geklemmt und parallel weiterhin zur Steuerung der Empfangsparameter verwendet.</p>
<p>Immer was Neues halt&#8230;</p>
<p>Jochen</p>
]]></content:encoded>
			<wfw:commentRss>http://jochen.jochen-manns.de/index.php/2011/02/17/dvb-gerate-mit-nur-einem-filter/feed/</wfw:commentRss>
		</item>
		<item>
		<title>BDA Filter ohne Namen</title>
		<link>http://jochen.jochen-manns.de/index.php/2011/02/17/bda-filter-ohne-namen/</link>
		<comments>http://jochen.jochen-manns.de/index.php/2011/02/17/bda-filter-ohne-namen/#comments</comments>
		<pubDate>Thu, 17 Feb 2011 18:37:13 +0000</pubDate>
		<dc:creator>JMS</dc:creator>
		
		<category><![CDATA[DVB.NET]]></category>

		<category><![CDATA[VCR.NET]]></category>

		<category><![CDATA[Allgemein]]></category>

		<guid isPermaLink="false">http://jochen.jochen-manns.de/index.php/2011/02/17/bda-filter-ohne-namen/</guid>
		<description><![CDATA[(Dies ist ein Folgeartikel zu dieser Grundlagenbeschreibung)
In den vorherigen Versionen von DVB.NET erfolgte die Auswahl der BDA Filter ausschließlich über die Anzeigenamen, die bei der BDA Registrierung hinterlegt wurden. Nun hat es sich aber gezeigt, dass es Geräte gibt, die einen solchen Namen gar nicht zur Verfügung stellen - gesehen beim Cinergy T-Stick MKII. 
Ab [...]]]></description>
			<content:encoded><![CDATA[<p>(Dies ist ein Folgeartikel zu <a href="http://jochen.jochen-manns.de/index.php/2011/02/17/gerateauswahl-uber-die-bda-filter-tuner-und-capture/">dieser Grundlagenbeschreibung</a>)</p>
<p>In den vorherigen Versionen von DVB.NET erfolgte die Auswahl der BDA Filter ausschließlich über die Anzeigenamen, die bei der BDA Registrierung hinterlegt wurden. Nun hat es sich aber gezeigt, dass es Geräte gibt, die einen solchen Namen gar nicht zur Verfügung stellen - gesehen beim Cinergy T-Stick MKII. </p>
<p>Ab Service Pack 2 ermittelt DVB.NET zu jedem BDA Filter grundsätzlich das zugehörige Windows Gerät (Device). Ist dem Filter kein registrierter Anzeigename zugeordnet, so wird der des Gerätes ermittelt - diesen gibt es wohl immer. Nun können auch Geräte mit diesem besonderen Verhalten ganz normal mit DVB.NET genutzt werden.</p>
<p>So long</p>
<p>Jochen</p>
]]></content:encoded>
			<wfw:commentRss>http://jochen.jochen-manns.de/index.php/2011/02/17/bda-filter-ohne-namen/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Geräteauswahl über die BDA Filter Tuner und Capture</title>
		<link>http://jochen.jochen-manns.de/index.php/2011/02/17/gerateauswahl-uber-die-bda-filter-tuner-und-capture/</link>
		<comments>http://jochen.jochen-manns.de/index.php/2011/02/17/gerateauswahl-uber-die-bda-filter-tuner-und-capture/#comments</comments>
		<pubDate>Thu, 17 Feb 2011 18:31:49 +0000</pubDate>
		<dc:creator>JMS</dc:creator>
		
		<category><![CDATA[DVB.NET]]></category>

		<category><![CDATA[VCR.NET]]></category>

		<guid isPermaLink="false">http://jochen.jochen-manns.de/index.php/2011/02/17/gerateauswahl-uber-die-bda-filter-tuner-und-capture/</guid>
		<description><![CDATA[Im Service Pack 2 von DVB.NET / VCR.NET 3.9 wird es einige eigentlich kleinere Erweiterungen im Bereich der Geräteauswahl geben - ich habe gerade einen Release Candidate 10 in den Beta Bereich geladen, in dem diese am Anfang des Testzyklus schon einmal drin sind. Ich will in einigen Folgeartikeln diese Erweiterungen kurz beschreiben, dachte mir [...]]]></description>
			<content:encoded><![CDATA[<p>Im Service Pack 2 von DVB.NET / VCR.NET 3.9 wird es einige eigentlich kleinere Erweiterungen im Bereich der Geräteauswahl geben - ich habe gerade einen Release Candidate 10 in den Beta Bereich geladen, in dem diese am Anfang des Testzyklus schon einmal drin sind. Ich will in einigen Folgeartikeln diese Erweiterungen kurz beschreiben, dachte mir aber, ein bisschen Hintergrundinformationen wären nützlich. Tja, das wäre dann das, was nun kommt.</p>
<p>Als DVB.NET vor langer Zeit um die Möglichkeit erweitert wurde, grundsätzlich beliebige BDA DVB Geräte zu nutzen, wurde zur Festlegung der zu verwendende Hardware bestimmt, dass eine Kombination von Tuner und Capture Filter ausgewählt werden musste. Ohne auf die volle Historie einzugehen, hier die aktuelle Implementierung in der Grundfassung - auf einige Feinheiten und -einstellungen gehe ich in den späteren Artikeln ein.</p>
<p>Dem Anwender werden die Filter jeweils einer Art als Liste angeboten. Diese Liste zeigt die Namen, wie sie in der BDA Registrierung hinterlegt wurden. Zusätzlich merkt sich DVB.NET bei einer Auswahl aber auch den eindeutigen Namen (BDA Moniker) - der Grund für dieses Verhalten wird später in dem Artikel deutlicher, in dem es um den Einsatz mehrerer gleichartiger Geräte in einem Rechner geht. </p>
<p>Wenn das Gerät später einmal benötigt wird, versucht DVB.NET dieses zuerst über den kryptischen (i.e. maschinen- aber weniger menschenlesbar) eindeutigen Namen zu ermitteln. Bei PCI Geräten ändert sich dieser im Allgemeinen erst, wenn eine neue Treiberversion installiert wird - dann auch nicht immer. DVB.NET erkennt diese Situation und fällt dann auf die Suche nach dem Anzeigenamen zurück. Dieser Mechanismus funktioniert eigentlich sehr gut, wenn man nur eine Karte einsetzt. Lediglich wenn eine neue Treiberversion auch einen neuen Anzeigenamen vergibt ist DVB.NET verloren - auch diese Situation habe ich schon erlebt. Hier hilft nur, im Geräteprofil die Auswahl des Gerätes zu erneuern.</p>
<p>Grundsätzlich empfehle ich, nach einer Aktualisierung der Gerätetreiber im Adminwerkzeug vorbeizuschauen und die Filter einmal neu auszuwählen - erst verwerfen und dann neu aus der Liste auswählen. Aber wie gesagt: eine vollständige Änderung ist selten und so oft gibt es ja auch keine neuen Treiberversionen.</p>
<p>So, das waren die Grundlagen. Jetzt geht es in den nächsten Kapiteln an die besonderen Spielchen der Hersteller - ich versuche, mich dabei immer auf ein Thema zu beschränken, also lieber einen Artikel mehr als zu viel Text in einem.</p>
<p>Jochen</p>
]]></content:encoded>
			<wfw:commentRss>http://jochen.jochen-manns.de/index.php/2011/02/17/gerateauswahl-uber-die-bda-filter-tuner-und-capture/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Mal was ganz anderes - Zeitreise&#8230;</title>
		<link>http://jochen.jochen-manns.de/index.php/2011/02/09/mal-was-ganz-anderes-zeitreise/</link>
		<comments>http://jochen.jochen-manns.de/index.php/2011/02/09/mal-was-ganz-anderes-zeitreise/#comments</comments>
		<pubDate>Wed, 09 Feb 2011 10:48:02 +0000</pubDate>
		<dc:creator>JMS</dc:creator>
		
		<category><![CDATA[.NET]]></category>

		<category><![CDATA[Software]]></category>

		<category><![CDATA[Allgemein]]></category>

		<guid isPermaLink="false">http://jochen.jochen-manns.de/index.php/2011/02/09/mal-was-ganz-anderes-zeitreise/</guid>
		<description><![CDATA[Mein Sohn hat hier zwei LEGO Spybotics herumstehen, eine Abart der ersten Mindstorms Generation. Im Internet gibt es zwar ein paar gute Seiten dazu, aber im Wesentlichen ist die Zeit definitv vorbei (ich schätze mal so seit deutlich über 5 Jahren). Wie dem auch sei: zum Herumspielen, Lernen und vielleicht Einstieg in die Programmierung (von [...]]]></description>
			<content:encoded><![CDATA[<p>Mein Sohn hat hier zwei LEGO Spybotics herumstehen, eine Abart der ersten Mindstorms Generation. Im Internet gibt es zwar ein paar gute Seiten dazu, aber im Wesentlichen ist die Zeit definitv vorbei (ich schätze mal so seit deutlich über 5 Jahren). Wie dem auch sei: zum Herumspielen, Lernen und vielleicht Einstieg in die Programmierung (von Robotern und Allgemein) ganz gut.</p>
<p>Ich habe mir daher mal einige Unterlagen zusammen gesucht (vor allem über <a href="http://users.ncable.net.au/~blane/smartParts/">diesen Einstieg</a>) sowie das alte Mindstorms SDK von Lego installiert. Da ich aber immer auch daran interessiert bin, die Dinge hinter der Fassade zu verstehen, habe ich auf Basis der LASM Dokumentation begonnen, einen Disassembler für Spybotics Programme zu schreiben. Dieser erlaubt es, das aktuelle Programm (die aktuelle Mission) im dem Spybotic anzuschauen (egal, ob eine der vorderfinierten Missionen, eine mit der beliegenden Software erstellen Mission oder ein völlig eigenständiges Programm, das man etwa mit BrickCC zusammengestellt hat). Das sieht dann etwa so aus (hier eigene Spielereien):</p>
<p><a href='http://jochen.jochen-manns.de/__oneclick_uploads/2011/02/spy1.jpg' title='spy1.jpg'><img src='http://jochen.jochen-manns.de/__oneclick_uploads/2011/02/spy1.thumbnail.jpg' alt='spy1.jpg' border=0 /></a></p>
<p>Das Programm ist alles andere als fertig und hängt sich am und an und vor allem beim Beenden auch mal auf (ich glaube aber, dass die Ursache dabei die COM Schnittstellenbibliothek ist, die mit dem SDK kommt). Aber wen&#8217;s interessiert, <a href="http://downloads.psimarron.net/SpyTheSpy.msi">hier ein Setup</a> für Windows (ich habe es unter Vista eingesetzt). Man braucht natürlich mindestens einen Spybotic am besten mit funktionierender Originalanwendung (inklusive dem seriellen Anschluss), die COM Schnittstellenbibliothek aus dem SDK (am besten einfach das ganze SDK installieren) und Microsoft .NET 4.0 (Client Profile). Die Installation enthält auch die Quelltexte auf Basis von Visual Studio 2010, alle Quellen sind (wie von dieser Seite vermutlich schon gewohnt) in C#. Benutzung selbstverständlich völlig ohne Gewähr&#8230;</p>
<p>Bin ja mal gespannt, ob noch jemand an so altem Kram interessiert ist&#8230;</p>
<p>Jochen</p>
]]></content:encoded>
			<wfw:commentRss>http://jochen.jochen-manns.de/index.php/2011/02/09/mal-was-ganz-anderes-zeitreise/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Performance von Schnittstellen in .NET - aka The Good, The Bad and The Ugly :-)</title>
		<link>http://jochen.jochen-manns.de/index.php/2011/02/05/performance-von-schnittstellen-in-net-aka-the-good-the-bad-and-the-ugly/</link>
		<comments>http://jochen.jochen-manns.de/index.php/2011/02/05/performance-von-schnittstellen-in-net-aka-the-good-the-bad-and-the-ugly/#comments</comments>
		<pubDate>Sat, 05 Feb 2011 11:26:33 +0000</pubDate>
		<dc:creator>JMS</dc:creator>
		
		<category><![CDATA[.NET]]></category>

		<guid isPermaLink="false">http://jochen.jochen-manns.de/index.php/2011/02/05/performance-von-schnittstellen-in-net-aka-the-good-the-bad-and-the-ugly/</guid>
		<description><![CDATA[Reduziert auf ein ganz triviales Beispiel zeigt sich ein erhebliches Problem in der Art, wie .NET den Zugriff über Schnittstellen in nativen Code umsetzt - zumindest im normalen JIT Modus und in .NET 2.0 / 4.0. In einer Bibliothek befindet sich ein ganz harmlos ausschauender Code:
public static class Summer
{
    public static long [...]]]></description>
			<content:encoded><![CDATA[<p>Reduziert auf ein ganz triviales Beispiel zeigt sich ein erhebliches Problem in der Art, wie .NET den Zugriff über Schnittstellen in nativen Code umsetzt - zumindest im normalen JIT Modus und in .NET 2.0 / 4.0. In einer Bibliothek befindet sich ein ganz harmlos ausschauender Code:</p>
<p><code>public static class Summer<br />
{<br />
    public static long Sum( IEnumerable<long> summer )<br />
    {<br />
        if (summer == null)<br />
            return 0;</p>
<p>        long res = 0;</p>
<p>        using (var e = summer.GetEnumerator())<br />
            while (e.MoveNext())<br />
                res += e.Current;</p>
<p>        return res;<br />
    }<br />
}</code></p>
<p>Dieser Code wird von einem Testprogramm mit verschiedenen Parametern aufgerufen:</p>
<p><code>const int n = 10000000;</p>
<p>var all = Enumerable.Range( 0, n ).Select( i => (long) i );</p>
<p>var asArray = all.ToArray();<br />
var asList = all.ToList();<br />
var asHash = new HashSet<long>( all );</code></p>
<p>Dass die ermittelten Laufzeiten unterschiedlich sind (104 Millisekunden für das Feld, 123 für die Liste und 155 für den HashSet auf meinem x86 Vista) ist in Ordnung und ohne Relevanz. Was aber erst einmal extrem überrascht ist folgendes: diese Zeiten ergeben sich, wenn man im Testprogramm immer genau eine der Implementierungen verwendet. Werden alle drei hintereinander in die Methode der Bibliothek geschickt (etwa erst Feld, dann Liste, dann HashSet), so zeigt sich ein erheblicher Unterschied.</p>
<p>Wird das Feld als <strong>erstes</strong> verwendet, so ist die Laufzeit weiterhin 104ms. Wird allerdings eine beliebige andere Liste <strong>vorher</strong> aufgerufen, so landen wir plötzlich bei 170ms - das ist 63% mehr! Bei Liste und HashSet sind es immerhin noch 33% (123ms auf 175ms respektive 155ms auf 206ms). Wie kann so etwas sein? Es wird doch immer der selbe Code ausgeführt?</p>
<p>Die Antwort findet sich <a href="http://www.koders.com/cpp/fid09F7648B5E0B3ACD4EB74391475A49ECF538DABC.aspx?s=CmpXchgOps">in diesem Quellcode von Microsoft</a>. Im Endeffekt läuft es auf folgendes hinaus: wenn eine Methode einer Schnittstelle aufgerufen wird, so muss .NET herausfinden, welche Klassenmethode tatsächlich dazu gehört - dazu im Anhang ein kleiner Exkurs in die Legacy Welt von COM und MFC. Der JITter erzeugt nun für jede Methode jeder Schnittstelle ein spezielles Stück Code. Dieser Code ermittelt die Objektinstanz zur Klasse und darüber ein weiteres dynamisch erzeugtes Codefragment, das zur korrekten Methode in der Klasse verzweigt. Das Nachschlagen von Klasse zu letzterem Codefragment geschieht über eine Hashtable (mit 4096 Einträgen). Ist beim ersten Aufruf ein solcher Eintrag nicht vorhanden, so wird er automatisch erzeugt.</p>
<p>Da diese Nachschlageoperation selbst bei vorhandenem Eintrag in der Hashtable teuer ist, verwendet .NET einen kleinen Trick: der erste erzeugte Eintrag wird statisch geprüft. Ein direkter Vergleich auf die Klasse führt direkt zur Umlenkung. Daher der beobachtete Effekt, dass jeweils der erste Aufruf in Normalzeit abläuft und lediglich die Schnittstellen auf andere Klassen verzögert werden.</p>
<p>Leider ist das noch nicht die ganze Wahrheit, denn .NET verwendet eine Optimierung: wenn bei einem Aufruf <strong>nicht</strong> diese erste Schnittstelle verwendet wird, so wird ein Zähler verändert. Nach etwa 100 Fehlversuchen wird dann die Prüfung auf die erste Schnittstelle umgangen und direkt auf die Nachschlageoperation der Hashtabelle verwiesen. Würde man im Beispiel also etwa die Sequenz Feld, Liste, HashSet, Feld verwenden, so wäre bei der zweiten Nutzung des Feldes auch hier wieder die Verlangsamung zu beobachten. Wohlgemerkt: zwei identische Aufrufe unterscheiden sich in der Laufzeit um 63% - reproduzierbar!</p>
<p>Richtig kritisch würde es, wenn eine ständige Hash Kollision entstehen würde, da dann der Eintrag der Hashtabelle ständig neu ermittelt werden müßte. Bei 4096 Einträgen nicht wirklich wahrscheinlich, oder? Nun, der Effekt tritt natürlich nur in Szenarien auf, in denen die neben dem Aufruf der Schnittstellenmethoden (hier MoveNext und Current) sehr wenig anderes gemacht wird. In diesem Sinne ist das Beispiel natürlich gemein - aber sicher nicht exotisch! Ich würde sogar soweit gehen, dieses <em>Feature</em> als einen <em>LINQ Killer</em> zu bezeichnen. Gerade bei Verwendung von LINQ werden Schnittstellenmethoden in extremster Weise wiederverwendet und LINQ Operationen dadurch langsamer als nötig - vermutlich im Normalfall unmerklich. Ich habe mir jetzt nicht die Mühe gemacht alle Kommentare von Microsoft im obigen Source Code zu prüfen, aber es kann sein, dass diese Verwaltung mindestens Thread-übergreifen evtl. aber sogar für alle AppDomains in einem Prozess gemeinsam erfolgt. Hier könnte es zu unerwünschten Seiteneffekten durch völlig anderen Code kommen - etwa mehrere virtuelle Verzeichnisse in einem IIS Application Pool.</p>
<p>Soweit dazu</p>
<p>Jochen</p>
<p><strong>Nun der versprochene Exkurs COM / MFC</strong>: programmiert man COM Objekte in C++ mit MFC / ATL, so können diese mehrere Schnittstellen unterstützen. Eine COM Schnittstelle wird dabei im Allgemeinen (Ausnahmen bestätigen die Regeln) als innere Klassen implementiert. Ein Aufruf auf eine Schnittstellenmethode erfolgt de facto mit einem für diese innere Klasse und damit Schnittstelle individuellen this Zeiger. Alle Schnittstellenmethoden wissen dies aber und korrigieren den Zeiger entsprechend - gemäß dem Offset der inneren Klasse in dem COM Objekt. Mit diesem veränderten this Zeiger kann dann transparent ein Aufruf einer Methode der eigentlichen Klasse erfolgen. Der Unterschied zu .NET ist allerdings, dass nun ein Zeiger auf eine Schnittstelle nicht mehr einfach mit einem Zeiger auf eine andere Klasse oder das COM Objekt verglichen werden kann (== aka ReferenceEquals) um festzustellen, dass tatsächlich mit einer identischen Objektinstanz gearbeitet wird. COM hat dazu eine einfache, aber nicht ganz billige Regel: zum Vergleich muss zwingend ein QueryInterface auf die IUnknown Schnittstelle herangezogen werden.</p>
<p>.NET hat das Problem anders gelöst und wohl die Prämisse gesetzt, dass der this Zeiger bei jedem Aufruf jeder Schnittstellenmethode identisch zur Objektreferenz sein muss. Die COM / MFC / ATL Codefragmente, die bei C++ der Compiler erzeugt, muss nun der JITter anlegen - mit den beschriebenen Nachteilen. Schön ist, dass man nun kein QueryInterface für ReferenceEquals / == braucht. Ich halte diesen Ansatz aber für extrem bedenklich und würde (wäre ich bei Microsoft für diesen .NET Teil zuständig, was ich glücklicherweise nicht bin) über einen BSTR artigen Ansatz nachdenken. Die Idee läßt sich wie folgt beschreiben: jede Schnittstelle zeigt auf eine eigene kleine Implementierung, bei der eine COM / MFC / ATL ähnliche Umsetzung erfolgt. Diese Umsetzung kann einmalig vom JITter für jede Schnittstelle jeder Klasse erstellt werden - wir sind dann weg von den Methodenaufrufen! Zu jeder Objektinstanz im Speicher wird <strong>vor</strong> den heutigen Objektdaten ein Zeiger auf die primäre Instanz (der Klasse) festgehalten - bei Verwendung der primären Klassenschnittstelle wäre dies dann genau der this Zeiger selbst. Ein ReferenceEquals müßte dann allerdings für beide Objekte eine zusätzlichen Speicherzugriff ausführen, bevor ein Vergleich stattfinden kann. Und jede Objektinstanz würde 4 / 8 Bytes größer. Schaue ich mir aber den heutigen Effekt und die Forcierung von LINQ an, scheint es mir durchaus wert, diese Richtung nicht von vorneherein auszuschliessen - mal unabhängig davon, dass ich natürlich nur die Spitze des Eisbergs sehe und es viele .NET Interna geben kann, die eine solche Implementierung grundsätzlich ausschließen.</p>
]]></content:encoded>
			<wfw:commentRss>http://jochen.jochen-manns.de/index.php/2011/02/05/performance-von-schnittstellen-in-net-aka-the-good-the-bad-and-the-ugly/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Ein weiteres DVB.NET 3.9 Beispielprogramm</title>
		<link>http://jochen.jochen-manns.de/index.php/2011/01/19/ein-weiteres-dvbnet-39-beispielprogramm/</link>
		<comments>http://jochen.jochen-manns.de/index.php/2011/01/19/ein-weiteres-dvbnet-39-beispielprogramm/#comments</comments>
		<pubDate>Tue, 18 Jan 2011 23:46:25 +0000</pubDate>
		<dc:creator>JMS</dc:creator>
		
		<category><![CDATA[DVB.NET]]></category>

		<guid isPermaLink="false">http://jochen.jochen-manns.de/index.php/2011/01/19/ein-weiteres-dvbnet-39-beispielprogramm/</guid>
		<description><![CDATA[Dieses Beispielprogramm für DVB.NET 3.9 zeigt einige elementare Zugriffe auf ein Geräteprofil zum Empfang von Bild, Ton und Videotext. Ich habe es mit einigen Kommentaren im Programmcode versehen, so dass ich mir hier eine weitere Erläuterung erspare.
Viel Spaß
Jochen
]]></description>
			<content:encoded><![CDATA[<p><a href="http://sources.psimarron.net/Evaluations/DVB.NET%20Beispiel%20mit%20VideoText/">Dieses Beispielprogramm</a> für DVB.NET 3.9 zeigt einige elementare Zugriffe auf ein Geräteprofil zum Empfang von Bild, Ton und Videotext. Ich habe es mit einigen Kommentaren im Programmcode versehen, so dass ich mir hier eine weitere Erläuterung erspare.</p>
<p>Viel Spaß</p>
<p>Jochen</p>
]]></content:encoded>
			<wfw:commentRss>http://jochen.jochen-manns.de/index.php/2011/01/19/ein-weiteres-dvbnet-39-beispielprogramm/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Ein erfolgreiches neues Jahr 2011</title>
		<link>http://jochen.jochen-manns.de/index.php/2011/01/01/ein-erfolgreiches-neues-jahr-2011/</link>
		<comments>http://jochen.jochen-manns.de/index.php/2011/01/01/ein-erfolgreiches-neues-jahr-2011/#comments</comments>
		<pubDate>Sat, 01 Jan 2011 10:20:29 +0000</pubDate>
		<dc:creator>JMS</dc:creator>
		
		<category><![CDATA[Allgemein]]></category>

		<guid isPermaLink="false">http://jochen.jochen-manns.de/index.php/2011/01/01/ein-erfolgreiches-neues-jahr-2011/</guid>
		<description><![CDATA[Wünsche ich allen, die sich auf diese Seiten verirren  
Jochen
]]></description>
			<content:encoded><![CDATA[<p>Wünsche ich allen, die sich auf diese Seiten verirren <img src='http://jochen.jochen-manns.de/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Jochen</p>
]]></content:encoded>
			<wfw:commentRss>http://jochen.jochen-manns.de/index.php/2011/01/01/ein-erfolgreiches-neues-jahr-2011/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Spielen mit Logikgattern</title>
		<link>http://jochen.jochen-manns.de/index.php/2010/10/13/spielen-mit-logikgattern/</link>
		<comments>http://jochen.jochen-manns.de/index.php/2010/10/13/spielen-mit-logikgattern/#comments</comments>
		<pubDate>Wed, 13 Oct 2010 19:59:34 +0000</pubDate>
		<dc:creator>JMS</dc:creator>
		
		<category><![CDATA[Silverlight]]></category>

		<guid isPermaLink="false">http://jochen.jochen-manns.de/index.php/2010/10/13/spielen-mit-logikgattern/</guid>
		<description><![CDATA[Bei meiner weiteren Einarbeitung in Silverlight 4 habe ich ein kleines Spielzeug gebastelt, mit dem man sich die Funktionalitäten von Logikgattern anschauen kann. Etwas wirklich Sinnvolles macht das Progrämmchen nicht und schon bei getackteten FlipFlops würde es gnadenlos scheitern. Aber es simuliert zumindest einfache statische Schaltungen - wenn man auf allzuviele Tricks verzichtet.

Man kann es [...]]]></description>
			<content:encoded><![CDATA[<p>Bei meiner weiteren Einarbeitung in Silverlight 4 habe ich ein kleines Spielzeug gebastelt, mit dem man sich die Funktionalitäten von <a href="http://de.wikipedia.org/wiki/Logikgatter">Logikgattern</a> anschauen kann. Etwas wirklich Sinnvolles macht das Progrämmchen nicht und schon bei getackteten FlipFlops würde es gnadenlos scheitern. Aber es simuliert zumindest einfache statische Schaltungen - wenn man auf allzuviele Tricks verzichtet.</p>
<p><a href='http://jochen.jochen-manns.de/__oneclick_uploads/2010/10/logicgame.jpg' title='So sieht das dann aus'><img border="0" src='http://jochen.jochen-manns.de/__oneclick_uploads/2010/10/logicgame.thumbnail.jpg' alt='So sieht das dann aus' /></a></p>
<p>Man kann es sich natürlich auch <a href="http://downloads.psimarron.net/Silverlight/LogikBausteine/start.html">Online</a> abschauen (na gut: eine Bedienungsanleitung gibt es nicht und ohne wird es schwer) und den <a href="http://downloads.psimarron.net/Silverlight/LogikBausteine/QuellCode.zip">Quellcode</a> gibt es selbstverständlich auch. Meine Lerneffekte waren so in etwa:</p>
<p>* Darstellen der Bausteine auf Basis eines einzigen Controls über verschiedene Styles.<br />
* Arbeiten mit ContentTemplates und dynamischen Elementen darin.<br />
* Lokalisieren von Elementen über TransformToVisual / TransformBounds.<br />
* Einsatz der Viewbox zur sauberen Skalierung von freien Zeichnungen (der Gattern) in die gewünschten Bereiche.<br />
* Drucken und dabei Skalieren mit der Viewbox sowie das Kennenlernen einiger UpdateLayout Fallstricke.<br />
* Speichern in und Laden aus Dateien im lokalen Dateisystem und mehr UpdateLayout Fallstricke.<br />
* Speichern in und Laden aus dem IsolatedStorage sowie Zugriff auf diesen inkl. Löschen - ok, das ist nun wirklich nichts Wildes.<br />
* Einsatz eines Canvas als Overlay zur Annotationen - hier die Verbindungen von Aus- und Eingängen.<br />
* Ein bißchen über Styles und was sie nicht können.</p>
<p>Viel Spaß</p>
<p>Jochen</p>
]]></content:encoded>
			<wfw:commentRss>http://jochen.jochen-manns.de/index.php/2010/10/13/spielen-mit-logikgattern/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Silverlight 4 unter XP: kleines Ups bei String.IndexOf</title>
		<link>http://jochen.jochen-manns.de/index.php/2010/09/29/silverlight-4-unter-xp-kleines-ups-bei-stringindexof/</link>
		<comments>http://jochen.jochen-manns.de/index.php/2010/09/29/silverlight-4-unter-xp-kleines-ups-bei-stringindexof/#comments</comments>
		<pubDate>Wed, 29 Sep 2010 12:20:40 +0000</pubDate>
		<dc:creator>JMS</dc:creator>
		
		<category><![CDATA[Silverlight]]></category>

		<guid isPermaLink="false">http://jochen.jochen-manns.de/index.php/2010/09/29/silverlight-4-unter-xp-kleines-ups-bei-stringindexof/</guid>
		<description><![CDATA[In einer Lösung werden auf eine Benutzereingabe hin ca. 10.000 (eher weniger) Zeichenketten (einige kurz, einige länger, aber im Mittel sicher nicht mehr als 200 Zeichen) darauf untersucht, ob sie eine andere Zeichenkette (im Beispiel 7 Zeichen) enthalten. Dazu wird String.IndexOf verwendet. Unter Vista geht das so schnell, dass man praktisch keine Verzögerung zwischen Beginn [...]]]></description>
			<content:encoded><![CDATA[<p>In einer Lösung werden auf eine Benutzereingabe hin ca. 10.000 (eher weniger) Zeichenketten (einige kurz, einige länger, aber im Mittel sicher nicht mehr als 200 Zeichen) darauf untersucht, ob sie eine andere Zeichenkette (im Beispiel 7 Zeichen) enthalten. Dazu wird String.IndexOf verwendet. Unter Vista geht das so schnell, dass man praktisch keine Verzögerung zwischen Beginn der Suche und dem Ergebnis sieht - daher hatte ich für den einfachen Test auch nicht nach eleganteren Möglichkeiten der Suche Ausschau gehalten. Bei gleicher Hardware unter XP dauert die Operation insgesamt aber etwa 30 (!!!) Sekunden - ich schätze mal, mindestens ein Faktor 100 langsamer.</p>
<p>Um auszuschliessen, dass es an den Daten liegt, habe ich das IndexOf naiv über ToCharArray() und einen wirklich primitiven Suchlauf gemacht - einfacher geht es nicht: erstes Zeichen des Suchbegriffs suchen und schauen, ob die Folgezeichen stimmen und wenn nicht ein Zeichen weiter neu suchen etc. Schlechter kann die Silverlight Implementierung eigentlich nicht sein - ist sie aber: hier gibt es nun auch unter XP keine Verzögerung mehr!</p>
<p>Dies als kleine Warnung: selbst auf Microsoft Plattformen scheint Silverlight nicht so furchtbar plattformunabhängig zu sein und hier geht es um eine primitive Laufzeitmethode!</p>
<p>Jochen</p>
<p>PS: Habe ich wohl nicht ausreichend respektive falsch recherchiert, ist ja schon länger <a href="http://forums.silverlight.net/forums/p/191537/442230.aspx">bekannt</a>. Sorry!</p>
]]></content:encoded>
			<wfw:commentRss>http://jochen.jochen-manns.de/index.php/2010/09/29/silverlight-4-unter-xp-kleines-ups-bei-stringindexof/feed/</wfw:commentRss>
		</item>
		<item>
		<title>VCR.NET goes Silverlight?</title>
		<link>http://jochen.jochen-manns.de/index.php/2010/09/29/vcrnet-goes-silverlight/</link>
		<comments>http://jochen.jochen-manns.de/index.php/2010/09/29/vcrnet-goes-silverlight/#comments</comments>
		<pubDate>Wed, 29 Sep 2010 09:54:47 +0000</pubDate>
		<dc:creator>JMS</dc:creator>
		
		<category><![CDATA[Silverlight]]></category>

		<category><![CDATA[VCR.NET]]></category>

		<guid isPermaLink="false">http://jochen.jochen-manns.de/index.php/2010/09/29/vcrnet-goes-silverlight/</guid>
		<description><![CDATA[Nein, nicht wirklich. Aber da ich mich in Silverlight 4 einarbeiten wollte, um einige Konzepte zu verstehen, habe ich mir als lebendes Beispiel VCR.NET ausgesucht. Nutzbar ist das Ergebnis wohl nur in einem sehr engen Rahmen, da es wirklich nur eine technische Studie vor dem Hintergrund eines knappen Zeitbudgets ist. Aber wer mal reinschauen möchte, [...]]]></description>
			<content:encoded><![CDATA[<p>Nein, nicht wirklich. Aber da ich mich in Silverlight 4 einarbeiten wollte, um einige Konzepte zu verstehen, habe ich mir als lebendes Beispiel VCR.NET ausgesucht. Nutzbar ist das Ergebnis wohl nur in einem sehr engen Rahmen, da es wirklich nur eine technische Studie vor dem Hintergrund eines knappen Zeitbudgets ist. Aber wer mal reinschauen möchte, kann sich die beiden Dateien <a href="http://www.watchersnet.de/Downloads/tabid/53/rrcid/55/rrscid/0/rreid/403/rrpid/1/rrepp/10/Default.aspx">von hier</a> in sein VCR.NET Installationsverzeichnis kopieren, der Aufruf erfolgt mittels http://localhost/VCR.NET/Silverlight.html - Silverlight 4 muss natürlich lokal installiert sein. Die Quellen sind wie gewohnt <a href="http://sources.psimarron.net/VCR.NET/Silverlight/">öffentlich verfügbar</a>. Die Nutzung erfolgt ohne Gewähr, ich hatte keine Zeit, alle technischen VCR.NET Aspekte bis auf&#8217;s Letzte zu prüfen - ich werde den Client jetzt mal für das nutzen, was er kann und evtl. einen Update nachschieben. Die Studie versteht sich als solche und wird nicht Teil der nächsten VCR.NET Version sein.</p>
<p>Hier einfach so ein paar Aspekte des Clients in bunt gewürfelter Reihenfolge - Silverlight, VCR.NET, Technik, &#8230;
<ul>
<li>* Ein definiertes Ziel war es, im Oberflächenbereich soviel wie möglich auf XAML zu setzen und so wenig wie möglich Code zu schreiben. Das ist nur zum Teil gelungen, da vor allem die Programmzeitschrift doch einiges an Logik erfordert.</li>
<li>* Als nützlich hat sich die gemischte Nutzung von vordefinierten (App.xaml) und programmatischen (App.Resources) Ressourcen erwiesen. Es scheint allerdings etwas kniffeliger zu sein, letztere in der Startphase zur Nutzung in XAML zur Verfügung zu stellen</li>
<li>* Bei den Einstellungen habe ich ein wenig mit den Formularmöglichkeiten herumgespielt, etwa mit der Validierungsinfrastruktur oder dem praktischen Label Control.</li>
<li>* Grundsätzlich sollte alles für eine einfache Übersetzung in andere Sprachen (Lokalisierung) vorbereitet sein.</li>
<li>* Auf Deployment Techniken wie Bibliotheken bin ich bewußt nicht eingegangen.</li>
<li>* Einer der zwei wichtigen Aspekte der Studie ist die Programmzeitschrift mit ihren Filtermöglichkeiten. Hier gab es einige Ärgernisse von Silverlight vs. WPF zu ignorieren (in einer ComboBox kann man ohne weiteren Code nicht über Tasteneingaben auswählen) oder zu umgehen (die Gruppierung der Ergebnisliste nach Tag und Stunde - Gruppierungen kennt in Silverlight erst einmal nur das DataGrid). Ganz nett war es zu sehen, wie einfach man aus einem ItemsControl eine Art ListBox machen kann, die ein Auswahlfeedback bietet.</li>
<li>* Die Liste der geplanten Aufzeichnungen ist eher langweilig, hier habe ich ein bißchen mit dem DataGrid experimentiert. Ganz interessant ist die Detailanzeige von Mehrkanalaufzeichnungen, die sich auf die Ausawhl einer Aufzeichnung öffnet. Hier sind man genau, welche anderen Aufzeichnungen verhindert oder parallel aufgezeichnet werden.</li>
<li>* Meine erste Aktion war der Navigationsknopf zum Blättern, der optisch ein wenig (nicht mehr) hermachen sollte. Er blendet sich auch fast vollständig aus, wenn die Maus nicht gerade auf ihm steht.</li>
<li>* Die Animation beim Blättern ist ein reiner Test - vermutlich in der Praxis eher nervig.</li>
<li>* Es werden auch die laufenden Aufzeichnungen angezeigt. Hier war aber die Zeit zu Ende und außer genau der Anzeige kann man nicht viel machen.</li>
<li>* Im XAML wird an vielen Stellen mit Konvertern (IValueConverter) gearbeitet, vor allem zur Anzeige von Uhrzeiten (VCR.NET verwendet grundsätzlich GMT / UTC und nicht die lokale Zeitzone) oder der Auswahl von Symbolen. Richtig eingesetzt sind Konverter trotz einfachster Codierung offenbar eine starke Waffe zur Unterstützung der Dynamik - man siehe auch diesen <a href="http://jochen.jochen-manns.de/index.php/2010/09/25/silverlight-listbox-mit-kontextabhangigem-itemtemplate/">Artikel</a>.</li>
<li>* Die Trennung zwischen Layout und Inhalt ist sicher noch unzureichend. Zwar habe ich viel auf Styles gesetzt, aber enthalten diese dann doch zum Teil wieder Bezüge zu ihrer Umgebung - unschön, das geht sicher auch professioneller.</li>
<li>* Beim Anbindung des SOAP Web Services vom VCR.NET hat es sich als nützlich erwiesen, dass alle generierten Klassen partial sind. So konnte etwa das EPGEvent so erweitert werden, dass neu hinzugefügte Eigenschaften direkt in XAML Bindings referenzierbar sind.</li>
</ul>
<p>Ok, das war sicher nicht alles, muss aber für jetzt reichen!</p>
<p>Viel Spaß</p>
<p>Jochen</p>
]]></content:encoded>
			<wfw:commentRss>http://jochen.jochen-manns.de/index.php/2010/09/29/vcrnet-goes-silverlight/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Silverlight ListBox mit kontextabhängigem ItemTemplate</title>
		<link>http://jochen.jochen-manns.de/index.php/2010/09/25/silverlight-listbox-mit-kontextabhangigem-itemtemplate/</link>
		<comments>http://jochen.jochen-manns.de/index.php/2010/09/25/silverlight-listbox-mit-kontextabhangigem-itemtemplate/#comments</comments>
		<pubDate>Sat, 25 Sep 2010 10:49:11 +0000</pubDate>
		<dc:creator>JMS</dc:creator>
		
		<category><![CDATA[Silverlight]]></category>

		<guid isPermaLink="false">http://jochen.jochen-manns.de/index.php/2010/09/25/silverlight-listbox-mit-kontextabhangigem-itemtemplate/</guid>
		<description><![CDATA[In einer ListBox von Silverlight 4 sollen .NET Objekte dargestellt werden, die zwar einer gemeinsamen Basisklasse angehören, individuell aber unterschiedliche Ausprägungen haben - im Beispiel habe ich mal eine abstrakte Basisklasse Animal (Tier) genommen und davon Insect (Insekten), Mammal (Säugetiere) und Bird (Vögel) abgeleitet. Im realen Leben soll die ListBox für die unterschiedlichen konkreten Klassen [...]]]></description>
			<content:encoded><![CDATA[<p>In einer ListBox von Silverlight 4 sollen .NET Objekte dargestellt werden, die zwar einer gemeinsamen Basisklasse angehören, individuell aber unterschiedliche Ausprägungen haben - im Beispiel habe ich mal eine abstrakte Basisklasse Animal (Tier) genommen und davon Insect (Insekten), Mammal (Säugetiere) und Bird (Vögel) abgeleitet. Im realen Leben soll die ListBox für die unterschiedlichen konkreten Klassen völlig unterschiedliche Darstellungen verwenden. Im <a href="http://downloads.psimarron.net/Silverlight/DynamischesTemplate/start.html">Beispiel</a> habe ich hier einfach mal einen Präfix und eine Farbunterlegung verwendet.</p>
<p><a href='http://jochen.jochen-manns.de/__oneclick_uploads/2010/09/classsample.png' title='Beispiel'><img src='http://jochen.jochen-manns.de/__oneclick_uploads/2010/09/classsample.thumbnail.png' alt='Beispiel' border="0"/></a></p>
<p>Links sieht man die normale Darstellung und rechts so, wie ich mir das vorstelle. Den gesamten Quellcode für das Beispiel habe ich <a href="http://downloads.psimarron.net/Silverlight/DynamischesTemplate/Quellcode.zip">hier</a> bereitgestellt, hier nur kurz die wesentlichen Tricks (wenn es einfacher geht, wäre ich durchaus an einem Hinweis interessiert).</p>
<p>Die rechte ListBox verwendet ein ItemTemplate / DataTemplate, in dem eine dynamische Bindung des Styles an ein ContentControl vorgenommen wird.<br />
<code><br />
&lt;ListBox.ItemTemplate><br />
    &lt;DataTemplate><br />
        &lt;ContentControl Style="{Binding Converter={StaticResource style}}" /><br />
    &lt;/DataTemplate><br />
&lt;/ListBox.ItemTemplate><br />
</code></p>
<p>Bei der statischen Ressource handelt es sich um einen IValueConverter, der nach einer Namenskonvention beliebigen Instanzen von .NET Objekten eine statische XAML Ressource zuordnet.<br />
<code><br />
&lt;app:StyleChooser x:Key="style" /></p>
<p>object IValueConverter.Convert( object value, Type targetType, object parameter, CultureInfo culture )<br />
{<br />
    if (value == null)<br />
        return null;<br />
    else if (targetType == typeof( Style ))<br />
        return App.Current.Resources[value.GetType().Name + "ClassStyle"];<br />
    else<br />
        return null;<br />
}<br />
</code></p>
<p>Nun muss nur noch für jede Klasse ein Style in der verwendete Namenskonvention bereitgestellt werden. Da hier ein ContentControl verwendet wird, hat man im ControlTemplate alle Möglichkeiten, die auch ein DataTemplate bietet.<br />
<code><br />
&lt;Style x:Key="MammalClassStyle" TargetType="ContentControl"><br />
    &lt;Setter Property="Template"><br />
        &lt;Setter.Value><br />
            &lt;ControlTemplate><br />
                &lt;StackPanel Background="Gray" Orientation="Horizontal"><br />
                    &lt;TextBlock Text="Das ist ein Säugetier: " /><br />
                    &lt;TextBlock Text="{Binding}" /><br />
                &lt;/StackPanel><br />
            &lt;/ControlTemplate><br />
        &lt;/Setter.Value><br />
    &lt;/Setter><br />
&lt;/Style><br />
</code></p>
<p>Happy Coding</p>
<p>Jochen</p>
]]></content:encoded>
			<wfw:commentRss>http://jochen.jochen-manns.de/index.php/2010/09/25/silverlight-listbox-mit-kontextabhangigem-itemtemplate/feed/</wfw:commentRss>
		</item>
		<item>
		<title>So was tut man doch nicht &#8230;</title>
		<link>http://jochen.jochen-manns.de/index.php/2010/08/28/so-was-tut-man-doch-nicht/</link>
		<comments>http://jochen.jochen-manns.de/index.php/2010/08/28/so-was-tut-man-doch-nicht/#comments</comments>
		<pubDate>Sat, 28 Aug 2010 18:13:24 +0000</pubDate>
		<dc:creator>JMS</dc:creator>
		
		<category><![CDATA[.NET]]></category>

		<guid isPermaLink="false">http://jochen.jochen-manns.de/index.php/2010/08/28/so-was-tut-man-doch-nicht/</guid>
		<description><![CDATA[&#8230; ja, ich weiss. Nach einer Prüfung in Compilerbau und dem theoretischen Hintergrund von Sprachkonzepten wie LALR / LR / &#8230;, nach Arbeiten mit bison / flex / yacc / &#8230; und Schnuppern in dem Gold Parser darf man eigentlich keinen Parser mit rekursivem Abstieg von Hand programmieren. Hab&#8217; ich aber trotzdem mal getan - [...]]]></description>
			<content:encoded><![CDATA[<p>&#8230; ja, ich weiss. Nach einer Prüfung in Compilerbau und dem theoretischen Hintergrund von Sprachkonzepten wie LALR / LR / &#8230;, nach Arbeiten mit bison / flex / yacc / &#8230; und Schnuppern in dem Gold Parser <strong>darf</strong> man eigentlich keinen Parser mit rekursivem Abstieg von Hand programmieren. Hab&#8217; ich aber trotzdem mal getan - den Hintergrund dieser Entscheidung überspringe ich erst einmal, auf Wunsch kann ich das ja nachholen. </p>
<p>Konkret geht es um die SQL-2003 Syntax und dabei um die Suchsprache oder noch konkreter das SELECT Statement. Ich habe mich dabei <a href="http://savage.net.au/SQL/sql-2003-2.bnf.html">hieran</a> gehalten und hoffe einmal, dass die Beschreibung ausreichend nahe an der Wahrheit ist - verglichen mit dem, was ich vom SQL Server und Oracle weiss, sieht es zumindest mal nicht schlecht aus. In einer ersten Stufe ist ein rein syntaktischer Parser entstanden, den ich gerade in den Abschlusstest nehme. Es gibt eine Reihe von Problemen verschiedenster Art, aber zumindest scheint es im Großen und Ganzen zu laufen.</p>
<p>Nun, falls jemanden dies an sich (oder die Parser Bibliothek darunter) interessieren sollte: ich habe die aktuelle Version mal mit einem kleinen Installationsprogramm versehen und zum <a href="http://downloads.psimarron.net/SQLNET10.msi">Download</a> bereitgestellt - ich gehe davon aus, dass es in den nächsten Wochen durch meine eigenen Tests zu Updates kommt und ich werde versuchen, dies in der Versionsnummer zu berücksichtigen. Wenn die Syntax ausreichend korrekt erkannt wird, werde ich mal nach der Semantik schauen (e.g. a || b geht nur, wenn a und b Zeichenketten oder Listen sind, nicht aber für Zahlen). Vor allem die Anbindung an ein Schema wird interessant. </p>
<p>Für das reine Schnuppern (Auslachen? Hm&#8230;) habe ich auch die <a href="http://sources.psimarron.net/SQL.NET/">Quellen</a> Online bereitgestellt - identisch, wie sie auch lokal installiert würden. </p>
<p>Für die Erstellung der Bibliotheken wurde Visual Studio / C# 2010 verwendet, allerdings gebunden an das .NET Framework 3.5 SP1 - und nicht 4.0.</p>
<p>Viel Spaß</p>
<p>Jochen</p>
]]></content:encoded>
			<wfw:commentRss>http://jochen.jochen-manns.de/index.php/2010/08/28/so-was-tut-man-doch-nicht/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Und immer wieder params [] &#8230;</title>
		<link>http://jochen.jochen-manns.de/index.php/2010/07/27/und-immer-wieder-params/</link>
		<comments>http://jochen.jochen-manns.de/index.php/2010/07/27/und-immer-wieder-params/#comments</comments>
		<pubDate>Tue, 27 Jul 2010 10:29:18 +0000</pubDate>
		<dc:creator>JMS</dc:creator>
		
		<category><![CDATA[.NET]]></category>

		<guid isPermaLink="false">http://jochen.jochen-manns.de/index.php/2010/07/27/und-immer-wieder-params/</guid>
		<description><![CDATA[Da ich Troll nun schon wieder einmal darauf hereingefallen bin, einfach mal als kleiner Tipp für andere, die auch so vergesslich sind wie ich. 
Ich verwende in C# eine Methode der Art void Test(params sometype[] args). So in C++ Analogie (sehr weit hergeholt, da das &#8230; / varargs doch nur mit Hilfe weiterer Parameter funktioniert) [...]]]></description>
			<content:encoded><![CDATA[<p>Da ich Troll nun schon wieder einmal darauf hereingefallen bin, einfach mal als kleiner Tipp für andere, die auch so vergesslich sind wie ich. </p>
<p>Ich verwende in C# eine Methode der Art <em>void Test(params sometype[] args)</em>. So in C++ Analogie (sehr weit hergeholt, da das &#8230; / varargs doch nur mit Hilfe weiterer Parameter funktioniert) sollte man erst einmal erwarten, dass args niemals null ist - höchstens mal leer. Das stimmt leider nicht: C# erlaubt es auch ein sometype[] Feld direkt zu übergeben - das params wird dann mehr oder weniger ignoriert. So ein Feld kann natürlich null sein - mit der Konsequenz, dass auch args null ist! </p>
<p>Also Vorsicht: statt args.Length zu prüfen lieber (args == null) ? 0 : args.Length verwenden.</p>
<p>Viel Spaß mit all den anderen Fallstricken</p>
<p>Jochen</p>
]]></content:encoded>
			<wfw:commentRss>http://jochen.jochen-manns.de/index.php/2010/07/27/und-immer-wieder-params/feed/</wfw:commentRss>
		</item>
		<item>
		<title>DVB.NET 3.9 Service Pack 2 Beta</title>
		<link>http://jochen.jochen-manns.de/index.php/2010/05/07/dvbnet-39-service-pack-2-beta/</link>
		<comments>http://jochen.jochen-manns.de/index.php/2010/05/07/dvbnet-39-service-pack-2-beta/#comments</comments>
		<pubDate>Fri, 07 May 2010 05:37:01 +0000</pubDate>
		<dc:creator>JMS</dc:creator>
		
		<category><![CDATA[.NET]]></category>

		<category><![CDATA[DVB.NET]]></category>

		<category><![CDATA[VCR.NET]]></category>

		<guid isPermaLink="false">http://jochen.jochen-manns.de/index.php/2010/05/07/dvbnet-39-service-pack-2-beta/</guid>
		<description><![CDATA[Leider ist es mir noch immer nicht gelungen, die Zeit für eine nächste Version 4.0 zusammen zu kratzen. Da es aber inzwischen einige kleinere Erweiterungen (primär für Entwickler) und zumindest einen echten Fix gibt, bin ich dabei, ein zweites Service Pack für die aktuellen Version zusammen zu stellen. Das ist aber noch in der Testphase.
Bei [...]]]></description>
			<content:encoded><![CDATA[<p>Leider ist es mir noch immer nicht gelungen, die Zeit für eine nächste Version 4.0 zusammen zu kratzen. Da es aber inzwischen einige kleinere Erweiterungen (primär für Entwickler) und zumindest einen echten Fix gibt, bin ich dabei, ein <a href="http://www.watchersnet.de/Default.aspx?tabid=52&#038;g=posts&#038;t=9">zweites Service Pack</a> für die aktuellen Version zusammen zu stellen. Das ist aber noch in der Testphase.</p>
<p>Bei der Umstellung auf Visual Studio 2010 hatte ich dabei ein interessantes (ärgerliches?) Problem, dass ich bisher noch nicht verstanden (nachrecherchiert) habe: bei der Konvertierung der Setup (MSI) Projekte wurden für viele Komponenten neue Kennungen (ComponentId) vergeben. Diese sind bisher auch nach Neuübersetzen mit vorherigem Löschen der MSI immer gleich geblieben. Das hatte ich ausgenutzt, damit die Installationspakete sich gegenseitig erkennen und als Installationsvoraussetzung nutzen können. Durch die Änderung musste ich alle Pakete in den SP2 mit aufnehmen, auch VCR.NET und den Viewer, die sich gar nicht verändert haben. </p>
<p>Trotz Allem viel Spaß beim Testen</p>
<p>Jochen</p>
]]></content:encoded>
			<wfw:commentRss>http://jochen.jochen-manns.de/index.php/2010/05/07/dvbnet-39-service-pack-2-beta/feed/</wfw:commentRss>
		</item>
		<item>
		<title>ADO.NET - Einfach nur Rechnen&#8230;</title>
		<link>http://jochen.jochen-manns.de/index.php/2010/02/21/adonet-einfach-nur-rechnen/</link>
		<comments>http://jochen.jochen-manns.de/index.php/2010/02/21/adonet-einfach-nur-rechnen/#comments</comments>
		<pubDate>Sun, 21 Feb 2010 14:56:23 +0000</pubDate>
		<dc:creator>JMS</dc:creator>
		
		<category><![CDATA[.NET]]></category>

		<guid isPermaLink="false">http://jochen.jochen-manns.de/index.php/2010/02/21/adonet-einfach-nur-rechnen/</guid>
		<description><![CDATA[Ich wollte in einem .NET Programm einen vom Anwender als Zeichenkette eingegebene einfachen mathematischen Ausdruck ausrechnen, etwa so was wie (13 * 29 + 123) / (12 *9 ) - 316 / (11 / 7). Ich denke mal, dass es mehrere Möglichkeiten gibt, das relativ einfach zu tun, aber dieser Mißbrauch von ADO.NET hat mich [...]]]></description>
			<content:encoded><![CDATA[<p>Ich wollte in einem .NET Programm einen vom Anwender als Zeichenkette eingegebene einfachen mathematischen Ausdruck ausrechnen, etwa so was wie <em>(13 * 29 + 123) / (12 *9 ) - 316 / (11 / 7)</em>. Ich denke mal, dass es mehrere Möglichkeiten gibt, das relativ einfach zu tun, aber dieser Mißbrauch von ADO.NET hat mich in der Einfachheit doch positiv überrascht:<br />
<code><br />
var table = new DataTable();<br />
...<br />
var result = table.Compute( userInput, null );<br />
</code></p>
<p>Happy Coding</p>
<p>Jochen</p>
]]></content:encoded>
			<wfw:commentRss>http://jochen.jochen-manns.de/index.php/2010/02/21/adonet-einfach-nur-rechnen/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Neuer Protokolleintrag für die BDA Implementierung</title>
		<link>http://jochen.jochen-manns.de/index.php/2010/01/30/neuer-protokolleintrag-fur-die-bda-implementierung/</link>
		<comments>http://jochen.jochen-manns.de/index.php/2010/01/30/neuer-protokolleintrag-fur-die-bda-implementierung/#comments</comments>
		<pubDate>Sat, 30 Jan 2010 09:49:26 +0000</pubDate>
		<dc:creator>JMS</dc:creator>
		
		<category><![CDATA[DVB.NET]]></category>

		<guid isPermaLink="false">http://jochen.jochen-manns.de/index.php/2010/01/30/neuer-protokolleintrag-fur-die-bda-implementierung/</guid>
		<description><![CDATA[Ich hatte ja schon einmal hier beschrieben, wie man zum Beispiel bei einer Aktualisierung der Quellen (Sendersuchlauf) ein Detailprotokoll über die internen Abläufe erstellen kann. Neu ist nun der Schalter BDATrace, der die Tune Vorgänge auf unterster Ebene ein wenig beschreibt. Zur Aktivierung muss der Schalter auf 1 gesetzt werden.
Viel Spaß
Jochen
]]></description>
			<content:encoded><![CDATA[<p>Ich hatte ja schon einmal <a href="http://jochen.jochen-manns.de/index.php/2009/12/14/protokoll-des-sendersuchlaufs/">hier</a> beschrieben, wie man zum Beispiel bei einer Aktualisierung der Quellen (Sendersuchlauf) ein Detailprotokoll über die internen Abläufe erstellen kann. Neu ist nun der Schalter <strong>BDATrace</strong>, der die Tune Vorgänge auf unterster Ebene ein wenig beschreibt. Zur Aktivierung muss der Schalter auf 1 gesetzt werden.</p>
<p>Viel Spaß</p>
<p>Jochen</p>
]]></content:encoded>
			<wfw:commentRss>http://jochen.jochen-manns.de/index.php/2010/01/30/neuer-protokolleintrag-fur-die-bda-implementierung/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Microsoft Application Compatibility</title>
		<link>http://jochen.jochen-manns.de/index.php/2010/01/09/microsoft-application-compatibility/</link>
		<comments>http://jochen.jochen-manns.de/index.php/2010/01/09/microsoft-application-compatibility/#comments</comments>
		<pubDate>Sat, 09 Jan 2010 16:19:02 +0000</pubDate>
		<dc:creator>JMS</dc:creator>
		
		<category><![CDATA[Allgemein]]></category>

		<guid isPermaLink="false">http://jochen.jochen-manns.de/index.php/2010/01/09/microsoft-application-compatibility/</guid>
		<description><![CDATA[Mehr oder weniger aus Neugier habe ich mich einmal mit der Datei %SystemRoot%\AppPatch\sysmain.sdb auseinandergesetzt und das Toolkit (ACT 5.5) installiert. Mit dem Compatadmin.exe kann man sich diese Datenbank anschauen - ist schon echt der Hammer, welche Detail-Tweaks es für einige Anwendungen gibt. Schon irgendwie traurig in der Masse und cool, dass es so etwas überhaupt [...]]]></description>
			<content:encoded><![CDATA[<p>Mehr oder weniger aus Neugier habe ich mich einmal mit der Datei <em>%SystemRoot%\AppPatch\sysmain.sdb</em> auseinandergesetzt und das Toolkit (ACT 5.5) installiert. Mit dem <em>Compatadmin.exe</em> kann man sich diese Datenbank anschauen - ist schon echt der Hammer, welche Detail-Tweaks es für einige Anwendungen gibt. Schon irgendwie traurig in der Masse und cool, dass es so etwas überhaupt gibt.</p>
<p>Aber hier ein kleiner Tipp: ich wollte mal in eine SDB von einem anderen Rechner schauen und habe versucht, diese in dem Tool zu öffnen. Dies wird aber verweigert, da es sich um eine Systemdatenbank handelt. Kein Problem: mit einem Hexeditor in der SDB nach einer Sequenz aus 16 (ist eine eindeutige Kennung) Hexwerten 11 suchen und einen davon verändern (ich habe den ersten auf 21 gesetzt). Ist zwar kein feiner Trick (vor allem, wenn man nicht genau weiß, was man da verändert), aber nun kann die Datenbank geladen und inspiziert werden.</p>
<p>Viel Glück</p>
<p>Jochen</p>
]]></content:encoded>
			<wfw:commentRss>http://jochen.jochen-manns.de/index.php/2010/01/09/microsoft-application-compatibility/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Lustiges von McAfee&#8230;</title>
		<link>http://jochen.jochen-manns.de/index.php/2010/01/09/lustiges-von-mcafee/</link>
		<comments>http://jochen.jochen-manns.de/index.php/2010/01/09/lustiges-von-mcafee/#comments</comments>
		<pubDate>Sat, 09 Jan 2010 16:03:25 +0000</pubDate>
		<dc:creator>JMS</dc:creator>
		
		<category><![CDATA[Allgemein]]></category>

		<guid isPermaLink="false">http://jochen.jochen-manns.de/index.php/2010/01/09/lustiges-von-mcafee/</guid>
		<description><![CDATA[Frohes Neues Jahr erst einmal  
Ich wollte gerade mal eben auf einem Rechner VirusScan 2009 auf 2010 erneuern. Ganz naiv wie schon oft gemacht: alte Version deinstalliert und neue Version installiert. Geht aber nicht mehr in dieser Form! Ohne auf Details einzugehen, was ist passiert: VirusScan ersetzt die COM Registrierung der Script Engines, u.a. [...]]]></description>
			<content:encoded><![CDATA[<p>Frohes Neues Jahr erst einmal <img src='http://jochen.jochen-manns.de/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Ich wollte gerade mal eben auf einem Rechner VirusScan 2009 auf 2010 erneuern. Ganz naiv wie schon oft gemacht: alte Version deinstalliert und neue Version installiert. Geht aber nicht mehr in dieser Form! Ohne auf Details einzugehen, was ist passiert: VirusScan ersetzt die COM Registrierung der Script Engines, u.a. JScript. Nach der Deinstallation der 2009er Version gab es daher kein JScript mehr auf dem Rechner. Das wird aber für die Installation 2010er Version zwingend benötigt. Trapped! Auch der Hinweis von McAfee, JScript 4.5 für XP nachzuinstallieren, ist inzwischen hinfällg, da dieser auf dem aktuellen XP SP3 Update Stand den Dienst verweigert, weil er sich selbst als zu alt erkennt. Nach COM Registrierung von JScript.dll ist erst mal alles wieder im Lot (die anderen Script Engines werden von der 2010er Version eh wieder ersetzt, habe mit erspart, alle heraus zu suchen), aber das muss man auch erst mal finden. Naja, da McAfee das Problem kennt bin ich mal gespannt, was nach der Deinstallation der 2010er Version los ist. Im Moment hat mich das aber unnötig Zeit gekostet und ich habe keine Lust, es auszuprobieren.</p>
<p>Tschüss</p>
<p>Jochen</p>
]]></content:encoded>
			<wfw:commentRss>http://jochen.jochen-manns.de/index.php/2010/01/09/lustiges-von-mcafee/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Transport Stream analyiseren</title>
		<link>http://jochen.jochen-manns.de/index.php/2009/12/30/transport-stream-analyiseren/</link>
		<comments>http://jochen.jochen-manns.de/index.php/2009/12/30/transport-stream-analyiseren/#comments</comments>
		<pubDate>Wed, 30 Dec 2009 13:08:25 +0000</pubDate>
		<dc:creator>JMS</dc:creator>
		
		<category><![CDATA[DVB.NET]]></category>

		<guid isPermaLink="false">http://jochen.jochen-manns.de/index.php/2009/12/30/transport-stream-analyiseren/</guid>
		<description><![CDATA[Ich habe mal die (zugegeben etwas beschränkten) Möglichkeiten der aktuellen DVB.NET 3.9 SP1 genutzt, um in einem einfachen Beispiel zu demonstrieren, wie man sich einen Überblick über den Inhalt eines Transport Streams (eines ganzen Transponders) verschaffen kann. Das funktioniert allerdings nur mit BDA Treibern (also insbsondere nicht mit der Nexus / Premium Line).
Der DVB.NET TS [...]]]></description>
			<content:encoded><![CDATA[<p>Ich habe mal die (zugegeben etwas beschränkten) Möglichkeiten der aktuellen DVB.NET 3.9 SP1 genutzt, um in einem <a href="http://sources.psimarron.net/Evaluations/Transport%20Stream%20Analyser/Program.cs">einfachen Beispiel</a> zu demonstrieren, wie man sich einen Überblick über den Inhalt eines Transport Streams (eines ganzen Transponders) verschaffen kann. Das funktioniert allerdings nur mit BDA Treibern (also insbsondere nicht mit der Nexus / Premium Line).</p>
<p>Der DVB.NET <a href="http://sources.psimarron.net/DVB.NET/TS/TSParser.cs">TS Parser</a> bietet im Moment leider nicht die Möglichkeit, dynamisch Teilströme an einen Client zu melden. Aber mit einem kleinen Trick geht es doch. Das Beispielprogramm aktiviert eine beliebige Quellgruppe (Transponder), die durch eine Quelle (Sender) als Repräsentant gekennzeichnet wird. Dann wird der Statistikmodus aktiviert, der dafür sorgt, dass für alle Datenströme Buch über die empfangenen Daten geführt wird. Wartet man nun etwas (so 30 Sekunden, damit auch TOT und TDT eingetroffen sind) und fragt diese Statistik dann ab, so erhält man im Allgemeinen alle Datenstromkennungen (PID) der Quellgruppe. Nun ist es ein Einfaches, Verbraucher an die einzelnen Ströme anzumelden und diese auszuwerten - das Beispiel ist allerdings extrem einfach gestrickt, reicht aber, um die meisten SI Tabellenströme von Nutzdaten zu trennen und bei PES Datenströmen die Breitstellung des PCR zu erkennen. Läßt man das Beispiel kurz laufen, kann man sich dann das Ergebnis der Analyse anschauen. Klar, dass da noch viel mehr drin wäre, aber das war hier erst einmal nicht das Thema.</p>
<p>Wie man am Beispiel sieht, bietet DVB.NET (aus gutem Grund) keinen direkten Zugriff auf die Interna des DVB Empfangs an. Mit ein bißchen .NET Reflection im <em>Full Trust</em> Modus ist das aber alles schnell gemacht. Mal schauen, ob zukünftige Versionen da einen einfacheren Zugang erlauben.</p>
<p>Auf diesem Wege auch einen guten Rutsch ins nächste Jahr</p>
<p>Jochen</p>
]]></content:encoded>
			<wfw:commentRss>http://jochen.jochen-manns.de/index.php/2009/12/30/transport-stream-analyiseren/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Protokoll des Sendersuchlaufs</title>
		<link>http://jochen.jochen-manns.de/index.php/2009/12/14/protokoll-des-sendersuchlaufs/</link>
		<comments>http://jochen.jochen-manns.de/index.php/2009/12/14/protokoll-des-sendersuchlaufs/#comments</comments>
		<pubDate>Mon, 14 Dec 2009 18:47:49 +0000</pubDate>
		<dc:creator>JMS</dc:creator>
		
		<category><![CDATA[DVB.NET]]></category>

		<guid isPermaLink="false">http://jochen.jochen-manns.de/index.php/2009/12/14/protokoll-des-sendersuchlaufs/</guid>
		<description><![CDATA[Obwohl ich das eigentlich vor hatte gibt es in DVB.NET nur wenige Stellen, an denen die Standardmechanismen von .NET zur Protokollierung verwendet werden. Eine dieser Stellen ist die Aktualisierung der Quellen (Sendersuchlauf), sofern sie von dem Administrations &#038; Konfigurationswerkzeug angestossen wird. Hier setzt der Algorithmus auf .NET Tracer. Die Einrichtung erfolgt über die Datei DVBNETAdmin.exe.config [...]]]></description>
			<content:encoded><![CDATA[<p>Obwohl ich das eigentlich vor hatte gibt es in DVB.NET nur wenige Stellen, an denen die Standardmechanismen von .NET zur Protokollierung verwendet werden. Eine dieser Stellen ist die Aktualisierung der Quellen (Sendersuchlauf), sofern sie von dem Administrations &#038; Konfigurationswerkzeug angestossen wird. Hier setzt der Algorithmus auf .NET Tracer. Die Einrichtung erfolgt über die Datei <a href="http://sources.psimarron.net/DVB.NET/Administration/App.config">DVBNETAdmin.exe.config</a> in etwa wie folgt (ich denke, man sieht am existierenden Inhalt, worum es geht):<br />
<code><br />
  ...<br />
  &lt;system.diagnostics&gt;<br />
    &lt;switches&gt;<br />
      &lt;add name="ConsumerTrace" value="0"/&gt;<br />
      &lt;add name="TunerTrace" value="4"/&gt;<br />
      &lt;add name="StreamOptimizerTrace" value="0"/&gt;<br />
      &lt;add name="ScannerTrace" value="4"/&gt;<br />
    &lt;/switches&gt;<br />
    &lt;trace useGlobalLock="false" autoflush="true" indentsize="0"&gt;<br />
      &lt;listeners&gt;<br />
        &lt;add<br />
          name="adminListener"<br />
          type="System.Diagnostics.TextWriterTraceListener, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"<br />
          initializeData="c:\temp\adminlog.txt" /&gt;<br />
      &lt;/listeners&gt;<br />
    &lt;/trace&gt;<br />
  &lt;/system.diagnostics&gt;<br />
  ...<br />
</code></p>
<p>Die erzeugt Ausgabedatei enthält unter anderem folgende Informationen:
<ul>
<li>Untersuchte Quellgruppe (Transponder) und deren Anwahl</li>
<li>Inhalt der Netzwerkinformationen</li>
<li>Liste der Quellen (Sender) auf jeder Quellgruppe</li>
</ul>
<p>Wie in letzter Zeit gelernt können diese Informationen sehr nützlich bei der Suche nach Fehlern beim Sendersuchlauf sein - seien es tatsächliche Fehler in DVB.NET oder Fehlkonfigurationen <em>vor Ort</em>.</p>
<p>Viel Spaß</p>
<p>Jochen</p>
]]></content:encoded>
			<wfw:commentRss>http://jochen.jochen-manns.de/index.php/2009/12/14/protokoll-des-sendersuchlaufs/feed/</wfw:commentRss>
		</item>
		<item>
		<title>VideoText in DVB.NET 3.9 für Entwickler</title>
		<link>http://jochen.jochen-manns.de/index.php/2009/09/18/videotext-in-dvbnet-39-fur-entwickler/</link>
		<comments>http://jochen.jochen-manns.de/index.php/2009/09/18/videotext-in-dvbnet-39-fur-entwickler/#comments</comments>
		<pubDate>Fri, 18 Sep 2009 20:58:00 +0000</pubDate>
		<dc:creator>JMS</dc:creator>
		
		<category><![CDATA[DVB.NET]]></category>

		<guid isPermaLink="false">http://jochen.jochen-manns.de/index.php/2009/09/18/videotext-in-dvbnet-39-fur-entwickler/</guid>
		<description><![CDATA[Da ich für das Service Pack 1 gerade ein bißchen am Code herumspielen musst, hier eine grobe Zusammenfassung der Möglichkeiten, die DVB.NET einem Entwickler zur Auswertung von VideoText bietet.
Kern ist die Klasse TTXParser, deren AddPayload Methode mit dem Rohdatenstrom (ES) beschickt wird. Sobald eine Seite (TTXPage) vollständig bereit steht, wird ein entsprechendes Ereignis ausgelöst (OnPage). [...]]]></description>
			<content:encoded><![CDATA[<p>Da ich für das Service Pack 1 gerade ein bißchen am Code herumspielen musst, hier eine grobe Zusammenfassung der Möglichkeiten, die DVB.NET einem Entwickler zur Auswertung von VideoText bietet.</p>
<p>Kern ist die Klasse TTXParser, deren AddPayload Methode mit dem Rohdatenstrom (ES) beschickt wird. Sobald eine Seite (TTXPage) vollständig bereit steht, wird ein entsprechendes Ereignis ausgelöst (OnPage). Ergänzend bietet DVB.NET mit der Klasse PageManager die Möglichkeit, einmal empfangene Seiten vorzuhalten. Diese können dann gezielt angefordert werden (CurrentPage) und werden dann unmittelbar oder nach Empfang der ersten Version über ein Ereignis gemeldet (OnPageAvailable) - dito bei jeder folgenden Aktualisierung der Seite [unabhängig davon, ob sich der Inhalt verändert hat]. Sollten kein Rohdatenstrom vorliegen (so wie es beim DVB Empfang oft der Fall ist), kann dieser durch Kombination mit einer TTXStream Instanz aus einem PES erzeugt werden.</p>
<p>Im Zentrum der eigentlichen Darstellung stehen Instanzen der TTXPage Klasse. Diese verwaltet eine voranalyiserte Darstellung der Seite, die allerdings für die direkte Auswertung nicht zwingend geeignet ist. Hier sind noch Steuersequenzen für Zeichengröße, Zeichensatz, Vorder- und Hintergrundfarbe etc. eingebettet. Mit einem Aufruf von CreatePage erfolgt die Umsetzung in eine .NET Bitmap Instanz, die direkt zur Anzeige verwendet werden kann. Die Unterstützung des VideoText Standards ist zwar recht rudimentär (international Zeichensätze werden nicht korrekt dargestellt, was etwa ARTE oder BBC etwas komisch aussehen lässt), für die deutschen Sender reicht es aber. Ebenso vorhanden sind transparente Seiten etwa für Untertitel. </p>
<p>Ergänzend zur Bitmap und den Rohdaten bietet CreatePage die Option, eine Information über alle auf der Seite ausgegebenen Ziffern zu erfragen. Diese werden über eine Klasse DigitManager verwaltet. Mit der Methode GetTTXDigitAt kann zu einer relativen Position auf der Seite (in den Koordinaten 0.0 bis 1.0, wobei 0.0 / 0.0 wie gewohnt oben links ist) ermittelt werden, ob dort eine Ziffer ausgegeben wurde. Ist das der Fall, so wird auch der Rahmen des Zeichens in relativen Koordinaten gemeldet. Ergänzend prüft GetPageAt zu einer Position, ob dort eine dreistellige Seitennummer im Bereich 100 bis 899 (jeweils einschließlich) vorhanden ist - dazu wird natürlich GetTTXDigitAt eingesetzt. Bedingung ist eine Sequenz aus genau drei Ziffern gleicher Größe - Höhe und Breite.</p>
<p>Viel Spaß</p>
<p>Jochen</p>
]]></content:encoded>
			<wfw:commentRss>http://jochen.jochen-manns.de/index.php/2009/09/18/videotext-in-dvbnet-39-fur-entwickler/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Noch ein kleines Tool: BBC / ITV Programmzeitschrift</title>
		<link>http://jochen.jochen-manns.de/index.php/2009/09/12/noch-ein-kleines-tool-bbc-itv-programmzeitschrift/</link>
		<comments>http://jochen.jochen-manns.de/index.php/2009/09/12/noch-ein-kleines-tool-bbc-itv-programmzeitschrift/#comments</comments>
		<pubDate>Sat, 12 Sep 2009 10:26:26 +0000</pubDate>
		<dc:creator>JMS</dc:creator>
		
		<category><![CDATA[DVB.NET]]></category>

		<category><![CDATA[VCR.NET]]></category>

		<guid isPermaLink="false">http://jochen.jochen-manns.de/index.php/2009/09/12/noch-ein-kleines-tool-bbc-itv-programmzeitschrift/</guid>
		<description><![CDATA[Ich habe aus Eigennutz mal ein kleines Tool geschrieben, das die FreeSat Programmzeitschrift in eine Excel fähige Datei auslesen kann. Nix Dolles und sicher noch mit Bugs und Schönheitsfehlern, aber vielleicht nützlich für den den einen oder anderen. Es wird eine funktionsfähige (i.e. mindestens ein Geräteprofil mit durchgeführtem Suchlauf auf Astra 2 / EuroBird) DVB.NET [...]]]></description>
			<content:encoded><![CDATA[<p>Ich habe aus Eigennutz mal ein kleines <a href="http://downloads.psimarron.net/Tools/FreeSat%20EPG.zip">Tool</a> geschrieben, das die FreeSat Programmzeitschrift in eine Excel fähige Datei auslesen kann. Nix Dolles und sicher noch mit Bugs und Schönheitsfehlern, aber vielleicht nützlich für den den einen oder anderen. Es wird eine funktionsfähige (i.e. mindestens ein Geräteprofil mit durchgeführtem Suchlauf auf Astra 2 / EuroBird) DVB.NET 3.9 Installation vorausgesetzt. Die Quelltexte sind als Beispiel dabei (es ist eine ganz einfache Page basierte WPF Anwendung).</p>
<p>Viel Spaß</p>
<p>Jochen</p>
<p><a href='http://jochen.jochen-manns.de/__oneclick_uploads/2009/09/sample.jpg' title='sample.jpg'><img src='http://jochen.jochen-manns.de/__oneclick_uploads/2009/09/sample.thumbnail.jpg' alt='Zum Beispiel' border="0" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://jochen.jochen-manns.de/index.php/2009/09/12/noch-ein-kleines-tool-bbc-itv-programmzeitschrift/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Lesepause :-)</title>
		<link>http://jochen.jochen-manns.de/index.php/2009/08/13/lesepause/</link>
		<comments>http://jochen.jochen-manns.de/index.php/2009/08/13/lesepause/#comments</comments>
		<pubDate>Thu, 13 Aug 2009 12:39:16 +0000</pubDate>
		<dc:creator>JMS</dc:creator>
		
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://jochen.jochen-manns.de/index.php/2009/08/13/lesepause/</guid>
		<description><![CDATA[Ich habe meine freie Zeit mal böswillig nicht genutzt, um etwas an VCR.NET zu tun, sondern vielmehr, um mein Hintergrundwissen im Bereich Betriebssysteme aufzufrischen - im aktuellen Arbeitskontext ist das natürlich Windows. Die dazu verwendete Literatur war die nun fünfte Auflage von Windows Internals - ein oder zwei ältere Versionen hatte ich mir schon vor [...]]]></description>
			<content:encoded><![CDATA[<p>Ich habe meine freie Zeit mal böswillig nicht genutzt, um etwas an VCR.NET zu tun, sondern vielmehr, um mein Hintergrundwissen im Bereich Betriebssysteme aufzufrischen - im aktuellen Arbeitskontext ist das natürlich Windows. Die dazu verwendete Literatur war die nun fünfte Auflage von <a href="http://technet.microsoft.com/en-us/sysinternals/bb963901.aspx">Windows Internals</a> - ein oder zwei ältere Versionen hatte ich mir schon vor langer Zeit einmal angetan.</p>
<p>Auch wenn das Buch in der Gesamtheit einen etwas gemischten Eindruck hinterläßt, halte ich es für die angesprochene Zielgruppe für unbedingt empfehlenswert. Die meisten Kapitel sind didaktisch gut aufgebaut, logisch und meiner Ansicht nach genau in der richtigen Tiefe. Es geht nicht in die absoluten Details (elendige Diskussionen aller Felder von Kernel Strukturen sind extremst selten), sondern vermittelt vielmehr Hintergründe, Zusammenhänge und zum Teil auch Designentscheidungen. Wer wirklich direkt anfangen will, einen Treiber zu schreiben, wird sicher mehr brauchen - aber das war auch nicht meine Erwartungshaltung. Bei mir hinterläßt es zumindest das Gefühl, einige Grundprinzipien verstanden zu haben - und es hat mich zu einigen Experimenten mit Vista rund um UAC und VSS motiviert, bei denen diese Prinzipen auch für den Endanwender fühlbar werden.</p>
<p>Allerdings gibt es auch einige (zwei oder so) Kapitel, die eher verwirrend waren - vielleicht, weil das nicht wirklich mein Thema war, vielleicht, weil der Umfang der zu vermittelnden Daten einfach den Rahmen sprengte. Die Netzwerkarchitektur scheint mir eher ein &#8216;alles mal erwähnen&#8217; zu sein als sich an der angenehmen Tiefe des Rest zu orientieren - wie gesagt, kann auch an mir liegen.</p>
<p>Auch vielleicht nicht ganz ohne Schuld auf meiner Seite habe ich das Gefühl, dass zwischen den (zweifellos berechtigten) Querreferenzen nach vorne und hinten doch mal etwas auf der Strecke blieb. So meine ich das eine oder andere mal ein &#8216;wie bereits in Kapitel X ausführlich beschrieben&#8217; bei Nachschlagen auf einen Absatz mit zwei Sätzen reduziert gesehen zu haben. Da ich aber keine Zeit hatte, alles mehrfach zu lesen und nachzuschlagen (immerhin 1150 Seiten), kann ich das nicht für alle Stellen oder gar für Vorwärtsreferenzen bestätigen.</p>
<p>Alles in Allem meine ich, das Buch ist mit der richtigen Erwartungshaltung unbedingt sein Geld wert (Tipp: mal bei Amazon UK statt hier nachzuschauen, das kann sich je nach Situation trotz Porto lohnen).</p>
<p>Nun versuche ich etwas braver mit meiner Zeit umzugehen und mal nach dem DVB.NET / VCR.NET 3.9 Service Pack 1 zu schauen.</p>
<p>Viel Spaß</p>
<p>Jochen</p>
]]></content:encoded>
			<wfw:commentRss>http://jochen.jochen-manns.de/index.php/2009/08/13/lesepause/feed/</wfw:commentRss>
		</item>
		<item>
		<title>WPF Evaluation: Ressourcen</title>
		<link>http://jochen.jochen-manns.de/index.php/2009/07/04/wpf-evaluation-ressourcen/</link>
		<comments>http://jochen.jochen-manns.de/index.php/2009/07/04/wpf-evaluation-ressourcen/#comments</comments>
		<pubDate>Sat, 04 Jul 2009 18:09:07 +0000</pubDate>
		<dc:creator>JMS</dc:creator>
		
		<category><![CDATA[.NET]]></category>

		<category><![CDATA[VCR.NET]]></category>

		<guid isPermaLink="false">http://jochen.jochen-manns.de/index.php/2009/07/04/wpf-evaluation-ressourcen/</guid>
		<description><![CDATA[Ich stelle mir XAML Ressourcen als eine Art statische Felder vor, die beim Starten der Anwendung automatisch initialisiert werden. Natürlich ist dieses Bild etwas vereinfacht, da es Konzepte wie die hierarchische Sichtbarkeit nicht wirklich wiedergeben kann, aber für einen Einstieg in die Thematik sollte es reichen.
Eine der wohl üblichsten Verwendungsarten von in XAML definierten Ressourcen [...]]]></description>
			<content:encoded><![CDATA[<p>Ich stelle mir XAML Ressourcen als eine Art statische Felder vor, die beim Starten der Anwendung automatisch initialisiert werden. Natürlich ist dieses Bild etwas vereinfacht, da es Konzepte wie die hierarchische Sichtbarkeit nicht wirklich wiedergeben kann, aber für einen Einstieg in die Thematik sollte es reichen.</p>
<p>Eine der wohl üblichsten Verwendungsarten von in <a href='http://sources.psimarron.net/Evaluations/VCR.NET%20Program%20Guide%20(WPF)/App.xaml'>XAML</a> definierten Ressourcen sind sicherlich Abbildungsvorschriften von Daten auf Oberflächenelementen (e.g. &lt;DataTemplate x:Key=&#8221;ShortDescription&#8221;&gt;) und Styles (e.g. &lt;Style x:Key=&#8221;DescriptionHeader&#8221;&gt;), ich fand es im Bereich der Oberflächengestaltung auch recht praktisch, beliebige Strukturen vordefinieren zu können (e.g. &lt;StackPanel x:Key=&#8221;LongDescription&#8221;&gt;).</p>
<p>Genauso nützlich ist es, globale Instanzen einmalig definieren zu können (e.g. &lt;app:ProgramGuide x:Key=&#8221;TheGuide&#8221; /&gt;), wobei diese sich oft (wenn die Reihenfolge der Definition es erlaubt) auch gegenseitige referenzieren können (e.g. &lt;app:Filter x:Key=&#8221;<strong>GuideFilter</strong>&#8221; /&gt; und &lt;app:ProgramGuideView x:Key=&#8221;GuideView&#8221; GuideFilter=&#8221;{StaticResource <strong>GuideFilter</strong>}&#8221; Source=&#8221;{Binding Source={StaticResource <strong>TheGuide</strong>}, Path=Events, IsAsync=true, Mode=OneTime}&#8221; /&gt;).</p>
<p>In der Beispielanwendung werden Ressourcen auch für Zeichenketten wie Formate (e.g &lt;system:String x:Key=&#8221;DateTimeFormat&#8221;&gt;dd.MM.yyyy HH:mm&lt;/system:String&gt;) verwendet, wobei allerdings meiner persönlichen Ansicht nach hier die Grauzone zum Aspekt der Lokalisierung auf die gute alte WinForms Art (.resx) berührt wird. Auch wenn WPF anderen Ideen zur allgemeinen Lokalisierung mit sich bringt, könnte es für diese Fälle (Zeichenketten, die lokalisierbar sein sollten, aber nicht direkt in der Oberfläche erscheinen) eleganter sein, auf RESX und die StaticResource Markup Erweiterung zu setzen.</p>
<p>Als letztes finde ich im Rahmen der Beispielanwendung erwähnenswert, dass auch Felder als XAML Ressourcen angelegt werden können (e.g. &lt;x:Array Type=&#8221;system:DateTime&#8221; x:Key=&#8221;TimeSelections&#8221;&gt; und darin &lt;system:DateTime&gt;00:00&lt;/system:DateTime&gt; et al).</p>
<p>Happy Coding</p>
<p>Jochen</p>
]]></content:encoded>
			<wfw:commentRss>http://jochen.jochen-manns.de/index.php/2009/07/04/wpf-evaluation-ressourcen/feed/</wfw:commentRss>
		</item>
		<item>
		<title>WPF Evaluation: Filter und View</title>
		<link>http://jochen.jochen-manns.de/index.php/2009/06/27/wpf-evaluation-filter-und-view/</link>
		<comments>http://jochen.jochen-manns.de/index.php/2009/06/27/wpf-evaluation-filter-und-view/#comments</comments>
		<pubDate>Sat, 27 Jun 2009 12:38:42 +0000</pubDate>
		<dc:creator>JMS</dc:creator>
		
		<category><![CDATA[.NET]]></category>

		<category><![CDATA[VCR.NET]]></category>

		<guid isPermaLink="false">http://jochen.jochen-manns.de/index.php/2009/06/27/wpf-evaluation-filter-und-view/</guid>
		<description><![CDATA[Eine Frage ist natrürlich, was (welcher Ausschnitt der gesamten Programmzeitschrift) dem Anwender wie (etwa die Sortierung) angezeigt werden soll. Für das Beispiel habe mich mich entschieden, dass die Anzeige sortiert nach dem Startzeitpunkt und gruppiert erst nach Datum und dann nach der vollen Stunde erfolgen soll. Für die Evaluation sind diese Entscheidungen auch festgelegt, produktiv [...]]]></description>
			<content:encoded><![CDATA[<p>Eine Frage ist natrürlich, was (welcher Ausschnitt der gesamten Programmzeitschrift) dem Anwender wie (etwa die Sortierung) angezeigt werden soll. Für das Beispiel habe mich mich entschieden, dass die Anzeige sortiert nach dem Startzeitpunkt und gruppiert erst nach Datum und dann nach der vollen Stunde erfolgen soll. Für die Evaluation sind diese Entscheidungen auch festgelegt, produktiv muss man da natürlich freier sein. Tatsächlich ist die vorhandene Implementierung bei Anzeige der gesamten Programmzeitschrift (mit einigen Tausend Einträgen) auch zu langsam, aber das macht für das Beispiel erst einmal nichts - zudem wie gleich beschrieben oft eine Filterung aktiv sein wird.</p>
<p>Ich habe mich entschieden, die Art der Anzeige in einer eigene <a href='http://sources.psimarron.net/Evaluations/VCR.NET%20Program%20Guide%20(WPF)/ProgramGuideView.cs'>Klasse</a> zu implementieren. Diese wird dann an die Liste via XAML angehängt (ItemsSource=&#8221;{Binding Source={StaticResource GuideView}}&#8221;) - die Anzeigeklasse ist wieder einmal eine globale Ressource. Interessant ist im Beispiel das Zusammenspiel mit der Filterbedingung.</p>
<p>Zur Auswahl von Teilen der Programmzeitschrift gibt es eine <a href='http://sources.psimarron.net/Evaluations/VCR.NET%20Program%20Guide%20(WPF)/Filter.cs'>Filterklasse</a>, in der die üblichen Parameter gesetzt werden können. Ich habe diese auf der untersten WPF Ebene implementiert, die sowohl dynamische Eigenschaften (DependencyProperty mit Bindungen) als auch Ereignisse (RoutedEvent) erlaubt: dem FrameworkElement. Eine Instanz der Klasse wird als globale Ressource angeboten. Dazu noch ein paar weitere Details, der Filter selbst ist trivial und nicht wirklich der Rede wert.</p>
<p>Die eindeutige Filterinstanz wird nun auf zweierlei Art verwendet. Zum Einen binden sich verschiedene Oberflächenelemente direkt an die relvanten Filtereigenschaften - etwa das Eingabefeld mit dem Freitextsuchfeld. Interessant ist dabei, dass bei den Bindungen (Text=&#8221;{Binding Source={StaticResource GuideFilter}, Path=TextFilter, Mode=OneWayToSource}&#8221;) alternierend OneWayToSource und TwoWay (SelectedItem=&#8221;{Binding Source={StaticResource GuideFilter}, Path=Time, Mode=TwoWay}&#8221;) verwendet wird: im Allgemeinen wäre OneWayToSource die korrekte Wahl, ich möchte aber einige (wenige) Auswahlelement direkt mit den Voreinstellungen belegen, die nur der Filter selbst kennen muss.</p>
<p>Zur Reaktion auf Änderungen der Filterbedingun bindet sich der CollectionSourceView an die Ereignisse, die bei Veränderungen von der Filterinstanz aufgerufen werden - die Verbindung erfolgt aus Basis der globalen Ressourcen (&lt;app:ProgramGuideView x:Key=&#8221;GuideView&#8221; GuideFilter=&#8221;{StaticResource GuideFilter}&#8221; Source=&#8221;{Binding Source={StaticResource TheGuide}, Path=Events, IsAsync=true, Mode=OneTime}&#8221; /&gt;). Die Sicht auf die Programmzeitschrift aktualisiert sich dann selbst, gefolgt von der entsprechenden Aktualisierung in der Benutzeroberfläche. Tatsächlich habe ich es nicht so richtig hinbekommen, der Sicht zu sagen, sie solle sich einfach erneuern. Daher im Code der kleine Trick mit dem NullFilterEvent und dem m_Changing Flag, die dafür sorgen, dass die Filter Eigenschaft des Views verändert wird, ohne dass dabei eine mehrfache Auswertung stattfindt - was stark auf die Laufzeit geht.</p>
<p>Soweit dazu</p>
<p>Jochen</p>
<p><a href='http://jochen.jochen-manns.de/__oneclick_uploads/2009/06/full.jpg' title='full.jpg'><img src='http://jochen.jochen-manns.de/__oneclick_uploads/2009/06/full.thumbnail.jpg' alt='full.jpg' border="0"/></a></p>
]]></content:encoded>
			<wfw:commentRss>http://jochen.jochen-manns.de/index.php/2009/06/27/wpf-evaluation-filter-und-view/feed/</wfw:commentRss>
		</item>
		<item>
		<title>WPF Evaluation: Spaß mit der StaticMarkupExtension</title>
		<link>http://jochen.jochen-manns.de/index.php/2009/06/21/wpf-evaluation-spas-mit-der-staticmarkupextension/</link>
		<comments>http://jochen.jochen-manns.de/index.php/2009/06/21/wpf-evaluation-spas-mit-der-staticmarkupextension/#comments</comments>
		<pubDate>Sun, 21 Jun 2009 16:24:33 +0000</pubDate>
		<dc:creator>JMS</dc:creator>
		
		<category><![CDATA[.NET]]></category>

		<category><![CDATA[VCR.NET]]></category>

		<guid isPermaLink="false">http://jochen.jochen-manns.de/index.php/2009/06/21/wpf-evaluation-spas-mit-der-staticmarkupextension/</guid>
		<description><![CDATA[Sehr interessant fand ich auch die Möglichkeiten des Einsatzes der x:Static Markup Erweiterung, hier am Beispiel der Konfiguration. Die Konfiguration der Anwendung ist .NET konform in den Settings gespeichert und es wird ein Dialog angeboten, der jeden einzelnen Eintrag zum Ändern anbietet - etwa die URL zum SOAP Web Service des VCR.NET Recording Service. Im [...]]]></description>
			<content:encoded><![CDATA[<p>Sehr interessant fand ich auch die Möglichkeiten des Einsatzes der x:Static Markup Erweiterung, hier am Beispiel der <a href='http://sources.psimarron.net/Evaluations/VCR.NET%20Program%20Guide%20(WPF)/Configuration.xaml'>Konfiguration</a>. Die Konfiguration der Anwendung ist .NET konform in den Settings gespeichert und es wird ein Dialog angeboten, der jeden einzelnen Eintrag zum Ändern anbietet - etwa die URL zum SOAP Web Service des VCR.NET Recording Service. Im Beispiel wird der DataContext des Dialogs direkt an diese Einstellungen gebunden (DataContext=&#8221;{x:Static app:Properties.Settings.Default}&#8221;). Die einzelnen Formularelemente binden sich dann relativ an die Einzeleintragungen (Text=&#8221;{Binding Path=ServerUri, Mode=TwoWay, UpdateSourceTrigger=Explicit}&#8221;), wobei ich aber bewußt die explizite Aktualisierung verwende, da bei einem Abbruch keine Veränderungen vorgenommen werden sollen. Das geht in der einfachen Implementierung nur teilweise, dazu gleich mehr.</p>
<p><a href='http://jochen.jochen-manns.de/__oneclick_uploads/2009/06/config.jpg' title='config.jpg'><img src='http://jochen.jochen-manns.de/__oneclick_uploads/2009/06/config.thumbnail.jpg' alt='config.jpg' border="0"/></a></p>
<p>Ergänzend sieht man im <a href='http://sources.psimarron.net/Evaluations/VCR.NET%20Program%20Guide%20(WPF)/Configuration.xaml.cs'>Programmcode</a> des Dialogs, wie diese Aktualisierung auch auf einen Rutsch dynamisch vorgenommen wird, ohne dass jedes Formularelement explizit angesprochen werden muss. Konkret bedeutet das, dass ein neuer Konfigurationseintrag letztlich nur in der XAML mit einem Formularelement eingetragen werden muss um gepflegt zu werden: es ist kein zusätzlicher Programmcode notwendig.</p>
<p>So wie es implementiert ist, funktioniert es allerdings nicht wirklich: an einigen Konfigurationseinträgen hängen Prüfungen (ValidationRule) und nur wenn alle Prüfungen Erfolg melden, kann das Formular gespeichert werden. Bei einer Gesamtprüfung werden aber alle erfolgreichen Eingaben bereits in die Konfiguration übertragen und sind damit zumindest für die weitere Nutzung der Anwendung verändert - auf Platte gespeichert werden kann allerdings nur, wenn alles korrekt eingegeben wurde. Ich habe dem zumindest optisch Rechnung getragen, indem die Abbrechen Schaltfläche deaktiviert wird. Ist aber nur halbherzig, da man den Dialog immer noch über das Kreuzchen rechts oben schliessen kann. Wieder für eine produktive Lösung undenkbar, aber das ist hier erst einmal irrelevant.</p>
<p>Eine zweite Anwendung von x:Static findet man in der <a href='http://sources.psimarron.net/Evaluations/VCR.NET%20Program%20Guide%20(WPF)/App.xaml.cs'>Anwendung</a> selbst. Hier wird eine Auflistung (TextFilterTypes[] FilterTypes) aller Alternativen einer <a href='http://sources.psimarron.net/Evaluations/VCR.NET%20Program%20Guide%20(WPF)/Filter.cs'>.NET Enum</a> angeboten, die in einer Auswahlliste angezeigt werden soll (ItemsSource=&#8221;{x:Static app:App.FilterTypes}&#8221;). Eine Erweiterung um eine Alternative erfordert erst einmal nur die Veränderung der Enum Definition und die Oberfläche folgt dieser sofort. Dass die Beispielanwendung diese Altenativen über WPF Ressourcen auf Texte abbildet ist für das Prinzp ohne Bedeutung - auch wenn das natürlich heißt, dass man doch zumindest einen weiteren Eintrag in den Ressourcen ergänzen muss.</p>
<p>Viel Spaß</p>
<p>Jochen</p>
]]></content:encoded>
			<wfw:commentRss>http://jochen.jochen-manns.de/index.php/2009/06/21/wpf-evaluation-spas-mit-der-staticmarkupextension/feed/</wfw:commentRss>
		</item>
		<item>
		<title>WPF Evaluation: Die Datenquelle</title>
		<link>http://jochen.jochen-manns.de/index.php/2009/06/21/wpf-evaluation-die-datenquelle/</link>
		<comments>http://jochen.jochen-manns.de/index.php/2009/06/21/wpf-evaluation-die-datenquelle/#comments</comments>
		<pubDate>Sun, 21 Jun 2009 11:48:37 +0000</pubDate>
		<dc:creator>JMS</dc:creator>
		
		<category><![CDATA[Software]]></category>

		<category><![CDATA[VCR.NET]]></category>

		<guid isPermaLink="false">http://jochen.jochen-manns.de/index.php/2009/06/21/wpf-evaluation-die-datenquelle/</guid>
		<description><![CDATA[WPF ist sehr flexibel, wenn es darum geht, Daten an Oberflächenelemente zu binden. Als Datenquelle für mein kleines Beispiel dient der SOAP Web Service des VCR.NET Recording Service (ich denke aber, dass die folgenden Überlegungen für WCF sehr ähnlich sein werden) und dabei vor allem der Abruf der vollständigen Programmzeitschrift für ein Geräteprofil. Ich verwende [...]]]></description>
			<content:encoded><![CDATA[<p>WPF ist sehr flexibel, wenn es darum geht, Daten an Oberflächenelemente zu binden. Als Datenquelle für mein kleines Beispiel dient der SOAP Web Service des VCR.NET Recording Service (ich denke aber, dass die folgenden Überlegungen für WCF sehr ähnlich sein werden) und dabei vor allem der Abruf der vollständigen Programmzeitschrift für ein Geräteprofil. Ich verwende hier bewusst die gesamte Programmzeitschrift, da es genau die Aufgabe des Beispielprogramms sein soll, diese geeignet zu filtern.</p>
<p>Wenn man eine Anwendung an eine Web Service bindet, so werden eine Reihe von Proxy Klassen im Projekt erzeugt (Unterverzeichnis <a href='http://sources.psimarron.net/Evaluations/VCR.NET%20Program%20Guide%20(WPF)/Web%20References/'>Web References</a>). Im Beispiel liefert die entscheidende Methode (GetEPGData) ein Feld mit EPGEvent Instanzen. Die Einträge der Programmzeitschrift sind allerdings zur direkten Darstellung wenig geeignet, enthalten sie doch den Startzeitpunkt in GMT / UTC Notation und statt des Endzeitpunktes die Dauer in Sekunden.</p>
<p>Glücklicherweise werden alle Proxy Klassen als partiellen Klassen (partial class) angelegt, so dass es ein Einfaches ist, diese mit geeigneten Eigenschaften und Methoden zu ergänzen. Im Beispiel wird dies <a href='http://sources.psimarron.net/Evaluations/VCR.NET%20Program%20Guide%20(WPF)/ProgramGuide.cs'>hier</a> gezeigt. Die Klasse EPGEvent bietet nun einen einfachen Zugriff auf Start und Ende in der lokalen Zeitzone und einige Hilfseigenschaften, die zur Variation der Darstellung benötigt werden (etwa meldet IsCurrent ob die Sendung jetzt gerade läuft). Zusätzlich wurden die Klassen zur Programmierung von Aufzeichnungen erweitert. Zu einem Auftrag (VCRJob) können nun einfach neue Aufzeichnungen hinzugefügt werden und eine Aufzeichnung (VCRSchedule) erlaubt eine Pflege der Aufzeichnungsparameter (FirstStart als GMT / UTC und Duration in Minuten) elegant in der lokalen Zeitzone über Start- und Endzeitpunkt.</p>
<p>Interessanter Weise macht der Code in dieser Datei auch einen erheblichen Anteil am Gesamtcode und der Kommunikation mit VCR.NET aus. Für das Laden der Programmzeitschrift wurde ein asynchroner Mechanismus gewählt, der ideal zu den asynchronen dynamischen Werten von WPF (Binding.IsAsync) passt - dazu in einem anderen Artikel. Beim Erzeugen der ProgramGuide Hilfsklasse wird VCR.NET asynchron kontaktiert, ein Abruf der Werte ist erst möglich, wenn eine Antwort bereit steht. Da die Instanz der Hilfsklasse als WPF Ressource angelegt wird (auch dazu an anderer Stelle mehr) wird dieser Vorgang sehr früh beim Starten der Anwendung angeworfen und kann parallel zum Aufbau des Hauptfensters abgearbeitet werden.</p>
<p>Auf technische Details der Implementierung will ich hier nicht eingehen - Thema ist ja WPF. Erwähnt werden sollte allerdings eine wesentliche Unschönheit in dem vorhandenen Code: wenn die SOAP URL des Servers nicht stimmt, so passiert erst einmal gar nichts. Hier muss der Anwender über die Konfiguration eine korrekte Adresse eintragen und die Anwendung neu starten. Für eine produktive Anwendung ein Unding, aber für das Ziel dieser Evaluation völlig ausreichend.</p>
<p>So long</p>
<p>Jochen</p>
]]></content:encoded>
			<wfw:commentRss>http://jochen.jochen-manns.de/index.php/2009/06/21/wpf-evaluation-die-datenquelle/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Hineintapsen in WPF&#8230;</title>
		<link>http://jochen.jochen-manns.de/index.php/2009/06/20/hineintapsen-in-wpf/</link>
		<comments>http://jochen.jochen-manns.de/index.php/2009/06/20/hineintapsen-in-wpf/#comments</comments>
		<pubDate>Sat, 20 Jun 2009 20:18:23 +0000</pubDate>
		<dc:creator>JMS</dc:creator>
		
		<category><![CDATA[.NET]]></category>

		<category><![CDATA[VCR.NET]]></category>

		<guid isPermaLink="false">http://jochen.jochen-manns.de/index.php/2009/06/20/hineintapsen-in-wpf/</guid>
		<description><![CDATA[Schon seit lange schiebe ich es vor mir her, mich einmal etwas mit dem .NET Windows Presentation Framework (WPF) auseinander zu setzen. Um zumindestens einmal ein Gefühl dafür zu bekommen, wie dieses tickt, habe ich mir als Beispiel einfach einmal die Programmzeitschrift des VCR.NET Recording Service herausgegriffen und ein wenig gebastelt. Das Ergebis ist weder [...]]]></description>
			<content:encoded><![CDATA[<p>Schon seit lange schiebe ich es vor mir her, mich einmal etwas mit dem .NET Windows Presentation Framework (WPF) auseinander zu setzen. Um zumindestens einmal ein Gefühl dafür zu bekommen, wie dieses tickt, habe ich mir als Beispiel einfach einmal die Programmzeitschrift des VCR.NET Recording Service herausgegriffen und ein wenig gebastelt. Das Ergebis ist weder eine fertige Anwendung noch ein Muster für WPF Programmierung - beides ganz sicher nicht! Ich habe allerdings versucht, die wichtigsten Aspekte des WPF wenigstens einmal anzufassen - wobei alles rund um ein echtes Design nicht betrachtet wurde. Im Zentrum geht es dabei um die dynamische Darstellung von Daten mit dem Versuch, echte (C# et al) Programmlogik so wenig wie möglich zu nutzen und so viel wie möglich auf die Dynamik von WPF und XAML zurückzugreifen.</p>
<p>Wie dem auch sein: ich habe mal eine Version <a href="http://downloads.psimarron.net/Debug/ProgramGuide.zip">hochgeladen</a> - dito der aktuelle <a href="http://sources.psimarron.net/Evaluations/VCR.NET%20Program%20Guide%20(WPF)/">Quelltext</a>. In den nächsten Tagen wird es hier im BLog einige Kommentare dazu geben, wobei ich auch für mich nochmal durch das Gelernte gehen werden (kann also sein, dass sich Quellen und Anwendung dabei noch verändern). Ich werde versuchen, mich jeweils auf einzelne Themen zu beschränken und dabei auch erläutern, was wie und warum geht und was nicht (ja, irgendwie habe ich nicht wirklich alles ans Laufen bekommen). Vielleicht hilft das dem einen oder anderen WPF Einsteiger, auf die richtigen Ideen zu kommen - immer vor dem Hintergrund, dass ich selbst natürlich noch blutiger Laie bin.</p>
<p>Viel Spaß</p>
<p>Jochen</p>
<p><a href='http://jochen.jochen-manns.de/__oneclick_uploads/2009/06/pic.jpg' title='pic.jpg'><img src='http://jochen.jochen-manns.de/__oneclick_uploads/2009/06/pic.thumbnail.jpg' alt='pic.jpg' border="0"/></a></p>
]]></content:encoded>
			<wfw:commentRss>http://jochen.jochen-manns.de/index.php/2009/06/20/hineintapsen-in-wpf/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Puh - 3.9 fertig</title>
		<link>http://jochen.jochen-manns.de/index.php/2009/05/26/puh-39-fertig/</link>
		<comments>http://jochen.jochen-manns.de/index.php/2009/05/26/puh-39-fertig/#comments</comments>
		<pubDate>Tue, 26 May 2009 22:29:45 +0000</pubDate>
		<dc:creator>JMS</dc:creator>
		
		<category><![CDATA[DVB.NET]]></category>

		<category><![CDATA[VCR.NET]]></category>

		<guid isPermaLink="false">http://jochen.jochen-manns.de/index.php/2009/05/26/puh-39-fertig/</guid>
		<description><![CDATA[Ich habe nun endlich die 3.9er Version meiner DVB Software freigeben. Auch wenn es eigentlich nichts Halbes (der kleine Schritt nach 3.5.1) und Ganzes (der große Schritt nach 4.0) ist, bin ich mit dem Erreichten doch ganz zufrieden. Immerhin funktioniert die neue Infrastruktur recht gut und DVB.NET ist nun nicht mehr an der Urarchitektur nahe [...]]]></description>
			<content:encoded><![CDATA[<p>Ich habe nun endlich die 3.9er Version meiner DVB Software freigeben. Auch wenn es eigentlich nichts Halbes (der kleine Schritt nach 3.5.1) und Ganzes (der große Schritt nach 4.0) ist, bin ich mit dem Erreichten doch ganz zufrieden. Immerhin funktioniert die neue Infrastruktur recht gut und DVB.NET ist nun nicht mehr an der Urarchitektur nahe der Nexus API orientiert. Ich hoffe, dass insbesondere VCR.NET 3.9 die hohe Stabilität der Vorgängerversionen halten kann und dass nicht allzu viele Patches nachkleckern (4 waren es bei der 3.5 und die 3.9 hat relativ wenig Tests im PayTV Umfeld, daher abwarten).</p>
<p>Ich werde jetzt erst mal eine Weile was anderes machen und vermutlich im Spätherbst schauen, dass die &#8216;echte&#8217; 4.0 in die Gänge kommt. Was danach passiert, steht in den Sternen&#8230;</p>
<p>Jochen</p>
]]></content:encoded>
			<wfw:commentRss>http://jochen.jochen-manns.de/index.php/2009/05/26/puh-39-fertig/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Vista UAC vs. Full Trust</title>
		<link>http://jochen.jochen-manns.de/index.php/2009/05/20/vista-uac-vs-full-trust/</link>
		<comments>http://jochen.jochen-manns.de/index.php/2009/05/20/vista-uac-vs-full-trust/#comments</comments>
		<pubDate>Wed, 20 May 2009 16:05:36 +0000</pubDate>
		<dc:creator>JMS</dc:creator>
		
		<category><![CDATA[.NET]]></category>

		<guid isPermaLink="false">http://jochen.jochen-manns.de/index.php/2009/05/20/vista-uac-vs-full-trust/</guid>
		<description><![CDATA[Da ich nun Vista habe, habe ich auch die UAC aktiviert. Mit einem sehr eigenartigen Effekt betreffs der Nutzung von DVB.NET 3.9: ich wollte mal eben so ein kleines Testprogramm machen und starte Visual Studio 2008 als Normalanwender (nicht als Administrator). C# Projekt angelegt und JMS.DVB.Common aus dem GAC als Referenz hinzugefügt. Keine Fehlermeldung, aber [...]]]></description>
			<content:encoded><![CDATA[<p>Da ich nun Vista habe, habe ich auch die UAC aktiviert. Mit einem sehr eigenartigen Effekt betreffs der Nutzung von DVB.NET 3.9: ich wollte mal eben so ein kleines Testprogramm machen und starte Visual Studio 2008 als Normalanwender (nicht als Administrator). C# Projekt angelegt und JMS.DVB.Common aus dem GAC als Referenz hinzugefügt. Keine Fehlermeldung, aber die Klassen der Bibliothek stehen mir nicht zur Verfügung. Nachdem ich das Projekt mit einem Strong Name versehen habe, geht es. Was ist passiert? Ich vermute, dass hier AllowPartiallyTrustedCallers(Attribute) zuschlägt, das DVB.NET bewusst nicht verwendet: mein C# Projekt ist ohne Strong Name nicht berechtigt, die Bibliothek zu verwenden. Ich weiss nicht, ob es gegangen wäre, wenn ich VS als Administrator gestartet habe, aber in jedem Fall ein erst mal (zumindest für mich) überraschender Effekt - ohne irgendwelche Fehlermeldungen im VS.</p>
<p>Happy Coding</p>
<p>Jochen</p>
]]></content:encoded>
			<wfw:commentRss>http://jochen.jochen-manns.de/index.php/2009/05/20/vista-uac-vs-full-trust/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Spaß mit GetHashCode() oder wie man ein Dictionary verwirrt</title>
		<link>http://jochen.jochen-manns.de/index.php/2009/04/14/spas-mit-gethashcode-oder-wie-man-ein-dictionary-verwirrt/</link>
		<comments>http://jochen.jochen-manns.de/index.php/2009/04/14/spas-mit-gethashcode-oder-wie-man-ein-dictionary-verwirrt/#comments</comments>
		<pubDate>Tue, 14 Apr 2009 22:52:48 +0000</pubDate>
		<dc:creator>JMS</dc:creator>
		
		<category><![CDATA[.NET]]></category>

		<guid isPermaLink="false">http://jochen.jochen-manns.de/index.php/2009/04/14/spas-mit-gethashcode-oder-wie-man-ein-dictionary-verwirrt/</guid>
		<description><![CDATA[Möchte man sehr eigenartige und kaum nachvollziehbare Seiteneffekte vermeiden, so sollte man tunlichst darauf achten, dass die Schlüsselklasse eines Dictionary unveränderlich ist, wie etwa Dictionary&#60;string, &#8230;&#62; oder Dictionary&#60;int, &#8230;&#62;. Aber eigentlich tut es doch jede Klasse, die vernünftig GetHashCode() und Equals() unterstützt, oder?
Nehmen wir einmal eine solche Klasse:

class ChangableNumber
{
  public int Number { get; [...]]]></description>
			<content:encoded><![CDATA[<p>Möchte man sehr eigenartige und kaum nachvollziehbare Seiteneffekte vermeiden, so sollte man tunlichst darauf achten, dass die Schlüsselklasse eines Dictionary unveränderlich ist, wie etwa Dictionary&lt;string, &#8230;&gt; oder Dictionary&lt;int, &#8230;&gt;. Aber eigentlich tut es doch jede Klasse, die vernünftig GetHashCode() und Equals() unterstützt, oder?</p>
<p>Nehmen wir einmal eine solche Klasse:<br />
<code><br />
class ChangableNumber<br />
{<br />
  public int Number { get; set; }<br />
  public override int GetHashCode()<br />
  {<br />
    return Number.GetHashCode();<br />
  }<br />
  public override bool Equals( object obj )<br />
  {<br />
    ChangableNumber other = obj as ChangableNumber;<br />
    if (null == other) return false;<br />
    return (Number == other.Number);<br />
  }<br />
}<br />
</code></p>
<p>Und bauen uns ein Dictionary mit einem Schlüssel, den wir verändern. Was erzeugt wohl das folgende Programm als Ausgabe:<br />
<code><br />
ChangableNumber c1 = new ChangableNumber { Number = 1 };<br />
Dictionary<ChangableNumber, bool> dict = new Dictionary<ChangableNumber, bool>();<br />
dict[c1] = true;<br />
Console.WriteLine( dict.ContainsKey( c1 ) );<br />
c1.Number = 4;<br />
Console.WriteLine( dict.ContainsKey( c1 ) );<br />
c1.Number = 1;<br />
Console.WriteLine( dict.ContainsKey( c1 ) );<br />
</code></p>
<p>Nun, erst mal wie erwartet: true (1 ist drin), false (4 natürlich nicht) und true (1 ist wieder drin). Was aber, wenn GetHashCode() zufälligerweise für den veränderten Wert den selben Schlüssel liefert (respektive dieser versehen mit dem Modulo des Dictonary den selben Wert hat)? Das ist einfach zu testen: der Inhalt von GetHashCode() wird durch return 1; ersetzt. Nun ist das Ergebnis true, true und wieder true. Wie kommt die 4 denn nun in das Dictionary?</p>
<p>Der Trick ist einfach: ein Dictionary nimmt den Wert von GetHashCode() und ermittelt daraus zum Beispiel durch ein Modulo (mit einer Primzahl, muss aber nicht) einen Indexwert. Für jeden Indexwert wird eine Liste von Schlüssel / Wert [interessiert hier nicht] Paaren verwaltet, i.e. eine Liste enthält alle Schlüssel, die aus Sicht des Dictionary den gleichen Hash haben. </p>
<p>Im ersten Beispiel waren diese (zufällig) unterschiedlich, so dass das Dictionary beim Anlegen eine Liste (sagen wir mal 1) mit einem Schlüssel / Wert Paar anlegte. Das Ändern in 4 führt dazu, dass bei der Prüfung mittels ContainsKey eine nicht vorhandene Liste (4 oder was auch immer) gesucht wird. Diese ist leer, also liefert ContainsKey false.</p>
<p>Im zweiten Beispiel wird nach der Änderung aber die (immer einzige) Liste (1) untersucht. Diese ist nun nicht leer, so dass alle Schlüssel mittels Equals verglichen werden. Natürlich passt unser Schlüssel nun immer, da er mit sich selbst verglichen wird (i.e. in diesem Beispiel kann man jeden beliebigen Wert zuweisen, das zweite ContainsKey ist immer true). Für das ursprüngliche Beispiel wäre übrigens -2147483647 (0&#215;80000001) der zugehörige Killerwert - vermutlich der einzige.</p>
<p>Und das Fazit? Veränderliche Schlüssel für ein Dictionary sollten nur mit vorherigem Nachdenken verwendet werden.</p>
<p>Viel Glück dabei</p>
<p>Jochen</p>
]]></content:encoded>
			<wfw:commentRss>http://jochen.jochen-manns.de/index.php/2009/04/14/spas-mit-gethashcode-oder-wie-man-ein-dictionary-verwirrt/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Kleine Falle ASP.NET Hosting: HttpListener und Threads</title>
		<link>http://jochen.jochen-manns.de/index.php/2009/03/14/kleine-falle-aspnet-hosting-httplistener-und-threads/</link>
		<comments>http://jochen.jochen-manns.de/index.php/2009/03/14/kleine-falle-aspnet-hosting-httplistener-und-threads/#comments</comments>
		<pubDate>Sat, 14 Mar 2009 15:12:46 +0000</pubDate>
		<dc:creator>JMS</dc:creator>
		
		<category><![CDATA[.NET]]></category>

		<category><![CDATA[VCR.NET]]></category>

		<guid isPermaLink="false">http://jochen.jochen-manns.de/index.php/2009/03/14/kleine-falle-aspnet-hosting-httplistener-und-threads/</guid>
		<description><![CDATA[Die einfachste Methode, ASP.NET zu hosten ist es, den HttpListener als HTTP Protokollschicht einzusetzen (wenn man nicht gerade eine eigene Implementierung schreiben will). Allerdings gibt es hier einen kleinen Haken: der HttpListener scheint an den Thread gebunden zu sein, der ihn gestartet hat (Start oder BeginGetContext). 
Startet man den Listener auf dem Haupthread der Anwendung, [...]]]></description>
			<content:encoded><![CDATA[<p>Die einfachste Methode, ASP.NET zu hosten ist es, den <em>HttpListener</em> als HTTP Protokollschicht einzusetzen (wenn man nicht gerade eine eigene Implementierung schreiben will). Allerdings gibt es hier einen kleinen Haken: der <em>HttpListener</em> scheint an den Thread gebunden zu sein, der ihn gestartet hat (<em>Start</em> oder <em>BeginGetContext</em>). </p>
<p>Startet man den Listener auf dem Haupthread der Anwendung, funktioniert alles wie gewünscht und der Listener erkennt automatisch das Ende der Anwendung. So weit so gut. Wenn man allerdings einen Thread verwendet, der explizit oder implizit beendet wird, so terminiert auch der Listener. In meinem Fall knallte es beim expliziten Beenden: ich hatte einen Thread, der einfach nur den Listener konfigurierte und startet und sich dann beendet - damit die Initialisierung der Anwendung (in diesem Fall der VCR.NET Windows Dienst) im Hauptstrang so schnell wie möglich durchläuft. </p>
<p>Mit <em>ThreadPool.QueueUserWorkItem</em> geht es dann, aber mit einer im Hintergrund drohenden Gefahr: der <em>ThreadPool</em> beendet die Aufgabe und verwendet den Thread dann später für andere Aufgaben weiter. Der Listener bleibt an diesen Thread gebunden, der überhaupt nichts mehr mit ihm zu tun hat. Und wenn der ThreadPool irgendwann mal einen Thread wegwirft? Den Fehler findet man vermutlich nie!</p>
<p>Ich habe mich daher entschieden, mich nicht auf die Willkür zu verlassen und halte den Thread, der den Listener hochfährt, bis zum Ende der Anwendung oben (über ein <em>Manual/AutoResetEvent</em>). Nur so habe ich ein gutes Gefühl, dass nicht doch plötzlich die Kommunikation des Clients zum ASP.NET zusammenbricht.</p>
<p>Zumindest sollte man das im Hinterkopf haben!</p>
<p>Jochen</p>
]]></content:encoded>
			<wfw:commentRss>http://jochen.jochen-manns.de/index.php/2009/03/14/kleine-falle-aspnet-hosting-httplistener-und-threads/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Serverarchitektur bei ASP.NET Hosting</title>
		<link>http://jochen.jochen-manns.de/index.php/2009/03/03/serverarchitektur-bei-aspnet-hosting/</link>
		<comments>http://jochen.jochen-manns.de/index.php/2009/03/03/serverarchitektur-bei-aspnet-hosting/#comments</comments>
		<pubDate>Tue, 03 Mar 2009 21:13:57 +0000</pubDate>
		<dc:creator>JMS</dc:creator>
		
		<category><![CDATA[.NET]]></category>

		<category><![CDATA[VCR.NET]]></category>

		<guid isPermaLink="false">http://jochen.jochen-manns.de/index.php/2009/03/03/serverarchitektur-bei-aspnet-hosting/</guid>
		<description><![CDATA[Vielleicht einfach ein paar kurze Gedanken zu den letzten Arbeiten an VCR.NET 3.9, etwas abstrahiert. Im Endeffekt geht es darum, eine Serverfunktionalität mit präziser Lebenszeitkontrolle mit einer Web Oberfläche anzubieten. Die Kontrolle der Lebenszeit läßt sich ideal durch das Hosten des Servers in einem Windows Dienst erreichen, für die Web Oberfläche wäre natürlich der Microsoft [...]]]></description>
			<content:encoded><![CDATA[<p>Vielleicht einfach ein paar kurze Gedanken zu den letzten Arbeiten an VCR.NET 3.9, etwas abstrahiert. Im Endeffekt geht es darum, eine Serverfunktionalität mit präziser Lebenszeitkontrolle mit einer Web Oberfläche anzubieten. Die Kontrolle der Lebenszeit läßt sich ideal durch das Hosten des Servers in einem Windows Dienst erreichen, für die Web Oberfläche wäre natürlich der Microsoft Internet Information Server die bevorzugte Lösung. Mit dem ASP.NET Hosting läßt sich beides weitgehend kombinieren (es ist allerdings kaum möglich, alle Autorisierungsoptionen des IIS nachzubilden, aber das braucht man auch nicht immer).</p>
<p>Zu beachten ist allerdings, dass ein virtuelles Verzeichnis immer in einer eigenen .NET AppDomain läuft. Unser Ansatz besteht daher immer aus mindestens zwei AppDomains, was einige besondere Aspekte mit sich bringt. Ich stelle hier in Stichworten einmal die beim VCR.NET implementierte Lösung vor.</p>
<p>1. Der .NET Dienst wird natürlich in einer ersten AppDomain gestartet. Hier soll auch der Server leben.<br />
2. Der Server wird als .NET Instanz einer MarshalByRefObject Klasse (Server) erzeugt.<br />
3. Für das ASP.NET Hosting wird eine weitere MarshalByRefObject Klasse (Host) benötigt, die in dem virtuellen Verzeichnis erstellt wird.<br />
4. Nach dem Starten des virtuellen Verzeichnisses erhält Host die Server Referenz aus der ersten AppDomain.<br />
5. Alle Zugriffe aus dem virtuellen Verzeichnis erfolgen über dese Referenz und werden in der ersten AppDomain ausgeführt.<br />
6. Damit die beiden (Server und Host) Inter-AppDomain Referenzen nicht durch die Remoting Lebenszeitkontrolle spontan gelöst werden, melden deren InitializeLifetimeService Methoden null.<br />
7. Alle Klassen, die zwischen den AppDomains ausgetauscht werden sollen, müssen MarshalByRefObject oder [Serializable] sein. VCR.NET setzt auf serialisierbare Klassen, so dass zwar für die Serialisierung und Deserialisierung bezahlt werden muss, die Objekte dann aber ohne Kommunikationsverluste weiter verwendet werden können. Man beachte, dass hier die binäre Serialisierung zum Einsatz kommt - man siehe dazu einen früheren Eintrag in diesem BLog.</p>
<p>Zur Verwaltung der Konfiguration wird ein einziges Konfigurationsobjekt eingesetzt, über das alle Zugriff (auch schreibend) erfolgen. Dieses wird in der ersten AppDomain angelegt. Damit es nicht in alle Klassen durchgereicht werden muss (hier gibt es etwa Methoden wie Log(string message)), erhählt die Konfigurationsklasse (Config) ein statisches Feld Current, dass bei der Intialisierung des Windows Dienstes auf der ersten AppDomain belegt wird (Config.Current = new Config()). Zusätzlich bietet die Server Klasse eine Eigenschaft zum Zugriff auf Config.Current an. In Schritt 4. oben wird in der AppDomain des virtuellen Verzeichnisses eine Referenz des eindeutigen Konfigurationsobjektes in das statische Feld als Referenz übernommen (Config.Current = Server.CurrentConfiguration) - ein anderes statisches Feld, da statische Felder nur pro AppDomain eindeutig sind. So arbeiten beide AppDomains immer mit der selben Konfiguration - Config ist natürlich ein MarshalByRefObject, dessen InitializeLifetimeService null liefert.</p>
<p>Nun, für einige ist das vermutlich trivial, aber vielleicht hilft die Information hier dem einen oder anderen, einige Fallstricke zu vermeiden und etwas Zeit zu sparen.</p>
<p>Viel Glück</p>
<p>Jochen</p>
]]></content:encoded>
			<wfw:commentRss>http://jochen.jochen-manns.de/index.php/2009/03/03/serverarchitektur-bei-aspnet-hosting/feed/</wfw:commentRss>
		</item>
		<item>
		<title>VCR.NET 3.9 Verluste: SOAP Web Service</title>
		<link>http://jochen.jochen-manns.de/index.php/2009/03/03/vcrnet-39-verluste-soap-web-service/</link>
		<comments>http://jochen.jochen-manns.de/index.php/2009/03/03/vcrnet-39-verluste-soap-web-service/#comments</comments>
		<pubDate>Tue, 03 Mar 2009 20:52:17 +0000</pubDate>
		<dc:creator>JMS</dc:creator>
		
		<category><![CDATA[VCR.NET]]></category>

		<guid isPermaLink="false">http://jochen.jochen-manns.de/index.php/2009/03/03/vcrnet-39-verluste-soap-web-service/</guid>
		<description><![CDATA[Schon von Anbeginn an bot der Windows Dienst VCR.NET Recording Service eine SOAP Schnittstelle an, die von Clients zur Steuerung verwendet werden konnten. Tatsächlich gibt es in 3.5 zwei verschiedene Schnittstellen, eine für den regulären Betrieb wie die Aufzeichnungsplanung und einen für den so genannten Zapping oder LIVE Modus. Beide Schnittstellen werden zudem in zwei [...]]]></description>
			<content:encoded><![CDATA[<p>Schon von Anbeginn an bot der Windows Dienst <em>VCR.NET Recording Service</em> eine SOAP Schnittstelle an, die von Clients zur Steuerung verwendet werden konnten. Tatsächlich gibt es in 3.5 zwei verschiedene Schnittstellen, eine für den regulären Betrieb wie die Aufzeichnungsplanung und einen für den so genannten Zapping oder LIVE Modus. Beide Schnittstellen werden zudem in zwei Varianten angeboten, eine für die Versionen vom VCR.NET, die nur ein Geräteprofil verwenden konnten und eine, bei der das Geräteprofil bei jeder Operation über seinen Namen ausgewählt werden kann.</p>
<p>Zukünftige VCR.NET Versionen (die nach der 3.9, so es sie denn geben sollte) werden möglicherweise veränderte SOAP Schnittstellen auf Basis von WCF (Windows Communication Framework) anbieten. Für die 3.9 wird es keine neuen Varianten der beiden primären Web Services geben, vielmehr wird VCR.NET 3.9 versuchen, auf Basis der neuen Infrastruktur die alten Schnittstellen unverändert anzubieten. Das geht soweit auch schon, hat aber einige Nachteile - die vermutlich aber kaum jemanden betreffen.</p>
<p>Zum einen können neue Funktionalitäten nicht genutzt werden, wenn diese über die Protokollstrukturen der alten Schnittstellen nicht verfügbar sind. Das ist eher unkritisch, hier ging es etwa um die präzisere Auswahl der Quellen (früher Sender genannt). Kritischer ist aber, dass VCR.NET einige Informationen intern nicht mehr pflegt und auf Anfrage daher auch nicht mehr zur Verfügung stellen kann. Hier ist vor allem die Senderbeschreibung zu erwähnen: DVB.NET stellt ab der Version 3.9 (auf der VCR.NET 3.9 basiert) zum Beispiel die Daten zu den Tonspuren nicht mehr zur Verfügung. Bei Anfrage an VCR.NET 3.9 über die alten Schnittstellen werden hier leere Listen geliefert. Tatsächlich benötigt der DVB.NET / VCR.NET Viewer als einer der VCR.NET SOAP Clients diese Information überhaupt nicht, anderen Clients wird es ähnlich gehen. Genauso ist es nicht exakt möglich, die Auswahl der Teildatenströme auf die vier Wahrheitswerte (Alle Sprachen, Dolby Digital, DVB Untertitel, Videotext) abzubilden, da die interne Verwaltung nun sehr viel feinere Variationen zulässt. Allerdings versucht VCR.NET sein Bestes, ein möglichst exaktes Abbild der tatsächlichen Konfiguration zu übermitteln.</p>
<p>In Einzelfällen ist zu klären, an welchen Stellen die modifizierten Informationen ein Problem darstellen. Im Wesentlichen bleibt aber die folgende Aussage: VCR.NET 3.9 wird voraussichtlich keine neuen SOAP Dienste oder Varianten der alten anbieten. Die vorhandenen Clients wie der Viewer oder das Kontrollzentrum werden die alten SOAP Schnittstellen benutzen - vielleicht wird es das eine oder andere Hintertürchen geben, um eine versionsunabhängige Version des Viewers zu erstellen - das Kontrollzentrum ist da eher harmlos.</p>
<p>Bis bald</p>
<p>Jochen</p>
]]></content:encoded>
			<wfw:commentRss>http://jochen.jochen-manns.de/index.php/2009/03/03/vcrnet-39-verluste-soap-web-service/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Kleine Fallstricke der Serialisierung</title>
		<link>http://jochen.jochen-manns.de/index.php/2009/02/23/kleine-fallstricke-der-serialisierung/</link>
		<comments>http://jochen.jochen-manns.de/index.php/2009/02/23/kleine-fallstricke-der-serialisierung/#comments</comments>
		<pubDate>Mon, 23 Feb 2009 09:00:48 +0000</pubDate>
		<dc:creator>JMS</dc:creator>
		
		<category><![CDATA[.NET]]></category>

		<guid isPermaLink="false">http://jochen.jochen-manns.de/index.php/2009/02/23/kleine-fallstricke-der-serialisierung/</guid>
		<description><![CDATA[Eine Klasse soll als Ergebnis eines guten alten ASMX basierten SOAP Web Service von einem Server an einen Client gesendet werden. Die Klasse hat neben den Eigenschaften, die den Client etwas angehen, auch noch interne Strukturen, die für die Verarbeitung genutzt werden. Diese werden geeignet markiert, etwa so:

[Serializable, XmlType("Test")] public class Item
{
[XmlAttribute("id")] public string UniqueName [...]]]></description>
			<content:encoded><![CDATA[<p>Eine Klasse soll als Ergebnis eines guten alten ASMX basierten SOAP Web Service von einem Server an einen Client gesendet werden. Die Klasse hat neben den Eigenschaften, die den Client etwas angehen, auch noch interne Strukturen, die für die Verarbeitung genutzt werden. Diese werden geeignet markiert, etwa so:<br />
<code><br />
[Serializable, XmlType("Test")] public class Item<br />
{<br />
[XmlAttribute("id")] public string UniqueName { get; set; }<br />
[XmlIgnore] public Context State { get; set; }<br />
}<br />
</code></p>
<p>Hier werden automatische Felder (auto-implemented properties) benutzt, i.e. zu den deklarierten .NET Eigenschaften UniqueName und State gibt es für den Entwickler unsichtbar zugehörige .NET Felder der Klasse. Was aber, wenn die Serveranwendung tatsächlich aus mehreren AppDomains besteht, zwischen denen Instanzen der Klasse ebenso ausgetauscht werden sollen - typisch ist ein (ASP.NET) Hosting Szenario, wobei die eigentlichen Serveralgorithmen in einer AppDomain mit kontrolliertem Lebenszyklus (etwa einem Windows Dienst) implementiert sind und eine oder mehrere andere AppDomains die Kommunikation mit dem Client regeln und etwa dynamisch bei Veränderungen nachgeladen werden (etwa durch die ASP.NET Dateiüberwachung).</p>
<p>Die hier verwendete SOAP Serialisierung zum Client verwendet die XML Serialisierung. Diese berücksichtigt ausschließlich öffentliche (public) .NET Eigenschaften, das Ausschließen einzelner Eigenschaften geschieht wie im Beispiel durch das XmlIgnoreAttribute. Zwischen AppDomains wird allerdings die binäre Serialisierung verwenden (Kann man das wählen? Ich habe nichts dazu gefunden.), die sich an .NET Feldern und dem NonSerializedAttribute orientiert. Konkret heißt das im Beispiel, dass zwischen AppDomains <strong>beide</strong> Eigenschaften ausgetauscht werden.</p>
<p>Das kann natürlich so gewollt sein, keine Frage. Aber dann wäre im Beispiel der Context auch entweder serialisierbar oder ein MarshalByRefObject. Passiert es ungewollt, so kann das je nach Situation einen empfindlichen Einfluss auf die Laufzeiten haben, da mit kleinen Instanzen eventuell sehr große angehängte Objekte stillschweigend mit serialisiert werden oder unerwartete AppDomain kreuzende Aufrufe vorgenommen werden. Leider hat Microsoft aber wohl den einfachen Weg nicht implementiert, der für <strong>event</strong> Felder prima funktioniert:<br />
<code><br />
[XmlIgnore][field:NonSerialized] public Context State { get; set; }<br />
</code></p>
<p>Daher ist es notwendig, auf die automatischen Eigenschaften zu verzichten und selbst ein Feld anzulegen. Nicht tragisch, aber auch nicht elegant.<br />
<code><br />
[NonSerialized] private Context m_State;<br />
[XmlIgnore] public Context State { get { return m_State; } set { m_State = value; } }<br />
</code></p>
<p>DVB.NET hat in der Klasse SourceSelection ein weiteres Problem: hier sollen Eigenschaften, die auf Objekte verweisen, als Zeichenkette serialisiert werden, wobei diese durch eindeutige Namen der Objekte zusammengesetzt werden. Dabei kommt man leider um <strong>ISerializable</strong> und Konsorten nicht herum, wenn man die binäre Serialisierung genauso nutzen möchte wie die XML Serialisierung - egal ob explizit oder wie beschrieben implizit durch AppDomain Grenzen bedingt.</p>
<p>Happy Coding</p>
<p>Jochen</p>
]]></content:encoded>
			<wfw:commentRss>http://jochen.jochen-manns.de/index.php/2009/02/23/kleine-fallstricke-der-serialisierung/feed/</wfw:commentRss>
		</item>
		<item>
		<title>VCR.NET 3.9 Verluste: Aktualisierung der Version</title>
		<link>http://jochen.jochen-manns.de/index.php/2009/02/22/vcrnet-39-verluste-aktualisierung-der-version/</link>
		<comments>http://jochen.jochen-manns.de/index.php/2009/02/22/vcrnet-39-verluste-aktualisierung-der-version/#comments</comments>
		<pubDate>Sun, 22 Feb 2009 21:16:04 +0000</pubDate>
		<dc:creator>JMS</dc:creator>
		
		<category><![CDATA[VCR.NET]]></category>

		<guid isPermaLink="false">http://jochen.jochen-manns.de/index.php/2009/02/22/vcrnet-39-verluste-aktualisierung-der-version/</guid>
		<description><![CDATA[Bisher habe ich mir immer sehr viel Mühe gegeben, dass bei einer aktualisierenden Installation (Deinstallation einer älteren Version und Installation der jeweils aktuellsten) der VCR.NET Recording Service sofort wieder einsetzbar ist. Das betrifft sowohl die Konfiguration als auch den Aufzeichnungsplan. Für 3.9 wird es einen Abstrich geben, der aber vermutlich kaum jemanden betrifft: erfolgt die [...]]]></description>
			<content:encoded><![CDATA[<p>Bisher habe ich mir immer sehr viel Mühe gegeben, dass bei einer aktualisierenden Installation (Deinstallation einer älteren Version und Installation der jeweils aktuellsten) der VCR.NET Recording Service sofort wieder einsetzbar ist. Das betrifft sowohl die Konfiguration als auch den Aufzeichnungsplan. Für 3.9 wird es einen Abstrich geben, der aber vermutlich kaum jemanden betrifft: erfolgt die Aktualisierung von einer Version vor 2.7 (ja, vor dem Punkt steht eine 2 und keine 3), so geht der Aufzeichnungsplan verloren. Die Konfiguration bleibt erhalten. Hintergrund ist, dass bis zur 2.6 die Aufzeichnungspläne als SOAP serialisierte XML Dateien gespeichert wurden und ab 2.7 ein neues Format verwendet wurde. VCR.NET hat beim ersten Starten automatisch eine verlustfreie Konvertierung vorgenommen. Mit 3.9 wurde das neue Format leicht modifiziert, um einige der Möglichkeiten der nächsten DVB.NET Generation schon einmal verfügbar zu machen. Auch hier gibt es wieder eine automatische Konvertierung, allerdings nur von dem 2.7er Format an - die doppelte Konvertierung wäre möglich, rechtfertigt sich aber nicht, da 2.6 einfach zu alt ist.</p>
<p>Wer denn dann wirklich eine 2.6 betreibt und unbedingt auf die 3.9 will: erst einmal irgendeine Zwischenversion installieren, VCR.NET einmal durchstarten und dann die Zwischenversion wieder deinstallieren. Das Durchstarten übernimmt den ersten Konvertierungsschritt.</p>
<p>Sollte es tatsächlich jemanden betreffen und Mühe machen: sorry! </p>
<p>Für die meisten anderen Anwender einfach zum Lesen und sofortigen Vergessen <img src='http://jochen.jochen-manns.de/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Jochen</p>
]]></content:encoded>
			<wfw:commentRss>http://jochen.jochen-manns.de/index.php/2009/02/22/vcrnet-39-verluste-aktualisierung-der-version/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>

