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

<channel>
	<title>Das Megos .NET-Weblog</title>
	<atom:link href="http://megos.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://megos.wordpress.com</link>
	<description>Die .NET-Abenteuer einer Brugger Software-Firma</description>
	<lastBuildDate>Sat, 31 Oct 2009 14:09:32 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>de</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<cloud domain='megos.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/6f433c043797df5b21790ef281bf679e?s=96&#038;d=http://s.wordpress.com/i/buttonw-com.png</url>
		<title>Das Megos .NET-Weblog</title>
		<link>http://megos.wordpress.com</link>
	</image>
			<item>
		<title>Visual Studio Gallery</title>
		<link>http://megos.wordpress.com/2009/10/31/visual-studio-gallery/</link>
		<comments>http://megos.wordpress.com/2009/10/31/visual-studio-gallery/#comments</comments>
		<pubDate>Sat, 31 Oct 2009 14:09:32 +0000</pubDate>
		<dc:creator>René Brunner</dc:creator>
				<category><![CDATA[Keine Kategorie]]></category>
		<category><![CDATA[Visual Studio]]></category>

		<guid isPermaLink="false">http://megos.wordpress.com/?p=262</guid>
		<description><![CDATA[Unter dem Titel Visual Studio Gallery betreibt Microsoft ein Repository für verschiedenste Tools, Controls und Templates, mit deren Hilfe man Visual Studio erweitern kann. Vielleicht ja kalter Kaffee für Sie, aber wenn Sie sich da noch nie umgeschaut haben, könnte es sich lohnen, das nachzuholen.
Die Vielfalt der angebotenen Dinge täuscht ein wenig: Wenn man links [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=megos.wordpress.com&blog=3283101&post=262&subd=megos&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Unter dem Titel <a href="http://visualstudiogallery.msdn.microsoft.com/en-us/">Visual Studio Gallery</a> betreibt Microsoft ein Repository für verschiedenste Tools, Controls und Templates, mit deren Hilfe man Visual Studio erweitern kann. Vielleicht ja kalter Kaffee für Sie, aber wenn Sie sich da noch nie umgeschaut haben, könnte es sich lohnen, das nachzuholen.</p>
<p>Die Vielfalt der angebotenen Dinge täuscht ein wenig: Wenn man links in der Sektion <i>Visual Studio Versions</i> diejenige Version anklickt, die man selbst konkret in Betrieb hat und die Anzeige damit filtert, fällt einiges weg. Und wenn man gleich darunter in der Sektion <i>Cost Categories</i> mit der Wahl von <i>Free</i> alles verschwinden lässt, was Geld kostet oder eine limitierte Probeversion darstellt, bleiben z.B. von total fast 500 Tools nur noch etwa 160 freie Tools für VS2008 übrig. Aber das ist allemal noch eine interessante Menge.</p>
<p>Als ich selbst heute diese Liste der kostenlosen Tools für VS2008 durchging, bin ich beim <a href="http://www.codeplex.com/hyperAddin">HyperAddin</a> hängengeblieben. Damit ist es unter anderem möglich, in Kommentaren Links zu schreiben, die zu irgendeinem Symbol des Projekts führen, denen man folgen kann wie den &#8222;eingebauten&#8220; URL-Links mit Hilfe von <i>Ctrl + Mausklick</i>.</p>
<p>Konkret sieht das so aus:</p>
<pre class="brush: csharp;">
  public class HyperAddinDemo {
    public void Method1() {
    }

    public void Method2() {
      // Hinweis: macht nicht dasselbe wie code:HyperAddinDemo.Method1
    }
  }
</pre>
<p>Links zu beliebig setzbaren Ankerpunkten in irgendeinem File des Projekts statt zu Symbolen sind ebenso möglich.</p>
<p>Ich denke, ich werde das in Betrieb nehmen und schauen, ob solche Links wirklich so nützlich sind, wie ich nach ersten Tests vermute.</p>
<p>Eine Frage steht bei solchen Erweiterungen natürlich immer im Raum: Was passiert, wenn ich auf eine neue Version von Visual Studio wechsle? Wie die Visual Studio Gallery selbst demonstriert, können Addins durchaus spezifisch sein für bestimmte Versionen von Visual Studio; damit besteht die Gefahr, dass ich z.B. beim bevorstehenden Schritt auf VS2010 das gerade liebgewonnene <i>HyperAddin</i> bereits wieder verliere, falls der Autor nicht mitzieht.</p>
<p>Es muss wohl jeder selbst für sich entscheiden, wie er mit diesem Risiko umgehen will und wie er Nutzen jetzt gegen möglichen Verlust bei einem Wechsel von Visual Studio in der Zukunft gegeneinander verrechnet. Konkret bei diesem Addin hat mir in dieser Hinsicht gefallen, dass der Sourcecode zur Verfügung steht und ich mich damit wahrscheinlich selbst durchschlagen könnte bei einem Problem auf einer neuen Plattform.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/megos.wordpress.com/262/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/megos.wordpress.com/262/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/megos.wordpress.com/262/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/megos.wordpress.com/262/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/megos.wordpress.com/262/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/megos.wordpress.com/262/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/megos.wordpress.com/262/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/megos.wordpress.com/262/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/megos.wordpress.com/262/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/megos.wordpress.com/262/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=megos.wordpress.com&blog=3283101&post=262&subd=megos&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://megos.wordpress.com/2009/10/31/visual-studio-gallery/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d144980edde2f1b80ccd246210d9ce5f?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">megosbr</media:title>
		</media:content>
	</item>
		<item>
		<title>Alles wird unscharf</title>
		<link>http://megos.wordpress.com/2009/09/26/alles-wird-unscharf/</link>
		<comments>http://megos.wordpress.com/2009/09/26/alles-wird-unscharf/#comments</comments>
		<pubDate>Sat, 26 Sep 2009 08:41:49 +0000</pubDate>
		<dc:creator>René Brunner</dc:creator>
				<category><![CDATA[Keine Kategorie]]></category>
		<category><![CDATA[Windows 7]]></category>
		<category><![CDATA[WPF]]></category>

		<guid isPermaLink="false">http://megos.wordpress.com/?p=254</guid>
		<description><![CDATA[Fast auf den Tag genau vor 1 Jahr habe ich in diesem Eintrag vom &#8222;unscharfen&#8220; Text in WPF-basierten Applikationen geschrieben. Seither gehört das Wort unscharf zu den absoluten Top-Such-Begriffen, mit denen dieses Blog gefunden wird, was darauf schliessen lässt, dass die Sache einige Leute beschäftigt, wenn nicht sogar nervt.
Es sieht so aus, als wäre Microsoft [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=megos.wordpress.com&blog=3283101&post=254&subd=megos&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Fast auf den Tag genau vor 1 Jahr habe ich in <a href="http://megos.wordpress.com/2008/09/27/die-geschichte-vom-unscharfen-text/">diesem Eintrag</a> vom &#8222;unscharfen&#8220; Text in WPF-basierten Applikationen geschrieben. Seither gehört das Wort <i>unscharf</i> zu den absoluten Top-Such-Begriffen, mit denen dieses Blog gefunden wird, was darauf schliessen lässt, dass die Sache einige Leute beschäftigt, wenn nicht sogar nervt.</p>
<p>Es sieht so aus, als wäre Microsoft unterwegs zu einer überraschenden Lösung für dieses Problem, die man als Bestandteil von Windows Vista und Windows 7 betrachten kann: Man macht einfach Text generell unscharf&#8230;</p>
<p>Windows 7 verwendet <a href="http://de.wikipedia.org/wiki/ClearType">ClearType</a> für Text per Default systemweit, mit nur wenigen Ausnahmen wie etwa der Shell, was eben zur angesprochenen leichten Unschärfe führt. Allerdings muss man sagen, dass Microsoft ClearType um einiges verbessert hat und auch ein eigenes Tuning-Tool dafür mitliefert, damit man auf seiner Hardware das Optimum betreffend Darstellung herausholen kann.</p>
<p>Es gibt in Windows 7 sogar eine etwas versteckte Option, mit der man ClearType ausschalten kann, die z.B. <a href="http://blogs.msdn.com/e7/archive/2009/06/23/engineering-changes-to-cleartype-in-windows-7.aspx">hier</a> (für das englische Windows 7) beschrieben ist, aber so ganz will das nicht klappen: Vieles wird nach dem Ausschalten der Option <i>Smooth edges of screen fonts</i> zwar wieder pixel-scharf, aber Dinge wie die Anzeige der Uhrzeit, Tooltips oder gewisse Kolonnen-Überschriften im Explorer bleiben völlig unbeeindruckt bei der Verwendung von ClearType, und WPF-Applikationen wie etwa das neue Visual Studio 2010 sowieso.</p>
<p>Ich habe mich gefragt, ob die weitgehende Verwendung von ClearType auch damit zusammenhängt, dass Dinge wie der Explorer von Windows 7 als WPF-Applikationen neu geschrieben worden sind. Es ist häufig schwierig, Informationen darüber zu finden, wie genau Microsoft Windows-Interna implementiert; so auch in diesem Fall. Es scheint allerdings unter interessierten Leuten einen gewissen Konsens darüber zu geben, dass das Windows-7-GUI nicht in WPF implementiert sein kann, wie z.B. in einem Posting im Rahmen dieser <a href="http://www.neowin.net/forum/lofiversion/index.php/t764302.html">Diskussion</a> ausgeführt. WPF heisst managed code, der einen gewissen Geschwindigkeitsverlust mit sich bringen kann und für das Framework einiges an Speicher benötigt &#8211; beides Dinge, die Microsoft vermeiden musste, um Windows 7 gegenüber Vista deutlich abzuspecken und schneller zu machen, damit es z.B. Netbook-tauglich wird.</p>
<p>Ich denke nicht, dass man das als Votum gegen WPF deuten sollte, im Stile von &#8222;Ja, wenn nicht mal Microsoft selbst Dinge mit Hilfe von WPF implementiert&#8230;&#8220;. Normale Windows-Business-Applikationen sind nun mal nicht dasselbe wie Kern-Bestandteile von Betriebssystemen, wo ganz andere Bedingungen und Anforderungen die Wahl der Mittel erheblich einschränken.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/megos.wordpress.com/254/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/megos.wordpress.com/254/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/megos.wordpress.com/254/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/megos.wordpress.com/254/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/megos.wordpress.com/254/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/megos.wordpress.com/254/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/megos.wordpress.com/254/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/megos.wordpress.com/254/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/megos.wordpress.com/254/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/megos.wordpress.com/254/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=megos.wordpress.com&blog=3283101&post=254&subd=megos&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://megos.wordpress.com/2009/09/26/alles-wird-unscharf/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d144980edde2f1b80ccd246210d9ce5f?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">megosbr</media:title>
		</media:content>
	</item>
		<item>
		<title>Dynamische Forms</title>
		<link>http://megos.wordpress.com/2009/08/29/dynamisch-forms/</link>
		<comments>http://megos.wordpress.com/2009/08/29/dynamisch-forms/#comments</comments>
		<pubDate>Sat, 29 Aug 2009 09:49:25 +0000</pubDate>
		<dc:creator>René Brunner</dc:creator>
				<category><![CDATA[Keine Kategorie]]></category>
		<category><![CDATA[Designer]]></category>
		<category><![CDATA[Forms]]></category>
		<category><![CDATA[WPF]]></category>

		<guid isPermaLink="false">http://megos.wordpress.com/?p=231</guid>
		<description><![CDATA[In Word 2003 gibt es eine Dialogbox Dokumentvorlagen und Add-Ins, die noch nicht mitbekommen hat, dass Bildschirme heute mehr Auflösung bieten als VGA von Anno Domini 1987:
So kommt es dann zum hier gezeigten Witz des &#8222;vollständigen Pfads&#8220;, der je nach Pfad eben gerade nicht vollständig angezeigt wird, weil schlicht der Platz dazu fehlt in der [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=megos.wordpress.com&blog=3283101&post=231&subd=megos&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>In Word 2003 gibt es eine Dialogbox <i>Dokumentvorlagen und Add-Ins</i>, die noch nicht mitbekommen hat, dass Bildschirme heute mehr Auflösung bieten als VGA von Anno Domini 1987:</p>
<div id="attachment_232" class="wp-caption aligncenter" style="width: 410px"><a href="http://megos.files.wordpress.com/2009/08/dynamicformsa.gif"><img src="http://megos.files.wordpress.com/2009/08/dynamicformsa.gif?w=400&#038;h=300" alt="Dialogbox in Word 2003" title="DynamicFormsA" width="400" height="300" class="size-full wp-image-232" /></a><p class="wp-caption-text">Dialogbox in Word 2003</p></div>
<p>So kommt es dann zum hier gezeigten Witz des &#8222;vollständigen Pfads&#8220;, der je nach Pfad eben gerade nicht vollständig angezeigt wird, weil schlicht der Platz dazu fehlt in der Breite der Dialogbox:</p>
<div id="attachment_239" class="wp-caption aligncenter" style="width: 612px"><a href="http://megos.files.wordpress.com/2009/08/dynamicformsb1.gif"><img src="http://megos.files.wordpress.com/2009/08/dynamicformsb1.gif?w=602&#038;h=225" alt="Vollständiger Pfad?" title="DynamicFormsB" width="602" height="225" class="size-full wp-image-239" /></a><p class="wp-caption-text">Vollständiger Pfad?</p></div>
<p>Auch wenn Word 2007 in dieser Hinsicht unterdessen dazugelernt hat, sehe ich heute mit Windows bzw. mit Windows-Programmen ein grosses Problem bei Forms aller Art, deren Grössen fix sind, mit recht kleinen Grössen notabene, um eben auch mit niedrigen Auflösungen klarzukommen. Ich schätze, dass selbst unter modernen Programmen nur etwa die Hälfte über Forms verfügt, deren Grösse man ändern kann und bei denen sich die Controls intelligent an eine neue Grösse anpassen.</p>
<p>Eine Zeit lang sah es ja so aus, als würde sich das Problem entschärfen, weil man als Programmierer bzw. als Designer von Forms im Laufe der Jahre von stetig grösseren Bildschirmen bei den Anwendern ausgehen durfte. So war es z.B. für die Megos sehr hilfreich, dass der Kanton Aargau um 2000 herum dafür sorgte, dass in allen Steuerämtern des Kantons Bildschirme mit mindestens 1024 mal 768 Pixeln zur Verfügung standen, so dass wir die Forms der Applikation <a href="http://www.megos.ch/uebersicht/verana.html">VERANA</a> (wie z.B. <a href="http://www.megos.ch/images/screenshots/vepers.gif">diese hier</a>) mit dieser Annahme vergleichsweise grosszügig gestalten konnten, und deshalb irgendwelche komplexe Dynamik-Eigenschaften kein Thema waren.</p>
<p>Aber in letzter Zeit scheint sich das Problem wieder zu verschärfen, weil die Vielfalt unterschiedlicher Bildschirmgrössen zunimmt: Wohl ist der Trend zu grösseren Monitoren bei &#8222;normalen&#8220; stationären PCs ungebrochen, aber mehr und mehr Leute arbeiten mit Notebooks, wo den Auflösungen natürliche Grenzen gesetzt sind. Günstige Netbooks kommen zudem zum Teil mit Auflösungen daher, die man schon fast als endgültig überwunden betrachtet hatte, und wer weiss, vielleicht gibt es bald für viele Applikationen die neue Anforderung, sie müssten auch auf Smartphones bedienbar sein, mit der erwähnten VGA-Auflösung aus der PC-Steinzeit!</p>
<p>Für mich stellt sich deshalb die Frage nach dynamischen Forms stärker denn je, was mich auch zu diesem Blog-Eintrag bewogen hat.</p>
<p>Es gibt in .NET bei den Windows Forms einige Unterstützung, die man als Programmierer nutzen kann, wenn man seine Forms &#8222;dynamisch&#8220; betreffend Grösse machen will. Sie wissen, was ich meine: Eigenschaften wie <i>Anchor</i>, <i>Dock</i> und <i>AutoSize</i> bei Controls, und Container Controls wie z.B. das <i>FlowLayoutPanel</i>, welche ihre Kinder nach bestimmten Regeln neu anordnen können, wenn ihre Grösse ändert. Aber insgesamt würde ich sagen, dass man damit nicht allzu weit kommt, wenn Forms ein wenig komplexer werden.</p>
<p>Natürlich sind die Windows-Forms-Klassen flexibel genug, dass ich selber etwas programmieren kann, damit meine Forms dynamischer werden. Aber es ist doch eben gerade der Sinn eines Frameworks wie .NET, dass nicht jedermann ein so grundsätzliches Problem, mit dem man immer und überall konfrontiert ist, stets wieder neu selber lösen muss!</p>
<p>Als Microsoft begannt, WPF als ernstzunehmende Alternative zu Windows Forms zu positionieren, war ich deshalb sehr gespannt, ob sich die Firma in Bezug auf dynamische Forms etwas hat einfallen lassen, das deutlich über den Stand des mittlerweile 10 Jahre alten VB6 hinausgeht. So wie es aussieht, ist WPF in dieser Hinsicht eine Enttäuschung.</p>
<p>Wie sähe denn eine gute Standard-Lösung für dynamische Forms aus? Ich kann auch keine solche aus dem Hut zaubern, aber mir gehen Gedanken durch den Kopf, die auf einen beschreibenden Ansatz hinauslaufen. Wie wäre es, wenn man bei einem Control Bedingungen formulieren könnte, wie etwa die folgenden: &#8222;Control <i>X</i> in Höhe und Breite wachsen lassen, wenn die umgebenden Controls sich verschieben und das zulassen, aber nur bis zu einer Maximalbreite <i>n</i>, und auf alle Fälle nicht breiter als Control <i>Y</i>. Wenn sich unter Control <i>Z</i> mindestens <i>m</i> Millimeter Platz ergeben, dann Control <i>X</i> dorthin umplatzieren und an die Breite von Control <i>Z</i> angleichen.&#8220;</p>
<p>Interessant kann natürlich auch sein, was andere Leute machen, denn schliesslich bietet nicht nur Microsoft Werkzeuge an, mit denen man Forms designen kann. Insbesondere <a href="http://qt.nokia.com/">Qt</a> scheint mir dabei einen Blick wert zu sein, weil Qt als Cross-Plattform-System von je her stärker als .NET mit Dingen wie unterschiedlichen System-Fonts und anders gezeichneten Controls konfrontiert war und damit klarkommen musste. Zudem kommen gerade jetzt zu den unterstützten Plattformen <i>S60</i> für Smartphones und <i>Maemo</i> für Nokias &#8222;Surf Tabletts&#8220; mit den erwähnten kleinen Auflösungen hinzu.</p>
<p>Ich habe erst begonnen, mich in Qt einzuarbeiten, um mich inspirieren zu lassen bei meiner Suche auf einer Lösung für dynamische Forms, aber etwas ist mir auf Anhieb ins Auge gestochen: die <i>Spacer Controls</i>, die man zwischen andere Controls setzen kann, die dort wie Federn wirken und die Controls soweit schieben, wie sie können:</p>
<div id="attachment_248" class="wp-caption aligncenter" style="width: 590px"><a href="http://megos.files.wordpress.com/2009/08/dynamicformsc.gif"><img src="http://megos.files.wordpress.com/2009/08/dynamicformsc.gif?w=580&#038;h=166" alt="Spacer Controls in Qt" title="DynamicFormsC" width="580" height="166" class="size-full wp-image-248" /></a><p class="wp-caption-text">Spacer Controls in Qt</p></div>
<p>Vielleicht bringt das gegenüber Docking plus Anchoring nur wenig mehr an grundsätzlich neuen Möglichkeiten, aber mir scheinen diese &#8222;Federn&#8220; und ihr Verhalten etwas zu sein, mit dem ich intuitiv sofort klarkomme &#8211; für mich eine Eigenschaft eines wirklich guten Ansatzes.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/megos.wordpress.com/231/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/megos.wordpress.com/231/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/megos.wordpress.com/231/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/megos.wordpress.com/231/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/megos.wordpress.com/231/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/megos.wordpress.com/231/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/megos.wordpress.com/231/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/megos.wordpress.com/231/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/megos.wordpress.com/231/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/megos.wordpress.com/231/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=megos.wordpress.com&blog=3283101&post=231&subd=megos&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://megos.wordpress.com/2009/08/29/dynamisch-forms/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d144980edde2f1b80ccd246210d9ce5f?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">megosbr</media:title>
		</media:content>

		<media:content url="http://megos.files.wordpress.com/2009/08/dynamicformsa.gif" medium="image">
			<media:title type="html">DynamicFormsA</media:title>
		</media:content>

		<media:content url="http://megos.files.wordpress.com/2009/08/dynamicformsb1.gif" medium="image">
			<media:title type="html">DynamicFormsB</media:title>
		</media:content>

		<media:content url="http://megos.files.wordpress.com/2009/08/dynamicformsc.gif" medium="image">
			<media:title type="html">DynamicFormsC</media:title>
		</media:content>
	</item>
		<item>
		<title>Einfache Directory History für die PowerShell</title>
		<link>http://megos.wordpress.com/2009/07/31/einfache-directory-history-fuer-die-powershell/</link>
		<comments>http://megos.wordpress.com/2009/07/31/einfache-directory-history-fuer-die-powershell/#comments</comments>
		<pubDate>Fri, 31 Jul 2009 13:07:35 +0000</pubDate>
		<dc:creator>René Brunner</dc:creator>
				<category><![CDATA[Keine Kategorie]]></category>
		<category><![CDATA[Powershell]]></category>

		<guid isPermaLink="false">http://megos.wordpress.com/?p=226</guid>
		<description><![CDATA[Als ich vor einiger Zeit begann, mit der PowerShell zu arbeiten, vermisste ich eine Directory History, also eine Liste mit den zuletzt besuchten Directories und darauf basierend dann eine einfache Möglichkeit, wieder in eine dieser Directories zurückzukehren. Wie man bei Microsoft im Kapitel Managing Current Location der PowerShell-Doku sieht, gibt es zwar einen Stack mit [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=megos.wordpress.com&blog=3283101&post=226&subd=megos&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Als ich vor einiger Zeit begann, mit der PowerShell zu arbeiten, vermisste ich eine Directory History, also eine Liste mit den zuletzt besuchten Directories und darauf basierend dann eine einfache Möglichkeit, wieder in eine dieser Directories zurückzukehren. Wie man bei Microsoft im Kapitel <a href="http://technet.microsoft.com/en-us/library/dd315262.aspx">Managing Current Location</a> der PowerShell-Doku sieht, gibt es zwar einen Stack mit Hilfe von <i>Push-Location</i> und <i>Pop-Location</i>, aber das ist weder automatisch noch besonders praktisch.</p>
<p>Per Google fand ich relativ schnell heraus, dass die <a href="http://www.codeplex.com/Pscx">PowerShell Community Extensions</a> unter vielen anderen Dingen einen <i>cd</i>-Befehl enthalten, der eine History führt, aber alleine deswegen diese Extensions zu installieren erschien mir als Overkill.</p>
<p>Da <i>cd</i> nur ein Alias ist, kann man diesen Alias relativ leicht ersetzen und das Führen einer Liste besuchter Directories anhängen, wie man es z.B. <a href="http://www.peterprovost.org/blog/post/My-Powershell-Profile-Script.aspx">hier</a> sieht. Aber das gefiel mir auch nicht besonders, denn ich wollte mir nicht Sorgen darüber machen müssen, ob die aktuelle Directory irgendwie an dieser neuen <i>cd</i>-Funktion vorbei wechseln kann, z.B. durch direkte Verwendung von <i>Set-Location</i> in einem Script, und die History dann &#8222;Löcher&#8220; bekommt.</p>
<p>Schliesslich hatte ich eine Idee, die zwar etwas hack-mässig ist, dafür aber einfach und zuverlässig funktioniert: Im <i>Profile</i>-Script gibt es eine Function <i>Prompt</i>, welche dazu da ist, wie der Name schon sagt, jeweils den Prompt am Anfang der Kommandozeile auszugeben. (Einige schöne Ideen, was man damit alles machen kann, findet man z.B. <a href="http://mshforfun.blogspot.com/2006/05/perfect-prompt-for-windows-powershell.html">hier</a>.) Aber wer sagt denn, dass man in diesem Script nur Ausgaben machen darf? Ebensogut kann man nebenbei beobachten, in welcher Directory man neuerdings gelandet ist, und so auf einfache Weise eine zuverlässige History führen!</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/megos.wordpress.com/226/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/megos.wordpress.com/226/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/megos.wordpress.com/226/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/megos.wordpress.com/226/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/megos.wordpress.com/226/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/megos.wordpress.com/226/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/megos.wordpress.com/226/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/megos.wordpress.com/226/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/megos.wordpress.com/226/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/megos.wordpress.com/226/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=megos.wordpress.com&blog=3283101&post=226&subd=megos&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://megos.wordpress.com/2009/07/31/einfache-directory-history-fuer-die-powershell/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d144980edde2f1b80ccd246210d9ce5f?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">megosbr</media:title>
		</media:content>
	</item>
		<item>
		<title>Der Historical Debugger in VS2010</title>
		<link>http://megos.wordpress.com/2009/06/27/der-historical-debugger-in-vs2010/</link>
		<comments>http://megos.wordpress.com/2009/06/27/der-historical-debugger-in-vs2010/#comments</comments>
		<pubDate>Sat, 27 Jun 2009 12:21:14 +0000</pubDate>
		<dc:creator>René Brunner</dc:creator>
				<category><![CDATA[Keine Kategorie]]></category>
		<category><![CDATA[Debugging]]></category>
		<category><![CDATA[Visual Studio]]></category>

		<guid isPermaLink="false">http://megos.wordpress.com/?p=219</guid>
		<description><![CDATA[Schon vor einiger Zeit hat Microsoft angekündigt, dass Visual Studio 2010 einen neuen, speziellen Debugger namens Historical Debugger enthalten wird. Man findet z.B. hier eine Ankündigung aus dem Oktober 2008:
Are you tired of constantly setting breakpoints to hone in on a pesky bug? How would you like to be able to step &#8222;back in time&#8220; [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=megos.wordpress.com&blog=3283101&post=219&subd=megos&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Schon vor einiger Zeit hat Microsoft angekündigt, dass Visual Studio 2010 einen neuen, speziellen Debugger namens <i>Historical Debugger</i> enthalten wird. Man findet z.B. <a href="http://channel9.msdn.com/posts/VisualStudio/Historical-Debugger-and-Test-Impact-Analysis-in-Visual-Studio-Team-System-2010/">hier</a> eine Ankündigung aus dem Oktober 2008:</p>
<blockquote><p>Are you tired of constantly setting breakpoints to hone in on a pesky bug? How would you like to be able to step &#8222;back in time&#8220; through your debugger? The Historical Debugger in Visual Studio Team System 2010 promises to revolutionize your debugging experience.</p></blockquote>
<p>Ich sagte mir, na das ist doch mal was Interessantes: Irgendwie rückwärts durch ein Programm debuggen? Weil ich für Revolutionen immer zu haben bin und als &#8222;Systemprogrammierer&#8220; einfach wissen muss, wie man einen Debugger implementiert, der so etwas leistet, bin ich der Sache heute auf den Grund gegangen und kann nun berichten, worum es geht.</p>
<p>Zunächst musste ich eine Hürde aus dem Weg räumen: Der Historical Debugger ist tatsächlich nur im Visual Studio Team System 2010 verfügbar, das &#8222;normale&#8220; Visual Studio ohne TS, das ich mir zuerst testweise installiert hatte, enthält ihn nicht. Man findet die VS2010-TS-Preview als ISO-Download <a href="http://www.microsoft.com/downloads/details.aspx?familyid=255FC5F1-15AF-4FE7-BE4D-263A2621144B&amp;displaylang=en">hier</a>.</p>
<p>Der Witz an der Sache ist der folgende: Der Historical Debugger schreibt selbständig zu bestimmten Zeitpunkten während der Programmausführung ein Log mit Informationen über den Zustand des Programms zum jeweiligen Zeitpunkt. Der angepriesene &#8222;Schritt zurück in der Zeit&#8220; besteht darin, nach einem Stopp des Programms aus der <i>Debug History</i>, d.h. der Liste der Zeitpunkte, einen Eintrag auszuwählen und sich im Debugger den Zustand des Programms anzuschauen, wie er damals war.</p>
<p>Das kann natürlich &#8211; im Prinzip &#8211; ganz nützlich sein: Hat man z.B. einen Breakpoint erreicht und stellt fest, dass eine Variable einen falschen Wert aufweist, muss man nun nicht mehr mit dem Debugging von vorne beginnen und sich vorsichtig an den Zeitpunkt heranpirschen, wo der falsche Wert zum ersten Mal auftaucht, sondern kann bequem und entspannt die Debug History verwenden, um den Zeitpunkt zu finden oder mindestens stark einzugrenzen, wo die Sache aus dem Ruder läuft.</p>
<p>Man kann in 2 Stufen wählen, wie die Zeitpunkte bestimmt werden sollen: Log schreiben entweder bei &#8222;wichtigen Systemereignissen&#8220; oder bei solchen Ereignissen plus bei jedem Methoden-Aufruf. Man kann hier erahnen, dass die Sache Potential hat auszuufern, denn Methoden-Aufrufe können ja sehr zahlreich sein.</p>
<p>Ins Log geschrieben werden der Call Stack zum Zeitpunkt und Variablen-Werte zum Zeitpunkt, wobei man bei Objekten nur noch das Resultat von <i>ToString</i> sieht, aber keinen Zugriff mehr bekommt auf die einzelnen Komponenten.</p>
<p>Ein paar Screenshots hierzu findet man im Blog <i>Dariusz quatscht</i> <a href="http://blogs.msdn.com/dparys/archive/2009/05/20/visual-studio-2010-historical-debugging.aspx">hier</a>.</p>
<p>Meiner Meinung nach ist das ganz hübsch, aber ob es für eine Revolution reicht, ist fraglich. Insbesondere die doch sehr eingeschränkte historische Sicht auf Variablen-Werte enttäuscht. Mir ist schon klar, dass es schlicht unmöglich ist, zu Hunderten von Zeitpunkten den gesamten Heap ins Log zu schreiben, damit ich auch nachträglich noch Objekte mit all ihren Details anschauen kann, aber hey, es hätte ja sein können, dass jemand mit Hilfe einer genialen Idee ein Log implementiert hat, das viele Details mit praktikablem Aufwand speichern kann, z.B. mit einer Heap-Differenzen-Methode&#8230;</p>
<p>Was haben andere so gemacht in Sachen Debugger mit Historie? <a href="http://www.lambdacs.com/debugger/">Hier</a> ist von einem experimentellen Java-Debugger die Rede, der vor ein paar Jahren implementiert wurde und der offenbar <b>alle</b> Variablen-Zuweisungen während eines Programmlaufs protokolliert, indem er sich in die Pseudocode-Ausführung der JVM einklinkt. Er nennt sich denn auch treffend <i>Omniscient Debugger</i> (&#8222;allwissender Debugger&#8220;) und erlaubt offenbar die volle Sicht zu einem beliebigen Zeitpunkt.</p>
<p>In einer <a href="http://www.lambdacs.com/debugger/AADEBUG_Mar_03.pdf">PDF-Datei</a>, welche den Debugger genauer beschreibt, findet sich die Information, dass <i>Apache Ant</i> etwa 24 Millionen Variablen-Zuweisungen macht, während das Tool seine eigene Kompilation steuert. Das sind eine ganze Menge, aber nicht so viele, dass sie den Ansatz an sich gleich zu Fall bringen.</p>
<p>VMWare hat etwas im Angebot, das die Firma <i>Replay Debugging</i> nennt, beschrieben auf der Website <a href="http://www.replaydebugging.com/">hier</a>. Unterstützt wird Debugging für C/C++, wie man im Artikel <a href="http://www.replaydebugging.com/2008/08/vmware-workstation-65-reverse-and.html">hier</a> nachlesen kann. Das ganze funktioniert mit Hilfe der Virtual Machine, wo man natürlich wie bei der JVM eine zentrale Stelle hat, wo man sich einklinken kann, um zu protokollieren, was läuft. Das Debugging, sprich der Blick auf das Log findet statt in einem Visual Studio, das um ein VMWare-Plugin ergänzt wurde.</p>
<p>Anhand der Beschreibung vermute ich, dass komplett protokolliert wird und man so in einzelnen Schritten vorwärts und sogar rückwärts durch das Programm gehen kann. Die Suche nach dem Punkt im Programm, wo eine Datenstruktur &#8222;zerstört&#8220; wird, finde man so: Zeitpunkt finden, wo sie falsch ist, dann Programm &#8222;rückwärts laufen lassen&#8220; mit Daten-Breakpoint auf der Struktur und einfach auf den Break durch Veränderung warten.</p>
<p>Hier meldet sich natürlich wieder meine Neugier, die mich veranlasst hat, überhaupt erst den Historical Debugger von Microsoft anzuschauen und die sich nun fragt: Wie macht VMWare das? Ich vermute, dass die komplette Abfolge aller CPU-Befehle, welche das Programm ausführte, der zentrale Bestandteil des Logs ist, und dass das &#8222;Debugging&#8220; darin besteht, mit Hilfe der Virtual Machine das Programm irgendwie entlang dieser Abfolge zu führen, vielleicht gestützt auf Komplett-Speicherabzüge in gewissen Zeitabständen.</p>
<p>Und ich vermute ebenfalls, dass die Sache derart auf die Ausführung direkter CPU-Anweisungen zentriert ist, dass die Ausdehnung des Prinzips auf C# mit seinem JIT-Compiler eine schwierige bis unmögliche Sache werden dürfte.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/megos.wordpress.com/219/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/megos.wordpress.com/219/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/megos.wordpress.com/219/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/megos.wordpress.com/219/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/megos.wordpress.com/219/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/megos.wordpress.com/219/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/megos.wordpress.com/219/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/megos.wordpress.com/219/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/megos.wordpress.com/219/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/megos.wordpress.com/219/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=megos.wordpress.com&blog=3283101&post=219&subd=megos&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://megos.wordpress.com/2009/06/27/der-historical-debugger-in-vs2010/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d144980edde2f1b80ccd246210d9ce5f?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">megosbr</media:title>
		</media:content>
	</item>
		<item>
		<title>Die Performance von C#-Programmen</title>
		<link>http://megos.wordpress.com/2009/06/06/die-performance-von-c-sharp-programmen/</link>
		<comments>http://megos.wordpress.com/2009/06/06/die-performance-von-c-sharp-programmen/#comments</comments>
		<pubDate>Sat, 06 Jun 2009 14:05:40 +0000</pubDate>
		<dc:creator>René Brunner</dc:creator>
				<category><![CDATA[Keine Kategorie]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Performance]]></category>

		<guid isPermaLink="false">http://megos.wordpress.com/?p=207</guid>
		<description><![CDATA[Die Programme der Megos sind heute im Prinzip sehr schnell, denn sie basieren auf C++-Code, arbeiten nicht exzessive mit dynamisch alloziertem Speicher und setzen direkt auf dem WIN32 API auf. Da stellt sich die Frage, wie es mit der Geschwindigkeit wohl aussehen wird, wenn wir dereinst diese Programme ablösen werden durch solche, die in C# [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=megos.wordpress.com&blog=3283101&post=207&subd=megos&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Die Programme der Megos sind heute im Prinzip sehr schnell, denn sie basieren auf C++-Code, arbeiten nicht exzessive mit dynamisch alloziertem Speicher und setzen direkt auf dem WIN32 API auf. Da stellt sich die Frage, wie es mit der Geschwindigkeit wohl aussehen wird, wenn wir dereinst diese Programme ablösen werden durch solche, die in C# geschrieben sind, wo schon der kleinste String ein volles Objekt ist und man in Form des .NET Frameworks eine ganze Menge Code zwischen sich und dem WIN32 API hat?</p>
<p>Um hier etwas Klarheit zu schaffen, habe ich mich heute erstmal schlau gemacht betreffend folgender vereinfachter Frage: Wenn man Code hat, der in etwa dasselbe tut, einmal in C++, und einmal in C#, ist dann der C#-Code per se langsamer, und wenn ja, um wieviel etwa?</p>
<p>Es hat sich herausgestellt, dass diese Frage nicht ganz einfach zu beantworten ist, denn Zeitmessungen haben so ihre Tücken. Ich habe z.B. in einem Forum <a href="http://social.msdn.microsoft.com/Forums/en-US/csharplanguage/thread/0990061a-0618-495f-81da-48badf4db2fb">Postings</a> von jemandem gelesen, der versucht hat, die relative Geschwindigkeit dieser beiden Programmiersprachen (bzw. deren Implementationen auf Windows, wie sie heute sind) mit Hilfe kleiner Schleifen zu vergleichen, und zurückmeldete, die C++-Version sei 28000 Mal so schnell wie die C#-Version. Was war passiert? Der C++-Compiler war so schlau zu erkennen, dass eine zeitfressende Anweisung innerhalb der Schleife von der Schleife unabhängig war und hat sie als Optimierung aus der Schleife herausgenommen&#8230;</p>
<p>C#-Source-Code wird vom C#-Compiler übersetzt zu <i>CIL</i> (<i>Common Intermediate Language</i>), früher auch <i>MSIL</i> (<i>Microsoft Intermediate Language</i>) genannt, einem prozessorunabhängigen Bytecode, wie man z.B. in der Wikipedia <a href="http://en.wikipedia.org/wiki/Common_Intermediate_Language">hier</a> nachlesen kann. Dieser wird dann üblicherweise bei der ersten Ausführung des Codes per <i>JIT</i> (<i>Just in Time</i>) Compiler quasi &#8222;fliegend&#8220; in direkte Prozessoranweisungen übersetzt und so schliesslich ausgeführt. Ob diese Übersetzung flüchtig ist oder dauerhaft abgespeichert wird, so dass später bei einer erneuten Programmausführung der Übersetzungsschritt gespart werden kann, hängt von verschiedenen Faktoren ab.</p>
<p>Kann es hier unter Umständen Geschwindigkeitsprobleme geben? Interpretiert man Bytecode statt direkt Prozessoranweisungen auszuführen, ist das schliesslich zwangsweise um einige Faktoren langsamer. Hatte nicht Java, das ebenfalls auf einem Bytecode basiert, vor Jahren zum Teil arge Geschwindigkeitsprobleme, bevor die HotSpot-JVM mit einem JIT-Compiler eingeführt wurde? Bei meinen Abklärungen heute erlebte ich diesbezüglich eine kleine Überraschung: Die Microsoft CLR scheint gar keinen Interpreter für CIL zu beinhalten, es wird nie interpretiert, sondern vor der Ausführung immer alles JIT-compiliert! (Details hierzu z.B. <a href="http://stackoverflow.com/questions/452788/does-a-program-that-is-written-with-the-microsoft-net-framework-compile-execute/452793">hier</a>.) Also kann es hier keinen prinzipiellen Geschwindigkeitsverlust geben.</p>
<p>Das heisst nicht, dass keine CIL-Interpreter existieren: <a href="http://www.mono-project.com/">Mono</a> hat zumindest in der Anfangsphase mit einem Interpreter gearbeitet, bevor ein JIT-Compiler zur Verfügung stand, und es gibt Dinge wie <a href="http://dotnetanywhere.org/">Dot Net Anywhere</a>, einem CIL-Interpreter für Kleinstcomputer. Aber zumindest auf Windows lauert kein solcher und wartet auf Gelegenheiten, Performance zu vernichten.</p>
<p>Geschwindigkeitsunterschiede können sich auch durch Laufzeitprüfungen ergeben: C# überwacht normalerweise jeden einzelnen Array-Zugriff auf einen gültigen Index, während C++ das normalerweise nicht tut. In einem kleinen, synthetischen Testprogramm mit einer Schleife um Array-Zugriffe herum können sich hier schon einmal signifikante Unterschiede ergeben, aber ehrlich, in welchem Programm aus dem richtigen Leben wird schon so ein grosser Teil der Rechenzeit verbracht, und wer wollte allen Ernstes heute noch auf Laufzeitprüfungen verzichten?</p>
<p>Interessanterweise gibt es auch in C# Ansätze für Optimierungen, wenn man denn einmal ein Programmstück hat, das von Array-Zugriffen absolut dominiert wird. Im bereits erwähnten <a href="http://social.msdn.microsoft.com/Forums/en-US/csharplanguage/thread/0990061a-0618-495f-81da-48badf4db2fb">Thread</a> finden sich folgende informative Code-Schnippsel:</p>
<p>Code A:</p>
<pre class="brush: csharp;">
int[] arry = new int[20000];
for (int index = 0; index &lt; 20000; ++index) {
  total += arry[index];
}
</pre>
<p>Code B:</p>
<pre class="brush: csharp;">
int[] arry = new int[20000];
for (int index = 0; index &lt; arry.Length; ++index) {
   total += arry[index];
}
</pre>
<p>Code C:</p>
<pre class="brush: csharp;">
int[] arry = new int[20000];
foreach (int element in arry) {
  total += element;
}
</pre>
<p>Code B sei 20% schneller als Code A, weil durch die Verwendung von <i>arry.Length</i> der Compiler mitbekommt, dass er auf Bereichsprüfungen verzichten darf (wozu er wohl im Beispiel A nicht schlau genug ist), und Code C sei sogar 50% schneller als Code A, weil es offenbar <i>foreach</i> schafft, einen internen Index schneller durchzuzählen als das ein Programm explizit kann, und weil natürlich ebenfalls Bereichsprüfungen wegfallen.</p>
<p>Solche Tipps und noch viele mehr findet man offenbar in einem schlauen Buch namens <a href="http://www.amazon.com/Effective-Specific-Improve-Software-Development/dp/0321245660/">Effective C#</a>. Microsofts C# Programming Guide hat ebenfalls Informationen über Optimierungen, zu finden <a href="http://msdn.microsoft.com/en-us/library/ms173196.aspx">hier</a>, und generelle Informationen darüber, was in Managed Code wie teuer ist, <a href="http://msdn.microsoft.com/en-us/library/ms973852.aspx">hier</a>. Und wer einmal ganz tief in die CLR und ihre Objekt-Verwaltung hineinschauen möchte, um Ansätze für Optimierungen zu finden, kann das mit Hilfe der Informationen <a href="http://msdn.microsoft.com/en-us/magazine/cc163791.aspx">hier</a> tun.</p>
<p>Zusammenfassend kann ich sagen, nirgends Hinweise darauf gefunden zu haben, dass man sich schon alleine durch die Verwendung von C# als Sprache generelle Performance-Probleme einhandelt, weil C# eben &#8222;langsam&#8220; ist. Schätzungen, die ich angetroffen habe, gehen davon aus, dass im allgemeinen C#-Code 80% bis 90% der Performance von C++-Code erreicht. Das dürfte zu verkraften sein!</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/megos.wordpress.com/207/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/megos.wordpress.com/207/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/megos.wordpress.com/207/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/megos.wordpress.com/207/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/megos.wordpress.com/207/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/megos.wordpress.com/207/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/megos.wordpress.com/207/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/megos.wordpress.com/207/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/megos.wordpress.com/207/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/megos.wordpress.com/207/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=megos.wordpress.com&blog=3283101&post=207&subd=megos&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://megos.wordpress.com/2009/06/06/die-performance-von-c-sharp-programmen/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d144980edde2f1b80ccd246210d9ce5f?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">megosbr</media:title>
		</media:content>
	</item>
		<item>
		<title>Ein etwas nostalgischer Blick zurück</title>
		<link>http://megos.wordpress.com/2009/05/02/ein-etwas-nostalgischer-blick-zurueck/</link>
		<comments>http://megos.wordpress.com/2009/05/02/ein-etwas-nostalgischer-blick-zurueck/#comments</comments>
		<pubDate>Sat, 02 May 2009 12:50:13 +0000</pubDate>
		<dc:creator>René Brunner</dc:creator>
				<category><![CDATA[Keine Kategorie]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[VB6]]></category>
		<category><![CDATA[Visual Studio]]></category>

		<guid isPermaLink="false">http://megos.wordpress.com/?p=201</guid>
		<description><![CDATA[Als ich vor einiger Zeit ernsthaft mit Visual Studio und .NET/C# zu arbeiten begann, verglich ich diese Programmierumgebung ganz automatisch mit dem vor über 10 Jahren erschienenen VB6, mit dem ich vor allem durch eine privat damit gebaute Shareware sehr gut vertraut war.
Bei diesen beiden Systemen sind nur wenige Dinge exakt gleich, schon alleine wegen [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=megos.wordpress.com&blog=3283101&post=201&subd=megos&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Als ich vor einiger Zeit ernsthaft mit Visual Studio und .NET/C# zu arbeiten begann, verglich ich diese Programmierumgebung ganz automatisch mit dem vor über 10 Jahren erschienenen <a href="http://en.wikipedia.org/wiki/Visual_Basic">VB6</a>, mit dem ich vor allem durch eine privat damit gebaute Shareware sehr gut vertraut war.</p>
<p>Bei diesen beiden Systemen sind nur wenige Dinge exakt gleich, schon alleine wegen C# anstelle von BASIC als Sprache. Aber trotzdem hatte ich immer das Gefühl einer grossen Vertrautheit, den Eindruck einer weitgehenden Übereinstimmung bezüglich der grundlegenden Philosophie: Überall sah ich quasi den &#8222;Geist&#8220; von VB6 durchschimmern.</p>
<p>Was mich aber noch viel mehr beeindruckte, und auch immer stärker, je genauer ich Visual Studio und .NET kennenlernte, war die folgende Geschichte: Im Gegensatz zum Nachfolger ist VB6 geradezu ein Winzling, weist aber trotz seiner bescheidenen Grösse (und trotz seines Alters) eine erstaunliche Menge der wichtigsten technologischen &#8222;Errungenschaften&#8220; bereits auf.</p>
<p>Dinge wie Garbage Collection, IntelliSense im Editor, grafischer Form-Designer, hervorragendes Laufzeit-Debugging inklusive Watches und Immediate-Fenster, Code-Änderungen während das Programm läuft, mächtige String-Klasse, Kompilieren zu Native Code, Klassen inklusive Late Binding beim Aufruf von Objekt-Methoden, alles schon drin in diesem System von 1998, in einem Laufzeitsystem von nicht mal 3 MB und einer IDE von absolut lächerlichen 15 MB.</p>
<p>Natürlich könnte ich problemlos eine noch längere Liste von Eigenschaften aufzählen, die VB6 nicht hatte, ohne die man aber im Jahre 2009 zum Entwickeln von Software gar nicht anzutreten braucht.</p>
<p>Es geht mir um etwas Anderes: Der Vergleich VB6 versus Visual Studio 2010, C# und .NET 3.5 ist für mich mittlerweile eines der besten Beispiele, die ich persönlich kenne, um die <a href="http://de.wikipedia.org/wiki/Paretoprinzip">80%/20%-Regel</a> zu illustrieren: Ja, das moderne System kann mehr als das gute alte VB6, aber man sehe sich mal an, wieviele der wirklich wichtigen, zentralen Eigenschaften VB6 bereits aufweist (die &#8222;80%&#8220; in besagter Regel), erreicht mit vergleichsweise bescheidenem Aufwand (den &#8222;20%&#8220;). Oder umgekehrt: Ja, das moderne System ist überlegen, aber man sehe sich mal an, mit welch gigantischen Aufwand gewisse Verbesserungen erkauft werden mussten.</p>
<p>Natürlich kann ich als reiner Anwender von Visual Studio und .NET das Resultat geniessen, denn Microsoft trieb ja quasi für mich den grossen Aufwand, nicht ich. Und einen modernen Rechner bringen auch grosse IDEs und Laufzeitsysteme nicht ins Schwitzen.</p>
<p>Aber wenn ich selber etwas baue, tue ich gut daran, immer mal wieder an die 80%/20%-Regel zu denken und diese zu beherzigen. Mir persönlich fällt das nicht schwer, mit einem etwas nostalgischen Blick zurück zu VB6 dann und wann, zu dem ich z.B. Gelegenheit habe, wenn mein PC die Visual-Studio-IDE mit viel Festplatten-Aktivität in den Speicher wuchtet und diese riesige Maschine anwirft&#8230;</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/megos.wordpress.com/201/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/megos.wordpress.com/201/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/megos.wordpress.com/201/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/megos.wordpress.com/201/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/megos.wordpress.com/201/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/megos.wordpress.com/201/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/megos.wordpress.com/201/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/megos.wordpress.com/201/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/megos.wordpress.com/201/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/megos.wordpress.com/201/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=megos.wordpress.com&blog=3283101&post=201&subd=megos&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://megos.wordpress.com/2009/05/02/ein-etwas-nostalgischer-blick-zurueck/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d144980edde2f1b80ccd246210d9ce5f?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">megosbr</media:title>
		</media:content>
	</item>
		<item>
		<title>Und wieder mal TechDays</title>
		<link>http://megos.wordpress.com/2009/04/18/und-wieder-mal-techdays/</link>
		<comments>http://megos.wordpress.com/2009/04/18/und-wieder-mal-techdays/#comments</comments>
		<pubDate>Sat, 18 Apr 2009 08:48:08 +0000</pubDate>
		<dc:creator>René Brunner</dc:creator>
				<category><![CDATA[Keine Kategorie]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[TechDays]]></category>
		<category><![CDATA[WPF]]></category>

		<guid isPermaLink="false">http://megos.wordpress.com/?p=194</guid>
		<description><![CDATA[Etwas über ein Jahr ist es her, seit ich mit einem Eintrag über die Microsoft TechDays 2008 diesen Blog eröffnen durfte. Letzte Woche war ich nun an den TechDays 2009, dieses Mal im Kursaal in Bern.
Es war eine gut besuchte, professionell durchgeführte und solide Veranstaltung. Wie schon letztes Jahr waren es für mich gut investierte [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=megos.wordpress.com&blog=3283101&post=194&subd=megos&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Etwas über ein Jahr ist es her, seit ich mit einem <a href="http://megos.wordpress.com/2008/03/31/wir-sind-jetzt-helden/">Eintrag</a> über die Microsoft TechDays 2008 diesen Blog eröffnen durfte. Letzte Woche war ich nun an den TechDays 2009, dieses Mal im Kursaal in Bern.</p>
<p>Es war eine gut besuchte, professionell durchgeführte und solide Veranstaltung. Wie schon letztes Jahr waren es für mich gut investierte 2 Tage, um zu erspüren, wo die Reise hingeht mit Microsoft und den Technologien dieser Firma.</p>
<p>Die für die Megos vielleicht wichtigste Information, die ich mitgenommen habe: WPF ist jetzt einsatzfähig. Dies wurde klar anhand der Preisverleihung für den <i>.NET Swiss Innovation Award</i>, wo eine WPF- und 2 Silverlight-Applikationen prämiert worden sind &#8211; alle 3 nicht-triviale, real existierende Applikationen, offenbar reif für den produktiven Einsatz. (Ein paar Details zum Award und den Gewinnern findet man in einem Infoweek-Artikle <a href="http://www.infoweek.ch/software/entwicklungprogrammiersprachen/articles/182233">hier</a>.) Auch der Stand von WPF plus entsprechender Tools ist mittlerweile um Längen besser als noch vor zwei Jahren oder so, wo Microsoft vorschlug, WPF-Applikationen ohne ein DataGrid-Control und ohne IntelliSense für XAML zu entwickeln&#8230;</p>
<p>Eine weitere interessante, in einem gut gemachten Vortrag präsentierte Sache sind die <i>Parallel Extensions</i>, mit deren Hilfe man für seine Programme unter .NET 4.0 auf relativ einfache Weise mehrere Cores bzw. Prozessoren wird nutzen können. Zunächst schien mir die Sache etwas überspitzt formuliert ein wenig paradox: Da baut man in der Form des .NET-Frameworks zuerst erst ein System, das mit seinem Pseudocode-basierten Ansatz, Garbage Collecting, aufwendigen Laufzeit-Informationen für Reflection usw. ziemlich gut geeignet ist, um Prozessorleistung abzufackeln, und dann geht man hin und baut eine Erweiterung, um das sogar noch mit mehr als einem Core gleichzeitig zu tun.</p>
<p>Aber es macht schon einen gewissen Sinn: Dank JIT-Compilierung und mächtigen Prozessoren spielt der .NET-Overhead mit der Zeit eine immer kleinere Rolle, aber wie man die laufend grösser werdende Zahl an Cores einfach und sinnvoll nutzen kann, wird wohl eine der grossen Fragen der Zukunft sein, und zwar eine, die sich als ziemlich harte Nuss erweisen dürfte.</p>
<p>Zudem sieht man, dass es auch klare Vorteile hat, sich mit dem .NET Framework auf einer relativ hohen Abstraktions-Ebene bewegen zu können: Microsoft hat es in der Hand, seine .NET-Sprachen geeignet um neue Sprachkonstrukte für paralleles Programmieren zu erweitern, und das .NET Framework ist ein geeignetes System, um möglichst viele der &#8222;schmutzigen&#8220; Details vom Entwickler fernzuhalten und gewissermassen &#8222;hinter den Kulissen zu verstecken&#8220;.</p>
<p>Mehr zu diesem Thema find man auf der MSDN-Website <a href="http://msdn.microsoft.com/en-us/concurrency/default.aspx">hier</a>.</p>
<p>Wie letztes Jahr besuchte ich mit grossem Genuss zwei Vorträge von Sascha P. Corti. Microsoft Schweiz soll gut Acht geben auf diesen Mann, den sollten sie unbedingt behalten.</p>
<p>Der für mich ganz persönlich absurdeste Moment dieser TechDays war, als stolz die <i>Out of Browser</i> genannte neue Fähigkeit der kommenden Version 3 von Silverlight präsentiert wurde: Damit ist es möglich, entsprechend vorbereitete Silverlight-3-Applikationen lokal zu installieren und dann komplett ausserhalb des Browsers laufen zu lassen. (Technische Details findet man z.B. <a href="http://blogs.msdn.com/pstubbs/archive/2009/04/07/silverlight-3-what-s-new-with-out-of-browser.aspx">hier</a>).</p>
<p>Ohne Zweifel technisch gesehen eine beeindruckende Leistung, an der die Jungs und Mädels in Redmond wohl hart gearbeitet haben, um sie zu vollbringen. Aber warum fand ich das in gewisser Weise absurd? Lassen Sie es mich mit den Worten eines hypothetischen, fanatischen Web-2.0-Fans einmal so formulieren: &#8222;Wow! Ich dachte immer, man braucht einen Browser, um Applikationen laufen zu lassen. Jetzt geht das ja sogar ohne Browser!&#8220;. Ja, ja, wer hätte das gedacht, Applikationen, die lokal auf einem PC laufen.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/megos.wordpress.com/194/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/megos.wordpress.com/194/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/megos.wordpress.com/194/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/megos.wordpress.com/194/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/megos.wordpress.com/194/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/megos.wordpress.com/194/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/megos.wordpress.com/194/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/megos.wordpress.com/194/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/megos.wordpress.com/194/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/megos.wordpress.com/194/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=megos.wordpress.com&blog=3283101&post=194&subd=megos&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://megos.wordpress.com/2009/04/18/und-wieder-mal-techdays/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d144980edde2f1b80ccd246210d9ce5f?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">megosbr</media:title>
		</media:content>
	</item>
		<item>
		<title>Die Geschichte vom Backslash</title>
		<link>http://megos.wordpress.com/2009/03/10/die-geschichte-vom-backslash/</link>
		<comments>http://megos.wordpress.com/2009/03/10/die-geschichte-vom-backslash/#comments</comments>
		<pubDate>Tue, 10 Mar 2009 10:44:48 +0000</pubDate>
		<dc:creator>René Brunner</dc:creator>
				<category><![CDATA[Keine Kategorie]]></category>
		<category><![CDATA[Powershell]]></category>

		<guid isPermaLink="false">http://megos.wordpress.com/?p=187</guid>
		<description><![CDATA[Ich arbeite nun schon eine ganze Weile mit der Powershell in der 2.0 CTP Version. Ich bin ganz zufrieden damit und kann eigentlich jedem nur empfehlen, sie einmal auszuprobieren.
Lustig ist, was mir mittlerweile am besten daran gefällt und worauf ich nicht mehr verzichten möchte: Die Powershell erlaubt es mir, in Filenamen den normalen Slash &#8222;/&#8220; [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=megos.wordpress.com&blog=3283101&post=187&subd=megos&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Ich arbeite nun schon eine ganze Weile mit der <a href="http://www.microsoft.com/windowsserver2003/technologies/management/powershell/default.mspx">Powershell</a> in der 2.0 CTP Version. Ich bin ganz zufrieden damit und kann eigentlich jedem nur empfehlen, sie einmal auszuprobieren.</p>
<p>Lustig ist, was mir mittlerweile am besten daran gefällt und worauf ich nicht mehr verzichten möchte: Die Powershell erlaubt es mir, in Filenamen den normalen Slash &#8222;/&#8220; anstelle des Backslash &#8222;\&#8220; zu verwenden.</p>
<p>Hinter dem Backslash als Trennzeichen in Dateinamen in Windows steckt eine ganz interessante Geschichte, die ich hier erwähnen möchte für Leute, die sie noch nicht kennen, auch wenn sie wenig mit .NET zu tun hat:</p>
<p>DOS 1.0 war eigentlich ein von Microsoft eingekauftes Betriebssystem namens QDOS, das in vielen Aspekten grosse Ähnlichkeit hatte mit CP/M. CP/M war ein Betriebssystem, das nur Laufwerksbuchstaben und Dateinamen, aber keine Ordner bzw. Subdirectories kannte. Für die Schalter bzw. Switches seiner Tools verwendete es den normalen Slash &#8222;/&#8220; als Einleitungszeichen &#8211; eine Konvention, welche DOS 1.0 übernahm.</p>
<p>Als dann DOS 2.0 eine anständige hierarchische Dateiverwaltung bekommen sollte, war die von UNIX her naheliegende Verwendung von &#8222;/&#8220; für die Dateinamen durch eben diese Verwendung für Schalter gewissermassen blockiert, worauf Microsoft auf das Nächstbeste d.h. auf den Backslash auswich.</p>
<p>Rückblickend kann man wohl sagen, dass Microsoft damals in den sauren Apfel hätte beissen und trotzdem den Slash verwenden sollen, auch wenn dies bedeutet hätte, eine Menge eigener und fremder Kommandozeilen-basierter Programme anpassen zu müssen.</p>
<p>Es gibt bei der Geschichte vom Backslash jede Menge Details, wie etwa das folgende: Die Microsoft-Programmierer selbst waren durch die Verwendung von XENIX, der damaligen Microsoft&#8217;schen UNIX-Variante, bereits an den Slash gewohnt und fanden den Backslash gar nicht lustig. Sie programmierten deshalb eine &#8222;geheime&#8220; Option namens <i>SWITCHAR</i> für die <i>CONFIG.SYS</i>, mit der man das Zeichen für Schalter auf ein anderes Zeichen als &#8222;/&#8220; umdefinieren konnte, wonach der normale Slash in Dateinamen zulässig wurde.</p>
<p>(Ich bin schon so lange im Geschäft, dass ich diese Option selbst noch verwendet habe, auf einem <a href="http://pages.total.net/~hrothgar/museum/WangPC002/">WANG PC</a>; ich frage mich jetzt nur, wie ich eigentlich davon erfahren hatte damals&#8230;)</p>
<p>Eine ausführliche Version der Geschichte findet man <a href="http://blogs.msdn.com/larryosterman/archive/2005/06/24/432386.aspx">hier</a>, die Geschichte des Zeichens &#8222;\&#8220; selbst <a href="http://en.wikipedia.org/wiki/Backslash">hier</a>.</p>
<p>Windows akzeptiert übrigens in Filenamen bis heute sowohl Backslash wie auch Slash, auch wenn es bei Aufbereitungen und Abfragen von Dateinamen konsequent auf Backslash wandelt. Folgende .NET/C#-Zeile ist vollkommen ok und funktioniert:</p>
<pre class="brush: csharp;">
      FileInfo f = new FileInfo(&quot;C:/Work/Backslash/Program.cs&quot;);
</pre>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/megos.wordpress.com/187/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/megos.wordpress.com/187/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/megos.wordpress.com/187/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/megos.wordpress.com/187/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/megos.wordpress.com/187/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/megos.wordpress.com/187/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/megos.wordpress.com/187/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/megos.wordpress.com/187/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/megos.wordpress.com/187/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/megos.wordpress.com/187/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=megos.wordpress.com&blog=3283101&post=187&subd=megos&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://megos.wordpress.com/2009/03/10/die-geschichte-vom-backslash/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d144980edde2f1b80ccd246210d9ce5f?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">megosbr</media:title>
		</media:content>
	</item>
		<item>
		<title>IntelliSense und Erweiterungen von Klassen</title>
		<link>http://megos.wordpress.com/2009/01/31/intellisense-und-erweiterungen-von-klassen/</link>
		<comments>http://megos.wordpress.com/2009/01/31/intellisense-und-erweiterungen-von-klassen/#comments</comments>
		<pubDate>Sat, 31 Jan 2009 13:44:18 +0000</pubDate>
		<dc:creator>René Brunner</dc:creator>
				<category><![CDATA[Keine Kategorie]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Visual Studio]]></category>

		<guid isPermaLink="false">http://megos.wordpress.com/?p=177</guid>
		<description><![CDATA[IntelliSense in Visual Studio ist eine wunderbare Sache, die das Programmieren ungemein erleichtert. Eigentlich sollte heutzutage niemand mehr in einer Umgebung programmieren müssen, wo kein in etwa gleichwertiges Feature zur Verfügung steht. Trotzdem sahen wir ein ernstzunehmendes Problem damit, als wir hier in der Megos ernsthaft damit begannen, unsere neues Programmierwerkzeug Triton in C# zu [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=megos.wordpress.com&blog=3283101&post=177&subd=megos&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><i>IntelliSense</i> in Visual Studio ist eine wunderbare Sache, die das Programmieren ungemein erleichtert. Eigentlich sollte heutzutage niemand mehr in einer Umgebung programmieren müssen, wo kein in etwa gleichwertiges Feature zur Verfügung steht. Trotzdem sahen wir ein ernstzunehmendes Problem damit, als wir hier in der Megos ernsthaft damit begannen, unsere neues Programmierwerkzeug <i>Triton</i> in C# zu implementieren.</p>
<p>IntelliSense scheint seine Listen immer stur alphabetisch zu sortieren und immer alles aufzulisten, ohne Filtermöglichkeiten. Das kann dan zu einem Problem werden, wenn man Klassen erweitert, die bereits eine Menge Members haben, und dann in der IntelliSense-Liste seine &#8222;eigenen&#8220; Members (d.h. diejenigen der Erweiterung) kaum mehr findet. Je nach Art der Klassen benötigt man beim Implementieren bevorzugt eben diese eigenen Members, was das Ganze dann etwas mühsam macht.</p>
<p>Unsere Überlegungen zeigten uns, dass sich die Sache zuspitzt, wenn man Klassen für den Datenbank-Zugriff generiert, wo für jede Kolonne in einer Tabelle eine Property definiert wird, die sich dann zu all den Members der Zugriffs-Basisklasse gesellt und unter diesen irgendwie unterzugehen droht, obwohl sie doch zum eigentlichen &#8222;Witz&#8220; der generierten Klasse gehört.</p>
<p>Man kann das bereits bei Visual-Studio-eigenen <i>typed datasets</i> beobachten: Eine Tabellen-Zugriffs-Klasse wird von <i>System.Data.TypedTableBase</i> abgeleitet, einer Klasse mit geschätzten etwa 100 Members. Eine Kolonne <i>TitelKurs</i> wird zu einer Property namens <i>TitelKursColumn</i> und wird von IntelliSense unter <i>T</i> eingeordnet; eine Kolonne <i>WährungsKurs</i> wird zu <i>WährungsKursColumn</i> und taucht dann in der Liste unter <i>W</i> und damit an einem ganz anderen Ort auf. Dieses Verhalten verunmöglicht es praktisch, sich per IntelliSense einen schnellen Überblick über alle Kolonnen zu verschaffen &#8211; aber wo ausser da soll denn dieser Überblick herkommen?</p>
<p>Es war schnell klar, dass es bei Visual Studio und IntelliSense, so wie jetzt implementiert, nur ein einziges &#8222;Rädchen&#8220; gibt, an dem man überhaupt drehen kann, wenn man dieses Problem irgendwie lösen will: Will man Members zusammen sehen in einer IntelliSense-Liste, so müssen sie eben entsprechend heissen, d.h. alle mit irgendeinem Präfix beginnen.</p>
<p>Sie werden als geneigter Leser vielleicht schon ahnen, dass dieser Blog-Eintrag hier geradewegs auf ein Dilemma zumarschiert: Von Namenspräfixen wird in .NET und C# eigentlich abgeraten; verwendet man sie trotzdem, stecken einen gewisse Leute schnell einmal in die Schublade &#8222;Ewiggestrige&#8220;, die reserviert ist für Leute, die von ihren alten Gewohnheiten nicht lassen können und auch nicht verstanden haben, dass man heutzutage nur noch &#8222;natürliche&#8220; Namen vergibt, weil man &#8211; eben gerade durch Features moderner IDEs wie z.B. IntelliSense &#8211; nicht mehr darauf angewiesen ist, vom Namen eines Dings irgendwelche Meta-Information ablesen zu können.</p>
<p>Aber wie gesagt, hier geht es nicht darum, sondern um eine Lösung für ein kleines, aber sehr lästiges Problem mit IntelliSense.</p>
<p>Wir sahen das Ganze als Wahl zwischen zwei Übeln: 1) einen Teil der Namen mit Hilfe von Präfixen verunstalten, aber damit den Nutzen von IntelliSense aufwerten, oder 2) den Empfehlungen und der Mehrheit der C#-Programmierer folgen, aber sich mit Situationen abfinden, in denen IntelliSense wenig hilft, obwohl es gerade da sehr nützlich wäre.</p>
<p>Nach einigem Hin und Her entschieden wir uns für das Übel 1). Wir wählten z.B. für die Properties unserer eigenen Klassen in Triton den Einbuchstaben-Präfix <b>z</b>, weil eine Abklärung ergab, dass nur wenige .NET-Klassen bereits Properties haben, mit mit Z beginnen, und damit diese Properties nicht nur zusammen angezeigt werden in einer IntelliSense-Liste, sondern auch noch herausstechen.</p>
<p>Seit dieser Entscheidung haben wir eine rechte Menge Code gemäss diesen Präfix-Konventionen erzeugt, und es ist eine erste Beurteilung des Erreichten möglich. Der gewünschte Effekt bei IntelliSense hat sich eingestellt: Man behält so tatsächlich ohne Probleme den Überblick über die eigenen Dinge im Gegensatz zu den &#8222;fremden&#8220; Dingen des Frameworks. Aber hübsch sieht es irgendwie nicht aus, und eine richtige Gewöhnung an unsere mit Präfixen dekorierten Namen will sich eigentlich auch nicht einstellen.</p>
<p>Für jemanden, der sich im .NET-Framework wirklich gut auskennt, gäbe es vielleicht eine Wahlmöglichkeit 3), welche das Dilemma umgeht: ein Add-In programmieren, welches neben der IntelliSense-Liste eine zweite, entsprechend eingeschränkte Liste implementiert. Aber ganz soweit sind wir in der Megos noch nicht&#8230;</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/megos.wordpress.com/177/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/megos.wordpress.com/177/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/megos.wordpress.com/177/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/megos.wordpress.com/177/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/megos.wordpress.com/177/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/megos.wordpress.com/177/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/megos.wordpress.com/177/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/megos.wordpress.com/177/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/megos.wordpress.com/177/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/megos.wordpress.com/177/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=megos.wordpress.com&blog=3283101&post=177&subd=megos&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://megos.wordpress.com/2009/01/31/intellisense-und-erweiterungen-von-klassen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d144980edde2f1b80ccd246210d9ce5f?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">megosbr</media:title>
		</media:content>
	</item>
	</channel>
</rss>